概述
1,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
2,与之对应,包含内部类的类被称为外部类
3,内部类的信息获取需要借助外部类去访问,
4,内部类隐藏在外部类内,更好的实现了信息隐藏
5,内部类的分类:
成员内部类
静态内部类
方法内部类
匿名内部类
成员内部类
内部类
需要借由外部类信息才能实例化!
获取内部类实例对象:
- new 外部类.new 内部类
Person.Heart myHeart=new Peron().new Heart(); - 外部类对象.new 内部类
外部类对象Person lili´new Person();
Person.Heart myHeart;
myHeart=lili.new Heart(); - 在外部类中定义一个方法实例内部类。调用这个方法
-内部类可以直接访问外部类的成员(变量和方法)
静态内部类
1.静态内部类中,只能直接访问外部类的静态成员,如果要调用非静态成员,可以通过对象实例
2.静态内部类对象实例时,可以不依赖于外部类对象
3.可以通过外部类.内部类.静态成员的方式,访问内部类中的静态成员
4.党内部类属性与外部类属性同名时,默认直接调用内部类中的成员
如果需要访问外部类中的静态属性,则可以通过 外部类.属性的方式
如果要访问外部类中的非静态属性,则可以通过new 外部类().属性 的方式
方法内部类
定义在方法内部,作用范围也在方法内。
和方法内部成员使用规则一样,class前面不可以添加public,private,protected,static。
类中不能包含静态成员。
类中可以包含final,abstract(一般不推荐)修饰的成员
匿名内部类(上)
匿名内部类:
针对某个类实例只用一次,我们就可以将类的定义与类的创建,放在一起完成来简化程序,以这种方式定义的没有名字的类,就是匿名内部类。可通过此类来简化抽象类和接口实现的操作。
优点:对内存和系统性能损耗小
缺点:不支持重复调用
适用场景:
- 只用到类的一个实例
- 类在定义后马上用到
给类命名并不会导致代码更容易被理解
写法:public class Test { // 根据传入不同的参数类型,调用不同的方法 public void getRead(Person person){ person.read(); } // 方法3: public static void main(String[] args) { Test test = new Test(); //实例对象的同时完成对象内容的编写 test.getRead(new Person(){ @Override public void read() { System.out.println("女生喜欢看言情小说"); } }); test.getRead(new Person(){ @Override public void read() { System.out.println("男生喜欢看科幻小说"); } }); } }
匿名内部类(下)
1.适用场景:
(1)只用到类的一个实例
(2)类定义后马上用到
(3)给类命名并不会导致代码更容易被理解
2.匿名内部类没有类型名称、实例对象名称。
3.编译后的文件命名:外部类¥数字。class
4.无法使用private、public、protected、abstract、static修饰
5.无法编写构造方法,可以添加构造代码块。
6.不能出现静态成员
7.匿名内部类可以实现接口也可以继承父类,但是不可兼得。