类的五大成员 属性、方法、构造器、代码块、内部类 —————— 类有内部类,外部类,外部其他类
如
public class InterClass01 {//外部类
public static void main(String[] args) {//静态内部类
System.out.println("懒猪起床了");
}
}
class Bell {//外部其他类
void ring();
}
这里主要对内部类进行展开介绍
内部类有两大类共四种
(一:定义在外部类局部上)局部内部类、匿名内部类 -无类名
(二:定义在外部类成员位置)成员内部类、静态内部类 -static修饰
注意:内部类里的成员和外部类的成员重名时,采用就近原则,用 外部类.this.成员 来访问重名的外部类非静态成员。
①局部内部类-有类名
- 通常在方法、代码块中
- 不加访问修饰符,final可以修饰
- 作用域仅仅在定义它的方法或代码块中
- 本质还是个类,末尾要有;
- 当局部内部类里的成员和外部类的成员重名时,采用就近原则,用 外部类.this.成员 来访问重名的外部类成员
②匿名内部类 -无类名
-
匿名内部类-没有类名,通常在方法、代码块中;
-
特点:类只使用一次,后面不再使用
-
运行类型为匿名内部类的对象编译类型是接口,类名字在底层分配一般为外部类$1
-
接口 对象 = new 接口(){实现方法}; <==> class 匿名内部类 implements 接口 对象 = new 接口(){实现方法};
-
本质是个类,其实也可以看成一个对象
-
可以访问外部类所有的成员,包括private
③成员内部类
-
没有static修饰,在类的成员位置
-
可以用任意访问修饰符(public…)修饰
-
外部其他类访问成员内部类
①外部类.内部类 对象 = 外部类.new 内部类(); 通过对象调用内部类
②外部类.内部类 对象 = 外部类.方法; 用方法返回内部类 -
重名就近调用,外部类.this.成员 特指调用外部类重名成员
④静态内部类 -static修饰
-
成员位置,访问修饰符任意(public…),有static修饰
-
可以访问外部类所有静态成员,非静态成员不能访问
-
访问静态内部类
①外部类.内部类 对象 = new 外部类.内部类(); 通过对象调用内部类
②外部类.内部类 对象 = 外部类.方法; 用方法返回内部类
其中属匿名内部类最常用,也最重要,举个案例
public class Inter {
public static void main(String[] args) {
Hit hit = new Hit();
hit.kit();//匿名内部类在方法中
}
}
interface Csgo {//接口
void play();
}
class Hit {
public int n;
public void kit() {
Csgo cs = new Csgo() {//匿名内部类实现接口
@Override
public void play() {//实现接口方法
System.out.println("内部类....");
}
};
cs.play();
System.out.println("cs的运行类型:" + cs.getClass());
}
这里通过getClass()方法查看运行类型也就是匿名内部类
匿名内部类的名字不需要我们设定,在运行程序时,底层会自动识别分配一个名字,一般为外部类+$1组成,就像这里的就叫Hit$1