1.内部类的概念
内部类表示的事物是外部类的一部分,内部类单独出现没有任何意义。如发动机是汽车的一部分。
内部类的访问特点:
(1)内部类可以直接访问外部类的成员,包括私有;
(2)外部类要访问内部类的成员,必须创建对象。
示例:
二、内部类的分类
分为成员内部类、静态内部类、局部内部类和匿名内部类,前三个能看懂即可(方便看源码),匿名内部类必须掌握。
1.成员内部类
写在成员位置,属于外部类的成员。如上例。成员内部类可以被一些修饰符所修饰,比如:private,默认,protected,public,static等。
补充:private修饰的成员只能在该类中使用(该类的方法使用),无修饰符(default)的成员可以被该类所在包中的类使用,protected修饰的成员可以被该类所在包中的类及其子类使用,public修饰的成员可以被任意类使用。
获取成员内部类对象的两种方法:
(1)在外部类中编写方法,对外提供内部类的对象;
注意:Car.java文件编译之后会生成两个字节码文件,一个是Car.class,一个是Car&Enginee.class。
(2)直接创建格式:外部类名.内部类名 对象名 = 外部类对象.内部类对象;
注意:若内部类被private修饰,则上图中的代码报错。
内部类访问外部类的成员变量:
书写格式为:外部类.this.成员变量名
也遵循“就近原则”:
再例如:
2.静态内部类(属于成员内部类的一种)
内部类使用static修饰。
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。
创建静态内部类对象的方式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
3.局部内部类
将内部类定义在方法里就是局部内部类,类似于方法里的局部变量。外界是无法直接使用,需要在方法内部创建对象并使用。该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
注:静态内部类和局部内部类就不举例子了。
4.匿名内部类(以前的文章里讲过,先看那篇)
匿名内部类本质上是隐藏了名字的内部类。当方法的参数是接口或类时,以接口为例,可以传递这个接口的实现类对象,如果实现类只要使用一次,就可以用匿名内部类简化代码。
(1)接口的匿名内部类(实现关系)
(2)抽象类的匿名内部类(继承关系):
解释:匿名内部类是为了省去写实现接口或继承抽象类的类的步骤。
匿名内部类可以写在成员位置,也可以写在局部位置。
(1)写在局部位置(写在类的方法中):
还可以写成这样,自己调用自己定义的方法:
(2)写在成员位置:
注意:因为main()方法是静态方法所有匿名内部类swimObject也加了static,也可以两者都不加。