Java 内部类的阐述

创建一个Computer抽象类:用来在Test类中创建匿名抽象类

package com.zhiyou;

public abstract class Computer {
    
    int a  = 1;
    /**
     * 不能够创建出抽象类的一个对象
     */
    public abstract void online();
    public abstract void watchTv();
}


创建一个外部类Outter,在这个外部类Outter的内部在创建一个内部类Inner,在不同的位置定义变量a,我们需要注意的是如何调用不同位置的变量a!

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() {
        };
    }

}

 

原文地址:https://www.cnblogs.com/zhaiyaohua/p/5800096.html