|
内部类 定义在其他类内部的类,称为内部类。内部类所在的类,称为宿主类。 内部类可以将一些相关的类放在一起,内部类只对宿主可见。 静态内部类和非静态内部类 静态内部类用static修饰。 静态内部类不能直接访问起宿主类的成员,必须通过宿主类对象来访问。 例如 outer.outString。通过宿主类对象outer来访问其变量outString。 宿主类访问静态内部类的 静态成员(变量,方法,内部类),直接用“类名.成员名”来调用 非静态成员,必须使用内部类对象来访问。 宿主类访问非静态内部类,统一使用内部类对象来访问。 静态变量不能定义于非静态内部类。 前面讲类和对象就提过,静态成员通过类名.成员名引用。非静态成员通过对象名.成员名引用。 Outer.Iner1 in1=new Outer().new Iner1();//创建内部类对象,通过对象引用 Outer.Iner2 in2=new Outer.Iner2();//创建静态内部类对象,通过类名引用
package test2; class Outer{ String outString="string in outer"; void print(){ //System.out.println(Iner1.this.inString1);会报错,找不到对象实例 Iner1 in1=new Iner1();//新建实例对象,调用了Iner1()构造函数 System.out.println(in1.inString1);//通过实例对象访问非静态内部类的成员变量 System.out.println(Iner2.inString2);//通过 类名.成员名访问静态内部类的变量 } class Iner1{ String inString1="string in Iner1"; Iner1(){ System.out.println("constructor of Iner1"); } class InIner1{} } static class Iner2{ static String inString2="string in Iner2"; Iner2(){ System.out.println("constructor of Iner2"); } static class InIner2{} } } -------------------------------------------------------------- public class TestInerClass{ public static void main(String[] args){ Outer out=new Outer(); out.print(); } }
再分析一个实例 public class TestInerClass{ public static void main(String[] args){ Outer.Iner1 in1=new Outer().new Iner1();//内部类仅宿主可见,所以定义Outer.Iner1类型。非静态成员需要通过对象引用,所以层层创建对象。 Outer.Iner2 in2=new Outer.Iner2();//Outer.Iner2为静态内部类,即相当于外部类的静态成员变量,直接用类名.成员名访问,new Outer.Iner2() System.out.println(in1); System.out.println(in2); } } 输出constructor of Iner1 constructor of Iner2 test2.Outer$Iner1@d9660d test2.Outer$Iner2@bb0d0d ---------------------------------- 另一例子 public class TestInerClass{ public static void main(String[] args){ Outer.Iner1.InIner1 inin1=new Outer().new Iner1().new InIner1(); System.out.println(inin1); Outer.Iner1 in1=new Outer().new Iner1(); Outer.Iner1.InIner1 inin2=in1.new InIner1(); System.out.println(inin2); } } 输出constructor of Iner1 test2.Outer$Iner1$InIner1@da4b71 constructor of Iner1 test2.Outer$Iner1$InIner1@18f1d7e ------------------------------------------ public class TestInerClass{ public static void main(String[] args){ Outer.Iner2.InIner2 inin2=new Outer.Iner2.InIner2(); System.out.println(inin2); } } 输出 test2.Outer$Iner2$InIner2@1f6226
局部内部类 变量定义在类中,是成员变量。定义在方法中,是局部变量。 内部类定义在方法中,是局部内部类。 匿名内部类 没有类名的内部类。 省去类的名字,直接构造只是当前需要的对象。非常方便,界面开发中常用。
还是提示超过长度限制,剩下的对象克隆只好留到下个帖子了
|