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。