概述

1,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。
2,与之对应,包含内部类的类被称为外部类
3,内部类的信息获取需要借助外部类去访问,
4,内部类隐藏在外部类内,更好的实现了信息隐藏
5,内部类的分类:
        成员内部类
        静态内部类
        方法内部类
        匿名内部类

成员内部类

内部类
需要借由外部类信息才能实例化!
获取内部类实例对象:

  1. new 外部类.new 内部类
    Person.Heart myHeart=new Peron().new Heart();
  2. 外部类对象.new 内部类
    外部类对象Person lili´new Person();

Person.Heart myHeart;
myHeart=lili.new Heart();

  1. 在外部类中定义一个方法实例内部类。调用这个方法

-内部类可以直接访问外部类的成员(变量和方法)


静态内部类

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.匿名内部类可以实现接口也可以继承父类,但是不可兼得。

最后修改:2019 年 12 月 31 日 11 : 38 PM
如果觉得我的文章对你有用,请随意赞赏