将一个类A定义在另一个类B里面,里面的那个类A就称为内部类
1.成员内部类: 定义在外部类的成员位置(和成员变量/成员方法 地位相同)
可以使用: public/private/static进行修饰
2.局部内部类: 定义在外部类的方法内部,该内部类出了方法就没有用了
成员内部类的定义和使用
成员内部类(和成员变量/成员方法 处于同一位置)
public class 外部类名 {//外部类
//外部类成员变量
//外部类成员方法
//外部类构造方法
//成员内部类
public class 内部类名 {
//内部类成员变量
//内部类成员方法
//内部类构造方法
}
}
使用 (1)外部类要访问内部类的成员,必须要建立内部类的对象。
外部类 Person 内部类 Heart
//创建外部类对象
Person p = new Person();
//使用外部类成员变量
System.out.println(p.age);//5
简单来讲: 外.内 对象名 = new 外().new 内();
//创建内部类对象: new 外部类名(...).new 内部类名(...)
Person.Heart h2 = new Person().new Heart();
(2)内部类可以直接访问外部类的成员,包括私有成员。
(3)内部类也是类,编译后也有对应的class文件: 外部类名$内部类名.class
(4)内部类可以使用public修饰,也可以使用private修饰,还可以使用static修饰
(5)可以在方法内部定义内部类(局部内部类),出了方法就失效了(必须在方法内部创建内部类的对象并使用)
*/
内部类中3个重名变量的使用
内部类中3个重名变量的使用
直接写变量名: 方法内部局部变量
this.变量名: 内部类成员变量
Outer.this.变量名: 外部类成员变量
public class Outer {//外部类
//外部类的成员变量
int num = 1;
public class Inner {//内部类
//内部类的成员变量
int num = 11;
//内部类成员方法
public void show() {
int num = 111;
//输出111
System.out.println(num);//111
//输出11
System.out.println(this.num);//11
//输出1
System.out.println(Outer.this.num);//1
}
}
}
//测试类
public class Demo02InnerClass {
public static void main(String[] args) {
//创建内部类对象
Outer.Inner inner = new Outer().new Inner();
//内部类对象调用方法
inner.show();
}
}
匿名内部类
把创建实现(子类)类,覆盖重写抽象方法,创建实现类对象,实现类对象调用方法这四步合成一步完成
new 抽象父类/接口(); //错误: 不能直接new抽象父类/接口的对象
new 抽象父类/接口() {
覆盖重写所有的抽象方法;
}
public abstract class Animal {
//抽象方法
public abstract void eat();
public abstract void sleep();
}
//抽象类,演示匿名内部类对象的使用
public class Demo10AbstractNiMing {
public static void main(String[] args) {
//多态的方式创建抽象类的匿名内部类对象
Animal a = new Animal() {
@Override
public void eat() {
System.out.println("小猫在吃....");
}
@Override
public void sleep() {
System.out.println("小猫在睡....");
}
//特有方法
public void catchMouse() {
System.out.println("小猫在逮老鼠....");
}
};
a.eat();
((Animal) a).catchMouse(); 错误: 多态不能调用子类的特有方法
}
}