内部类:
将⼀个类A定义在另⼀个类B⾥⾯,⾥⾯的那个类A就称为内部类,B则称为外部类。
内部类的分类:
成员内部类(非静态内部类)
a.可以使用的权限修饰符: public protected default private
b.语法
class Car { //外部类
class Engine { //内部类
}
}
//外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
Car.Engine engine = new Car().new Engine();
c.特点:
1.内部类中,可以随意调用外部类成员
2.外部类中,使用内部类成员时,需要创建内部类对象
3.无关类中使用成员内部类
1).间接调用,在外部类中的方法创建内部类的对象
2).直接调用,创建内部类对象
ps: new Outer().new Inner()
4.内部类和外部类中有同名的成员变量情况:
a.获取外部类成员变量
类名.this.变量名
b.获取内部类成员变量
this.变量名
c.获取方法内的局部变量
变量名
局部内部类[匿名内部类]
局部变量:
a.在方法内部定义的类,只在方法中有效
b.在局部内部类中,使用局部变量,必须是final修饰的
c.一次性的类,只能使用一次
d.不能使用访问修饰符
e.作用:一般都是结合抽象类/接口使用
[*匿名内部类]:
作用:实现接口/继承抽象类
缺点:一次性使用
语法:
接口/抽象类 引用名 = new 接口/抽象类(){实现类实现的抽象方法}
new ⽗类名或者接⼝名() {
// ⽅法重写
@Override
public void method() {
// 执⾏语句
}
};
匿名对象:
只能使用一次,只能调用一次方法
public abstract class FlyAble {
public abstract void fly();
}
public class InnerDemo {
public static void main(String[] args) {
/*
* 1.等号右边:是匿名内部类,定义并创建该接⼝的⼦类对象
* 2.等号左边:是多态赋值,接⼝类型引⽤指向⼦类对象
*/
FlyAble f = new FlyAble() {
public void fly() {
System.out.println("我⻜了~~~");
}
};
// 调⽤fly⽅法,执⾏重写后的⽅法
f.fly();
}
}
public class InnerDemo2 {
public static void main(String[] args) {
/*
* 1.等号右边:定义并创建该接⼝的⼦类对象
* 2.等号左边:是多态,接⼝类型引⽤指向⼦类对象
*/
FlyAble f = new FlyAble() {
public void fly() {
System.out.println("我⻜了~~~");
}
};
// 将f传递给showFly⽅法中
showFly(f);
}
public static void showFly(FlyAble f) {
f.fly();
}
}