1 . 什么是内部类?
类的五大成员:属性、方法、构造方法、代码块、内部类。
内部类:在一个类的里面,再定义一个类。例:在 A 类的内部定义 B 类,B 类就称为内部类。汽车的发动机、ArrayList的迭代器、人的心脏等。
2 . why内部类 ?
如下,汽车的例子,里面的发动机的相关信息应单独归属于发动机类,而且也不能单独在外面定义一个发动机类,没有意义,因为发动机应该依赖于其汽车而存在。
3 . 内部类特点
- 内部类表示的事物是外部类的一部分
- 内部类单独出现是没有任何意义的
内部类的访问特点:
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建
内部类的对象,通过对象访问调用。
4 . 内部类的分类
4 . 1 成员内部类:
写在成员位置的,属于外部类的成员。
- 成员内部类可以被一些修饰符所修饰,比如:
private(只能在本类使用)、默认(本类、同一个包中的其他类)、protected(本类、同一个包中的其他类、不同包下的子类)、public(本类、同一个包中的其他类、不同包下的子类、不同包下的无关类)、static。
4 . 1 . 2 获取成员内部类对象:
- 法一: 在外部类中编写方法,对外提供内部类的对象(适用于成员内部类被
private修饰时)
在测试类中调用:
- 法二: 直接创建 :外部类.内部类名 对象名 = 外部类对象.内部类对象
Outer.Inner oi = new Outer().new Inner()
4 . 1 . 3 成员内部类获取外部类的成员变量:
- 依次打印出来是 10 20 30
4 . 2 静态内部类:
静态内部类是成员内部类的一种。
-
静态内部类只能访问外部类中的静态变量和静态方法。
-
如果想要访问非静态的需要在内部类里面创建外部类的对象,再调用。
4 . 2 . 1 创建静态内部类对象的格式:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
// Outer.Inner oi = new Outer.Inner();
4 . 2 . 2 调用静态内部类里的方法:
-
非静态方法:先创建对象,用对象调用
-
静态方法,可以直接用类名点获取,如下:
// Outer.Inner.show();
4 . 3 局部内部类:
将内部类定义在
方法里面就叫局部内部类,类似于方法里面的局部变量。(局部内部类是不能被public修饰的)
- 外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量。
4 . 4 匿名内部类:
本质上就是隐藏了名字的内部类。可以写在成员位置,也可以写在内部位置。
上述代码蕴含了三步:继承/实现、方法重写、创建对象。
- 可以作为参数传进方法进行调用
method(
new Swim(){
@Override
public void swim(){
System.out.println("帅惨了");
}
}
);
- 可以直接在后面调用方法
new Swim(){
@Override
public void swim(){
System.out.println("帅惨了");
}
}.swim() ;