内部类
- 外部类不能直接访问内部类,内部类成员可以访问外部类的私有数据;
- 外部类不可以使用"private/protected/static"修饰符
1.成员内部类
-
区别:
使用static修饰的成员内部类是静态内部类,不使用static修饰的成员内部类是非静态内部类;
-
static关键字的作用
- 外部类的外一层是包不能用static修饰;内部类的外一层是外部类能用static修饰;
- 把内部类变成外部类的类相关,而不是外部类的实例(对象)相关;
-
查找变量顺序
- 内部类局部变量
- 内部类成员变量
- 外部类成员变量
-
保存文件形式
-
外部类:外部类名.class
-
内部类:外部类名&内部类名.class
-
1.非静态内部类
- 外部类访问内部类:
- 在外部类方法内新建内部类访问内部类,main方法不能新建非静态内部类对象(编译错误)
- 可以访问内部类方法,但是不能访问内部类变量(编译出错);
- 内部类访问外部类:都行
- 非静态内部类不能有静态方法/静态成员变量/静态初始化块
2.静态内部类
-
外部类访问内部类:
- 在外部类方法内或main内都能新建对象或者直接内部类名调用;
- 可以访问内部类变量,但是不能访问内部类方法(编译出错);
-
内部类访问外部类:
静态内部类不能访问外部类的实例成员,只能访问外部类的类成员;
静态内部类对象只持有外部类的类引用,没有持有外部类的对象引用 -
静态内部类可以包含静态成员,也可以包含非静态成员;
- 接口内部类[了解即可]
- 只能使用public static修饰接口内部类;
- 接口的作用是定义一个公共规范(暴露出来供大家使用),如果把这个接口定义成一个内部接口就没有意义了;
2.局部内部类
3.匿名内部类
-
要求:
- 必须且只能实现或继承一个类;
- 继承只是单纯的新建类+重写需要用到的内容;
- 匿名内部类不能是抽象类(没有意义),不能定义构造器(没有类名);
- 匿名内部类是:需要创建并使用一次的类;
-
书写格式
-
继承:
new 父类([参数]){ 重写 }
-
实现:
new 实现类(){ 重写 }
-
-
匿名内部类使用外部类成员内部类时,成员内部类必须要被
final
修饰,java1.8以后自动在编译时在成员变量前添加final -
案例:
-
父类
public class Father { public Father(String name) { super(); Name = name; } 省略:有参无参构造器 private String Name; private Integer age; private String Book; 省略:get/set方法 }
-
外部类:
public class Test{ public void father() { //java1.8后自动在成员变量前加上final,再次复制则编译错误 String book="数学"; //book="12"; Father father = new Father("刘备") { public Integer getAge() { return 10; } public String getBook() { return book; } }; System.out.println("姓名:"+father.getName()+",年龄:"+father.getAge()+",书籍:"+father.getBook()); } }
-