创建一个Computer抽象类:用来在Test类中创建匿名抽象类
package com.zhiyou;public abstract class Computer { int a = 1; /** * 不能够创建出抽象类的一个对象 */ public abstract void online(); public abstract void watchTv();}
package com.zhiyou;public class Outter { public void a() { int a = 3; System.out.println("外部类a方法--" + this.a); } /** * 嵌套的概念 除了变量和方法之外,我们还可以定义一个类 这个类就是内部类 */ int a = 1; class Inner { int a = 2; public void b() { int a = 3; // 不加任何描述的时候根据就近原则调用离他最近的变量 System.out.println("方法内部局部变量--" + a); // this. 代表调用本类的成员变量或方法 System.out.println("内部类的成员变量--" + this.a); // Outter.this. 代表调用外部类的成员变量或方法 System.out.println("外部类的成员变量--" + Outter.this.a); // 调用方法的形式:方法名--()参数列表--分号 // a(); } }}
创建一个接口AAA用来创建接口的匿名内部类
package com.zhiyou;public interface AAA {}
创建测试类Test,用来输出
package com.zhiyou;/** * 同一个包下面,普通类创建对象时可以直接调用 但是内部类就需要使用import引入 */// import com.zhiyou.Outter.Inner;public class Test { /** * 内部类 * */ public static void main(String[] args) { // 生成的二进制字节码文件(.class文件)名称是Outter.class // 那么它里面的内部类Inner生成的文件名称是Outter$Inner.class Outter outter = new Outter(); // System.out.println(outter.a); // outter.a(); /* * 讲继承的时候说过:没有父类就没有子类 对于内部类也一样:没有外部类的对象就不能创建一个内部类的对象 * * 创建内部类对象的方法:通过外部类的对象去创建内部类的对象 */ // 写法1 Outter.Inner inner = outter.new Inner(); // 写法2 // 通过这种方式创建出来的外部类对象没有引用,是不能使用里面的变量和方法的 // 匿名:new Outter().new Inner();创建出来了一个外部类的对象,但是他没有引用,没用名字 Outter.Inner inner1 = new Outter().new Inner(); System.out.println(inner.a); inner.b(); /** * 不能够创建出抽象类的一个对象 匿名的概念 * * 匿名内部类 这下面其实是有一个类的存在的,但是我们看不见类的任何影子 在编译后的目录中多出来一个 Test$1.class * * 相当于:创建出来了一个匿名内部类继承了抽象类Computer并实现了他的抽象方法 创建出了一个抽象类的子类的对象 */ Computer computer = new Computer() { public void watchTv() { System.out.println("匿名内部类中的方法 看电视"); } public void online() { System.out.println("匿名内部类中的方法 上网"); } }; System.out.println("抽象类中的变量 a" + computer.a); computer.watchTv(); computer.online(); /* * 匿名内部类的创建形式 * * 不是new+构造方法 * * new--抽象类或者接口名--()--{}实现抽象方法的地方--分号 * 接口是没有构造方法的的,抽象类有 */ AAA a = new AAA() { }; }}