java--内部类

class B517{
    B517(){
        System.out.println("instance of B.");
    }
    class InnerB{
        public InnerB() {
            // TODO 自动生成的构造函数存根
            System.out.println("instance of innerB.");
        }
    }
}
public class A517 {
    public static void main(String[] args) {
        B517 bbb = new B517();
        B517.InnerB inbbb = bbb.new InnerB();
        System.out.println();
        inbbb = new B517().new InnerB();
    }

}

//内部类名的全名称是 包名.外部类名.内部类名
//在包外用全名,再外包类外面就使用 外部类名.内部类名,例如B517.InnerB
//在类A517中创建的内部类句柄inbbb的声明类型是B517.InnerB(必须使用全名);
//内部类的new方法。
//创建一个内部类,必须先有一个外包类的对象存在。
//在外包类中创建内部类对象,可以简单一点,因为外包类的this句柄已经存在。

【内部类与外包类的关系】

class B518{
    private int x = 100;
    class InnerB{
        private int y = 111;
        void show(){                      //包内方法
            System.out.print("x = "+x);//访问包外私有成员
            System.out.println(", y = "+y);
        }
    }
    public void show(){//包外类方法
        InnerB inB = new InnerB();
        System.out.println(inB);
        System.out.println(inB.y);
        inB.show();
    }
}
public class A518 {
    public static void main(String[] args) {
        new B518().new InnerB().show();
        new B518().show();
    }

}

//在外包类的类体中,内部类对象同样属于外部类对象的成员,因此他们 可以相互访问对方的所有成员(包括私有成员),他们之间是完全相互信任的。
//内部类和外部类有着各自的命名空间,即使他们有相同的方法名,也不会有冲突。
//如果内部类的成员变量隐藏了外部类的成员变量,可以通过    【包外类.this.变量名】访问被隐藏的包外类的成员变量。

//内部类的编写

package Test;

public class App_1 {
    public static void main(String[] args) {
        Caaa caaa = new Caaa();
        caaa.set_num(5);
    }
    static class Caaa{
        int num;
        void set_num(int n){
            num = n;
            System.out.println("num = "+num);
        }
    }
}

//由于static方法只能访问static成员,所以类Caaa只能是static

【在外部类的构造函数中创建内部类对象】

如果不想将上一个实例中的Caaa设置为static,而且还想再main中继续使用它。

(1)、在外部类的构造函数中创建内部类的对象。

(2)、在main的创建外部类的对象。

//内部类的编写

package Test;

public class App_1 {
    public App_1(){
        
        Caaa caaa = new Caaa();
        caaa.setNum(5);
    }
    class Caaa{
        int num;
        void setNum(int n){
            num = n;
            System.out.println("num = "+num);
        }
    }
    public static void main(String[] args) {
        App_1 objApp_1 = new App_1();
        objApp_1.new Caaa().setNum(23);
    }
}
//num = 5
//num = 23

在创建外部类的同时会创建一个内部类对象,这样达到了在main中使用内部类的目的。

【在窗口程序设计中,会使用这样的编程技巧来编写窗口程序】。

【在外部类的外面引用内部类】

  内部类对象的创建的前提,必须有一个外部类的对象。比如外部类Outer,内部类Inner。内部类中有一个方法f       ()。现在调用f()。

  Outer outer = new Outer();

  Outer.Inner inner = outer.new Inner();

  inner.f();

【在方法中定义内部类】  

  如果内部类中要使用到方法中的变量,那么这个变量必须为   final。

原文地址:https://www.cnblogs.com/plxx/p/3336987.html