A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

内部类

定义在其他类内部的类,称为内部类。内部类所在的类,称为宿主类

内部类可以将一些相关的类放在一起,内部类只对宿主可见

静态内部类和非静态内部类

静态内部类用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

局部内部类
变量定义在类中,是成员变量。定义在方法中,是局部变量。
内部类定义在方法中,是局部内部类。
匿名内部类
没有类名的内部类。
省去类的名字,直接构造只是当前需要的对象。非常方便,界面开发中常用。

还是提示超过长度限制,剩下的对象克隆只好留到下个帖子了




0 个回复

您需要登录后才可以回帖 登录 | 加入黑马