第4章 Java面向对象的程序设计格式修改内部类.docx
- 文档编号:23172092
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:15
- 大小:22.11KB
第4章 Java面向对象的程序设计格式修改内部类.docx
《第4章 Java面向对象的程序设计格式修改内部类.docx》由会员分享,可在线阅读,更多相关《第4章 Java面向对象的程序设计格式修改内部类.docx(15页珍藏版)》请在冰豆网上搜索。
第4章Java面向对象的程序设计格式修改内部类
内部类
在类的内部定义的类称为内部类。
A
Tester
B
C
客户类、顶层类、外部类和内部类
内部类的基本语法
内部类按照作用域可进行如下分类:
实例内部类
静态内部类
成员内部类
内部类
局部内部类
其中,顶层类只能处于public和默认访问级别,而成员内部类可以处于public、protected、private和默认这4种访问级别。
packagevisitcontrol;
classOuter{
publicclassInnerTool{
publicintadd(inta,intb){
returna+b;
}
privateInnerTooltool=newInnerTool();
publicvoidadd(inta,intb,intc){
tool.add(tool.add(a,b),c);
}
}
publicclassTester{
publicstaticvoidmain(Stringargs[]){
Outero=newOuter();
o.add(1,2,3);
Outer.InnerTooltool=newOuter().newInnerTool();
}
}
说明:
●InnerTool类的完整类名为Outer.InnerTool。
Tester类是Outer类及其内部类的客户类,如果要在Tester类中使用InnerTool类,必须引用它的完整类名。
●如果不希望客户程序访问成员内部类,外部类可以把成员内部类定义为private类型。
内部类分为:
实例内部类和静态内部类
一、实例内部类----没有static修饰
(1)在创建实例内部类的实例时,外部类的实例必须已经存在。
例如要创建InnerTool类的实例,必须先创建Outer外部类的实例。
Outer.InnerTooltool=newOuter().newInnerTool();
(2)实例内部类的实例自动持有外部类的实例的引用。
在内部类中,可以直接访问外部类的所有成员,包括成员变量和方法。
packageouterref;
publicclassA{
privateinta1;
publicinta2;
staticinta3;
publicA(inta1,inta2){this.a1=a1;this.a2=a2;}
protectedintmethodA(){returna1*a2;}
classB{
intb1=a1;
intb2=a2;
intb3=a3;
intb4=newA(3,4).a1;
intb5=methodA();
}
publicstaticvoidmain(Stringargs[]){
A.Bb=newA(1,2).newB();
System.out.println(“b.b1=”+b.b1);
System.out.println(“b.b2=”+b.b2);
System.out.println(“b.b3=”+b.b3);
System.out.println(“b.b4=”+b.b4);
System.out.println(“b.b5=”+b.b5);
在多重嵌套中,内部类可以访问所有外部类的成员。
classA{
privatevoidmethodA(){}
classB{
privatevoidmethodB(){}
classC{
privatevoidmethodC(){}
methodA();
methodC();}}}}
(3)外部类实例与内部类实例之间是一对多的关系,一个内部类实例只会引用一个外部实例,而一个外部类实例对应零个或多个内部类实例。
在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。
classA{
classB{
privateintb1=1;
privateintb2=2;
classC{}
}
publicvoidtest(){
intv1=b1;//编译错误
intv2=b2;//编译错误
B.Cc1=newC();//编译错误
Bb=newB();
intv3=b.b1;
intv4=b.b2;
B.Cc2=b.newC();
B.Cc3=newB().newC();
(4)在实例内部类中不能定义静态成员,而只能定义实例成员。
classA{
classB{
staticintb1;//编译错误
intb2;//合法
staticclassC{}//编译错误
classD{}//合法
}
}
(5)如果实例内部类B与外部类A包含同名的成员(比如成员变量v),那么在类B中,this.v表示类B的成员,A.this.v表示类A的成员。
packagediffnames;
publicclassA{
intv=1;
classB{
intv=2;
publicvoidtest(){
System.out.println(“v=”+v);//打印v=2
System.out.println(“v=”+this.v);//打印v=2
System.out.println(“v=”+A.this.v);//打印v=1
}
}
publicstaticvoidmain(Stringargs[]){
newA().newB().test();
}
}
二、静态内部类-----用static修饰。
(1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。
classA{
publicstaticclassB{
intv;
}
}
classTester{
publicvoidtest(){
A.Bb=newA.B();
b.v=1;
}
}
(2)静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问。
classA{
privateinta1;
privatestaticinta2;
publicstaticclassB{
intb1=a1;//编译错误
intb2=a2;//合法
intb3=newA().a1;//合法
}
}
(3)在静态内部类中可以定义静态成员和实例成员
classA{
publicstaticclassB{
intv1;
staticintv2;
publicstaticclassC{
staticintv3;
}
}
}
(4)客户类可以通过完整的类名直接访问静态内部类的静态成员。
packagevisitstatic;
classA{
publicstaticclassB{
intv1;
staticintv2;
publicstaticclassC{
staticintv3;
intv4;
}
}
}
publicclassTester{
publicvoidtest(){
A.Bb=newA.B();
A.B.Cc=newA.B.C();
b.v1=1;
b.v2=1;
A.B.v1=1;//编译出错
A.B.v2=1;//合法
A.B.C.V3=1;//合法
}
}
三、局部内部类
局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法。
和局部变量一样,局部内部类不能用访问控制修饰符(public、private、protected)及static修饰符来修饰。
(1)局部内部类只能在当前方法中使用。
classA{
Bb=newB();
publicvoidmethod(){
classB{
intv1;
intv2;
classC{
intv3;
}
}
Bb=newB();
B.Cc=b.newC();
}
}
(2)局部内部类和实例内部类一样,不能包含静态成员。
classA{
publicvoidmethod(){
classB{
staticintv1;//编译错误
intv2;
staticclassC{//编译错误
intv3;
}
}
}
}
(3)在局部内部类中定义的内部类也不能被public、protected、private这些访问控制修饰符修饰。
(4)局部内部类和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量。
classA{
inta;
publicvoidmethod(finalintp1,intp2){
intlocalv1=1;
finalintlocalv2=2;
classB{
intb1=a;
intb2=p1;
intb3=p2;//编译出错
intb4=localv1;//编译出错
intb5=localv2;}
}}
四、内部类的继承
packageinherit;
classOuter{
privateinta;
publicOuter(inta){this.a=a;}
classInner{
publicInner(){}
publicvoidprint(){System.out.println(“a=”+a);}
}}
publicclassSampleextendsOuter.Inner{
publicSample(Outero){
o.super();}
publicstaticvoidmain(Stringargs[]){
Outerouter1=newOuter
(1);
Outerouter2=newOuter
(2);
Outer.Innerin=outer1.newInner();
in.print();
Samples1=newSample(outer1);
Samples2=newSample(outer2);
s1.print();
s2.print();}}
五、子类与父类中的内部类同名
内部类并不存在覆盖的概念,假如子类与父类中存在同名的内部类,那么这两个内部类也会分别在不同的命名空间中,因此不会发生冲突。
packagenooverride;
classOuter{
Innerin;
Outer(){in=newInner();}
publicclassInner{
publicInner(){System.out.println(“innerofOuter”);}
}
}
publicclassSubOuterextendsOuter{
classInner{
publicInner(){System.out.println(“innerofSubOuter”);}
}
publicstaticvoidmain(Stringargs[]){
SubOuter.Innerin1=newSubOuter().newInner();
Outer.Innerin2=newOuter().newInner();
}}
六、匿名类
匿名类是一种特殊的内部类,这种类没有名字。
packagenoname;
publicclassA{
A(intv){System.out.println(“anotherconstructor”);}
A(){System.out.println(“defaultconstructor”);}
voidmethod(){System.out.println(“fromA”);}
publicstaticvoidmain(Stringargs[]){
newA().method();
Aa=newA(){
voidmethod(){System.out.println(“fromanonymous”);}
};
a.method();}}
七、内部类的用途
●封装类型
●直接访问外部类的成员
●回调外部类的方法
(1)封装类型
publicinterfaceTool{publicintadd(inta,intb);}
publicclassOuter{
privateclassInnerToolimplementsTool{
publicintadd(inta,intb){
returna+b;}
}
}
publicToolgetTool(){
returnnewInnerTool();
}
}
在客户类中不能访问Outer.InnerTool类,但是可以通过getTool()方法获得InnerTool的实例。
Tooltool=newOuter.getTool();
(2)直接访问外部类的成员
例如:
classA{
privateintcount;
publicintadd(){return++count;}
publicintgetCount(){returncount;}
publicvoidsetCount(intcount){this.count=count;}}
classB{
Aa;
B(Aa){this.a=a;}
publicvoidreset(){
if(a.getCount)>0)a.setCount
(1);
elsea.setCount(-1);
}
}
假如应需求要求类A的count的属性不允许被除了类B以外的其他类读取或设置,那么以上实现方式不能满足这一要求。
classA{
privateintcount;
publicintadd(){return++count;}
publicintgetCount(){returncount;}
publicvoidsetCount(intcount){this.count=count;}
classB{
publicvoidreset(){
if(Count)>0)Count=1;
elseCount=-1;}
}
}
(3)回调
publicinterfaceAdjustable{
/**调节温度*/
publicvoidadjust(inttemperature);
}
publicclassBase{
privateintspeed;
publicvoidadjust(intspeed){
this.speed=speed;
}
}
publicclassSubextendsbaseimplementsAdjustable{
privateinttemperature;
publicvoidadjust(inttemperature){
this.temperature=temperature;}
}
以上Sub类实现了Adjustable接口中的方法,并且把base类中的方法覆盖了,这意味着Sub类仅仅有调节温度的功能,但失去了调节速度的功能。
publicclassSubextendsbase{
privateinttemperature;
publicvoidadjustTemperature(inttemperature){
this.temperature=temperature;}
}
publicclassClosureimplementsAdjustable{
publicvoidadjust(inttemperature){
adjustTemperature(temperature);
}
publicAdjustablegetCallBackReference{
returnnewClosure();
}
}
客户类使用Sub类的调节温度的功能。
Subsub=newSub();
Adjustablead=sub.getCallBackReference();
ad.adjust();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 Java面向对象的程序设计格式修改内部类 Java 面向 对象 程序设计 格式 修改 部类