成员内部类
成员内部类就是类中的一个普通成员,类似基础阶段的普通成员变量、成员方法。
创建对象方式:外部类名.内部类名 对象名 = new 外部类(…).new 内部类(…)。
成员内部类的实例方法中,访问成员特点:
- 可以直接访问外部类的实例成员、静态成员。
- 可以拿到当前外部类对象,格式是:外部类名.this。
静态内部类
- 有static修饰的内部类;
- 外部类名.内部类名 对象名 = new 外部类.内部类(…);
- 可以直接访问外部类的静态成员,不能直接访问外部类的实例变量。
匿名内部类
- 格式:
/* new 类或者接口(参数值...){
类体(一般是方法重写);
};
new Animal(){
@Override
public void cry(){
}
};
*/
- 匿名内部类特点:匿名内部类本质就是一个子类,并会立即创建一个子类对象。
- 匿名内部类作用及应用场景:
- 可以更方便的创建出一个子类对象;
- 匿名内部类通常作为一个参数传输给方法
常见使用场景
package api_use;
public class Test4_Inner_1 {
public static void main(String[] args) {
//目标:认识匿名内部类,并掌握其作用
// 1、把这个匿名内部类编译成一个子类,然后会立即创建出一个子类对象
/*Animal a = new Cat();*/
Animal a = new Animal(){
@Override
public void cry() {
System.out.println("喵喵~~");
}
};
a.cry();
}
}
// 上面是简化写法:匿名内部类,不用指定猫
/*class Cat extends Animal{
@Override
public void cry() {
System.out.println("喵喵秒~~");
}
}*/
abstract class Animal{
public abstract void cry();
}
package api_use;
public class Test4_Inner_2 {
public static void main(String[] args) {
// 目标:掌握匿名的常见使用场景
Swimming s1 = new Swimming() {
@Override
public void swim() {
System.out.println("狗狗游的飞快----");
}
};
go(s1);
// 上下对比
go(new Swimming() {
@Override
public void swim() {
System.out.println("狗狗游的飞快----");
}
});
}
public static void go(Swimming s) {
System.out.println("开始---------------");
s.swim();
}
}
// 猫和狗都要参加游泳比赛
interface Swimming{
void swim();
}
输出结果
开始---------------
狗狗游的飞快----
开始---------------
狗狗游的飞快----