内部类的好处
1.内部类的对象能够访问创建它的对象的所有方法和属性,包括私有数据
2.对于同一个包中的其他类来说,内部类是隐身的
3.匿名内部类可以很方便的定义回调
4.使用内部类可以很方便的编写事件驱动的程序
内部类分为成员内部类与局部内部类。
一、成员内部类
成员内部类定义在外部类中的成员位置(与类中的成员变量相似,可以通过外部类对象进行访问)(成员内部类可以继承,也可以实现接口)
- 定义格式
class 外部类 {
修饰符 class 内部类 {
//其他代码
}
}
-
访问方式
外部类名.内部类名 变量名 = new 外部类名().new 内部类名(); -
举例示范
class Car{ //外部类,汽车
private boolean status = true;
public class Machine{ //内部类,发动机
public void run(){
System.out.println("发动机烧油,汽车跑");
System.out.println("汽车的状态:"+status); //访问外部类的成员变量
}
}
}
class Demo {
public static void main(String[] args) {
Car.Machine c1 = new Car().new Machine(); //创建内部类中的对象
c1.run(); //调用内部类中的方法
}
}
运行结果:
二、局部内部类
局部内部类定义在外部类方法中的局部位置,与访问方法中的局部变量相似,可以通过调用方法进行访问。
- 定义格式
class 外部类 {
修饰符 返回值类型 方法名(参数) {
class 内部类 {
//其他代码
}
}
}
-
访问方式
在外部类方法中,创建内部类对象,进行访问 -
举例示范
class Car{ //外部类,汽车
private boolean status = true;
public void run(){
class Machine{
public void runway(){
System.out.println("汽车使用轮子跑的");
}
}
new Machine().runway(); //创建内部类对象,调用runway方法
}
}
class Demo {
public static void main(String[] args) {
Car c1 = new Car(); //创建外部类对象
c1.run(); //调用外部类中的方法(该方法中又创建内部类对象)
}
}
运行结果:
三、最常用的匿名内部类(一种局部内部类)
- 作用:匿名内部类是创建某个类型子类对象的快捷方式
- 定义格式:
new 父类或接口(){
//进行方法重写
}
- 举例示范
- 如下有两种方法来使用:
方法一:先定义引用变量,然后让引用变量指向子类对象,最后调用方法。
方法二:不定义引用变量,直接创建子类对象并且调用方法。
abstract class Person{
public abstract void eat();
}
public class Demo{
public static void main(String[] args){
Person p = new Person(){ //定义并创建该父类的子类对象,并用多态的方式赋值给父类引用变量
public void eat() {
System.out.println("方法一:我吃了");
}
};
p.eat(); //调用eat方法
new Person(){
public void eat(){
System.out.println("方法二:我吃了");
}
}.eat();
}
}
运行结果: