ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 概念 将类写在其他类的内部,可以写在其他类的成员位置和局部位置,这时写在其他类内部的类就称为内部类。其他类也称为外部类。 ~~~ public class Outer { public class Inner{ } } ~~~ ### 使用场景 在描述事物时,若一个事物内部还包含其他可能包含的事物,比如在描述汽车时,汽车中还包含这发动机,这时发动机就可以使用内部类来描述。 ### 分类 1. 成员内部类 . 2. 局部内部类 . ### 使用方法 1. 可以使用成员修饰符 . 2. 也可以继承,也可以实现接口 . 3. 外部类要使用内部类必须建立内部对象 (内部类不能有静态成员). ~~~ 外部类名.内部类名 变量名 = new 外部类名().new 内部类名() ~~~ ### 成员内部类的同名变量调用 代码如下 ~~~ public class Outer { public int x = 1; public class Inner{ public int x = 2; public void show() { int x = 3; System.out.print(x); } } } ~~~ 如何访问三个同名变量呢 ? 从里向外依次为 : ~~~ System.out.print(x); //3 ~~~ ~~~ System.out.print(this.x); //2 ~~~ ~~~ System.out.print(Outer.this.x); //1 ~~~ ### 局部内部类 调用 : ~~~ public class Outer { public void show() { class Inner { public void show() { System.out.print("内部类"); } } Inner in = new Inner(); //必须要在内部方法中new 内部类,然后使用内部类的成员进行调用 . in.show(); } } ~~~ ### 匿名内部类 内部类是为了应对更为复杂的类间关系。查看源代码中会涉及到,而在日常业务中很难遇到,这里不做赘述。 最常用到的内部类就是匿名内部类,它是局部内部类的一种。 定义的匿名内部类有两个含义: 1. 临时定义某一指定类型的子类 . 2. 定义后即刻创建刚刚定义的这个子类的对象 . ## 匿名内部类 1. 是一种特殊的语法,用来快速创建抽象类的子类对象. ## 不用匿名内部类 1. 创建子类.继承抽象类. 2. 重写抽象类中的所有抽象方法. 3. new 子类. ## 匿名内部类快速创建抽象类子类 注意,这里创建的不是AbstractAnimal的对象,而是AbstractAnimal子类的对象. ~~~ public abstract class AbstractAnimal { public abstract void eat(); public abstract void sleep(); } ~~~ 第一种方式 ~~~ new AbstractAnimal() { @Override public void eat() { } @Override public void sleep() { } }; ~~~ 第二种方式 ~~~ new AbstractAnimal() { @Override public void eat() { System.out.println("子类吃"); } @Override public void sleep() { System.out.println("子类睡"); } }.eat(); //直接调用. ~~~ 第三种(常用) ~~~ AbstractAnimal animal = new AbstractAnimal() //因为不知道子类类型,所以用父类类型指向子类对象,这里运用了多态. { @Override public void eat() { System.out.println("子类吃"); } @Override public void sleep() { System.out.println("子类睡"); } }; animal.eat(); animal.sleep(); ~~~ ## 匿名内部类快速创建接口的实现类对象 ~~~ public interface Girl { void cook(); void kiss(); } ~~~ ~~~ Girl g = new Girl() //因为不知道实现类的类型,所以用接口的类型. { @Override public void cook() { System.out.println("炒菜"); } @Override public void kiss() { System.out.println("亲吻"); } }; g.cook(); g.kiss(); ~~~ ### 匿名内部类作用 匿名内部类 , 简化问题 . 定义实现类,重写接口或者抽象类方法 ,建立实现类对象, 合为一步完成 . **使用前提**: 必须要实现一个接口或者继承一个抽象类, 且只能写在方法中 . 语法 : 假设有一个接口Parent ~~~ public class Test { public static void main(String[] args) { Parent p = new Parent() { @Override public void show() { System.out.print("匿名内部类"); } }; p.show(); } } ~~~ 或者 ~~~ new Parent() { //@Override public void show() { System.out.print("匿名内部类"); } }.show(); ~~~ 结果 ~~~ 匿名内部类 ~~~