博客
关于我
成员内部类、局部内部类、匿名内部类_hehe.base.11.3_over
阅读量:393 次
发布时间:2019-03-05

本文共 3451 字,大约阅读时间需要 11 分钟。

11.6 内部类的概念与分类

  • 分类:
    成员内部类
    局部内部类(包含匿名内部类
  • 成员内部类的定义格式:
修饰符 class 外部类名称 {    修饰符 class 内部类名称{    }}
package com.xww.day11.demo02;public class Body {    public class Heart{        //内部类的方法        public void beat(){            System.out.println("内部类方法");            System.out.println(name);//内部类使用外部类成员变量            method();//内部类使用外部类成员方法        }    }    //外部类成员变量    private String name;    //外部类方法    public void method(){        System.out.println("外部类方法");        new Heart().beat();//外部类使用内部类方法    }}

11.7 成员内部类的使用

  • 间接方式:在外部类的方法中,使用内部类,然后main只是调用外部类的方法
  • 直接方式外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称();
public static void main(String[] args) {        Body body = new Body();//定义外部类对象        body.method();//通过外部类对象,调用外部类的方法,里面间接使用内部类Heart        Body.Heart heart = new Body().new Heart();//定义内部类对象        heart.beat();    }

11.8 内部类的同名变量访问

  • 重名下内部类调用外部类成员变量格式外部类名称.this.外部类成员变量
public class Out {    int num = 10;//外部类成员变量    public class inner{        int num = 20;//内部类成员变量        public void method(){            int num = 30;//内部类局部变量            System.out.println(num);//30,局部            System.out.println(this.num);//20,内部            System.out.println(Out.this.num);//10,外部        }    }}

11.9 局部内部类定义

  • 定义:定一在方法内部的类
  • 局部:只有当前所属的方法才能使用它,出了这个方法,就不能使用
  • 格式
修饰符 class 外部类名称 { 	修饰符 返回值类型 外部类方法名(参数) {		class 局部内部类名称 {			//其他代码		}	}}
  • 定义一个类的时候,权限修饰符规则
    外部类:public/(default)
    成员内部类:public/protected/(default)/private
    局部内部类:什么都不写
public class Outer {    public void method(){        class Iner{            public void methodIner(){                System.out.println("局部内部类方法");            }        }        Iner iner = new Iner();//局部方法中定义局部类对象        iner.methodIner();//局部方法中调用局部类方法    }}

11.10 局部内部类的 final 问题

  • 局部内部类,如果希望访问所在方法的局部变量,那么这个局部变量必须final
  • 备注:从Java 8+开始,只要局部变量事实不变,那么final关键字可以省略。
  • 原因
    new出来的对象在堆内存当中。
    局部变量是跟着方法走的,在栈内存当中。
    方法运行结束之后,立刻出栈,局部变量就会立刻消失。
    但是new出来的对象会在堆当中持续存在,直到垃圾回收消失。
public class MyOuter {    public void methodOuter() {       final int num = 10; // 所在方法的局部变量        class MyInner {            public void methodInner() {                System.out.println(num);            }        }    }}

11.11 匿名内部类

  • 如果接口的实现类(或者是父类的子类)只需要使用唯一的一次,那么这种情况就可以省略掉该类的定义,改为使用匿名内部类
  • 格式:
接口名称 对象名 = new 接口名称() {	//覆盖重写所有抽象方法;        };
package com.xww.day11.demo02;public class Demo02N {    public static void main(String[] args) {        //使用匿名内部类        MyInterface obj = new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obj.method();    }}

11.12 匿名内部类的注意事项

  • 对格式“new 接口名称(){}"进行解析:
    new代表创建对象的动作
    接口名称就是匿名内部类需要实现哪个接口
    {} 这才是匿名内部类的内容
  • 匿名内部类,在创建对象的时候,只能使用唯一一次
  • 如果希望多次创建对象,而且类的内容一样的话,那么就必须使用单独定义实现类匿名对象,在调用方法的时候,只能调用唯一一次
  • 如果希望同一个对象,调用多次方法,那么必须给对象起个名字匿名内部类是省略了实现类/子类名称,但是匿名对象省略了对象名称
package com.xww.day11.demo02;public class Demo02N {    public static void main(String[] args) {        //使用匿名内部类        MyInterface obja= new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        obja.method();        MyInterface objb= new MyInterface() {            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        };        objb.method();                new MyInterface(){            @Override            public void method() {                System.out.println("匿名内部类实现了方法");            }        }.method();    }}

转载地址:http://trrwz.baihongyu.com/

你可能感兴趣的文章
Mysql-丢失更新
查看>>
Mysql-事务阻塞
查看>>
Mysql-存储引擎
查看>>
mysql-开启慢查询&所有操作记录日志
查看>>
MySQL-数据目录
查看>>
MySQL-数据页的结构
查看>>
MySQL-架构篇
查看>>
MySQL-索引的分类(聚簇索引、二级索引、联合索引)
查看>>
Mysql-触发器及创建触发器失败原因
查看>>
MySQL-连接
查看>>
mysql-递归查询(二)
查看>>
MySQL5.1安装
查看>>
mysql5.5和5.6版本间的坑
查看>>
mysql5.5最简安装教程
查看>>
mysql5.6 TIME,DATETIME,TIMESTAMP
查看>>
mysql5.6.21重置数据库的root密码
查看>>
Mysql5.6主从复制-基于binlog
查看>>
MySQL5.6忘记root密码(win平台)
查看>>
MySQL5.6的Linux安装shell脚本之二进制安装(一)
查看>>
MySQL5.6的zip包安装教程
查看>>