二十六、内部类
作者:互联网
1、概述
什么是内部类?将一个类 A 定义在另一个类 B 里面,里面的那个类 A 就称为内部类,B 则称为外部类。
2、成员内部类
引入: 在描述事物时,若一个事物内部还包含其他事物,就可以使用内部类这种结构。比如,汽车类Car
中包含发动机类Engine
,这时,Engine
就可以使用内部类来描述,定义在成员位置。
成员内部类: 定义在类中方法外的类,叫做成员内部类。
定义格式:
class 外部类{
class 内部类{...}
...
}
3、成员内部类访问特点
创建内部类对象格式:外部类.内部类 对象名 = new 外部类().new 内部类();
访问演示,代码如下:
【定义类】
public class Person {
private boolean live = true;
private int rate = 60
public void show(){ // 外部类获取内部类变量
Heart h = new Heart();
h.rate;
}
class Heart {
private int rate = 75;
public void jump() {
int rate = 100;
// 直接访问外部类成员
if (live) {
System.out.println(rate); // 方法中变量访问
System.out.println(this.rate); // 内部类中变量访问
System.out.println(Person.rate); // 外部类中变量访问
System.out.println("心脏在跳动");
} else {
System.out.println("心脏不跳了");
}
}
}
public boolean isLive() {
return live;
}
public void setLive(boolean live) {
this.live = live;
}
}
【定义测试类】
public class InnerDemo {
public static void main(String[] args) {
// 创建外部类对象
Person p = new Person();
// 创建内部类对象
Person.Heart heart = p.new Heart();
// 调用内部类方法
heart.jump();
// 调用外部类方法
p.setLive(false);
// 调用内部类方法
heart.jump();
}
}
/*
输出结果:
心脏在跳动
心脏不跳了
*/
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的 .class 文件,但是前面冠以外部类的类名和$符号。 比如:Person$Heart.class
访问特点:
- 内部类可以直接访问外部类的成员,包括私有成员
- 外部类访问内部类的成员,必须要建立内部类的对象
- 局部变量直接访问;内部类用 this 访问;外部类用 类名.this 访问
4、局部内部类/匿名内部类
4.1、匿名内部类介绍
- 匿名内部类是一个非常特殊的内部类,从命名可以看出,匿名内部类是没有类名的,因此这个内部类只能用一次。
- 使用场景?匿名内部类一般用于简化代码,当要快速实现一个抽象类或者接口的抽象方法时,我们就可以使用匿名内部类来简化,可以不用专名定义一个有名类来操作。
- 由上述可知,要使用匿名内部类,必须要有一个父类或者父接口
4.2、定义格式
new 类名/接口(){
//如果父类型有抽象方法,需要全部重写
}
特点分析:
- 该匿名内部类 {} 就是某一个类或接口的实现类(子类)
- 整体创建的是子类对象!!!
4.3、匿名内部类的使用
- 直接调用方法
- 作为方法参数传递
- 作为方法的返回值
接口:
interface Flyable{
void fly();
}
① 直接调用方法
new Flyable(){
@Override
public void fly(){
System.out.println("不知道什么在飞111111");
}
}.fly();
② 当做方法的参数传递
public static void showFlyable(Flyable flyable){
flyable.fly();
}
showFlyable(new Flyable(){
@Override
public void fly(){
System.out.println("不知道什么在飞22222222");
}
})
③ 当做方法的返回值使用
public static Flyable getFlyable(){
return new Flyable(){
@Override
public void fly(){
System.out.println("不知道什么在飞333333");
}
}
}
标签:部类,内部,二十六,void,println,new,public 来源: https://www.cnblogs.com/6ovo6/p/14928942.html