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。

 

 

你可能感兴趣的:(java)