第章 Java面向对象的程序设计(格式修改内部类).doc

上传人:rrsccc 文档编号:8976666 上传时间:2021-01-28 格式:DOC 页数:14 大小:77.50KB
返回 下载 相关 举报
第章 Java面向对象的程序设计(格式修改内部类).doc_第1页
第1页 / 共14页
第章 Java面向对象的程序设计(格式修改内部类).doc_第2页
第2页 / 共14页
第章 Java面向对象的程序设计(格式修改内部类).doc_第3页
第3页 / 共14页
第章 Java面向对象的程序设计(格式修改内部类).doc_第4页
第4页 / 共14页
第章 Java面向对象的程序设计(格式修改内部类).doc_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《第章 Java面向对象的程序设计(格式修改内部类).doc》由会员分享,可在线阅读,更多相关《第章 Java面向对象的程序设计(格式修改内部类).doc(14页珍藏版)》请在三一文库上搜索。

1、内部类在类的内部定义的类称为内部类。ATesterBC 客户类、顶层类、外部类和内部类内部类的基本语法内部类按照作用域可进行如下分类:实例内部类静态内部类成员内部类内部类局部内部类其中,顶层类只能处于public和默认访问级别,而成员内部类可以处于public、protected、private和默认这4种访问级别。package visitcontrol;class Outer public class InnerTool public int add(int a,int b) return a+b; private InnerTool tool=new InnerTool( );publi

2、c void add(int a,int b,int c) tool.add(tool.add(a,b),c); public class Tester public static void main(String args ) Outer o=new Outer( ); o.add(1,2,3); Outer.InnerTool tool=new Outer( ).new InnerTool( ); 说明:l InnerTool类的完整类名为Outer.InnerTool。Tester类是Outer类及其内部类的客户类,如果要在Tester类中使用InnerTool类,必须引用它的完整类名。

3、l 如果不希望客户程序访问成员内部类,外部类可以把成员内部类定义为private类型。内部类分为:实例内部类和静态内部类一、 实例内部类 -没有static修饰(1)在创建实例内部类的实例时,外部类的实例必须已经存在。例如要创建InnerTool类的实例,必须先创建Outer外部类的实例。 Outer.InnerTool tool=new Outer( ).new InnerTool( );(2)实例内部类的实例自动持有外部类的实例的引用。在内部类中,可以直接访问外部类的所有成员,包括成员变量和方法。 package outerref; public class A private int a

4、1; public int a2; static int a3; public A(int a1,int a2)this.a1=a1;this.a2=a2; protected int methodA( )return a1*a2; class B int b1=a1; int b2=a2; int b3=a3; int b4=new A(3,4).a1; int b5=methodA( ); public static void main(String args ) A.B b=new A(1,2).new B( ); System.out.println(“b.b1=”+b.b1); Sy

5、stem.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);在多重嵌套中,内部类可以访问所有外部类的成员。 class A private void methodA( ) class B private void methodB( ) class C private void methodC( ) methodA( ); methodC( ); (3)外部类实例与内部类实例之间是一对多的关系

6、,一个内部类实例只会引用一个外部实例,而一个外部类实例对应零个或多个内部类实例。在外部类中不能直接访问内部类的成员,必须通过内部类的实例去访问。 class A class B private int b1=1; private int b2=2; class C public void test( ) int v1=b1;/编译错误 int v2=b2; /编译错误 B.C c1=new C( ); /编译错误 B b=new B( ); int v3=b.b1; int v4=b.b2; B.C c2=b.new C( ); B.C c3=new B( ).new C( );(4)在实例内

7、部类中不能定义静态成员,而只能定义实例成员。 class A class B static int b1;/编译错误 int b2;/合法 static class C /编译错误 class D /合法 (5)如果实例内部类B与外部类A包含同名的成员(比如成员变量v),那么在类B中,this.v表示类B的成员,A.this.v表示类A的成员。 package diffnames; public class A int v=1; class B int v=2; public void test( ) System.out.println(“v=”+v); /打印v=2 System.out.

8、println(“v=”+this.v); /打印v=2 System.out.println(“v=”+A.this.v); /打印v=1 public static void main(String args ) new A( ).new B( ).test( ); 二、静态内部类 -用static修饰。(1)静态内部类的实例不会自动持有外部类的特定实例的引用,在创建内部类的实例时,不必创建外部类的实例。 class A public static class B int v; class Tester public void test( ) A.B b=new A.B( ); b.v=1

9、; (2)静态内部类可以直接访问外部类的静态成员,如果访问外部类的实例成员,就必须通过外部类的实例去访问。 class A private int a1; private static int a2; public static class B int b1=a1; /编译错误 int b2=a2; /合法 int b3=new A( ).a1; /合法 (3)在静态内部类中可以定义静态成员和实例成员 class A public static class B int v1; static int v2; public static class C static int v3; (4)客户类可

10、以通过完整的类名直接访问静态内部类的静态成员。 package visitstatic; class A public static class B int v1; static int v2; public static class C static int v3; int v4; public class Tester public void test( )A.B b=new A.B( ); A.B.C c=new A.B.C( ); b.v1=1; b.v2=1; A.B.v1=1;/编译出错 A.B.v2=1;/合法 A.B.C.V3=1;/合法 三、局部内部类局部内部类是在一个方法中

11、定义的内部类,它的可见范围是当前方法。和局部变量一样,局部内部类不能用访问控制修饰符(public、private、protected)及static修饰符来修饰。(1)局部内部类只能在当前方法中使用。 class A B b=new B( ); public void method( ) class B int v1; int v2; class C int v3; B b=new B( ); B.C c=b.new C( ); (2)局部内部类和实例内部类一样,不能包含静态成员。 class A public void method( ) class B static int v1;/编译

12、错误 int v2; static class C/编译错误 int v3; (3)在局部内部类中定义的内部类也不能被public、protected、private这些访问控制修饰符修饰。(4)局部内部类和实例内部类一样,可以访问外部类的所有成员,此外,局部内部类还可以访问所在方法中的final类型的参数和变量。 class A int a; public void method(final int p1,int p2) int localv1=1; final int localv2=2; class B int b1=a; int b2=p1; int b3=p2;/编译出错 int b

13、4=localv1;/编译出错 int b5=localv2; 四、内部类的继承package inherit;class Outerprivate int a;public Outer(int a)this.a=a;class Inner public Inner( ) public void print( )System.out.println(“a=”+a); public class Sample extends Outer.Inner public Sample(Outer o) o.super( ); public static void main(String args ) Ou

14、ter outer1=new Outer(1); Outer outer2=new Outer(2); Outer.Inner in=outer1.new Inner( ); in.print( ); Sample s1=new Sample(outer1); Sample s2=new Sample(outer2); s1.print( ); s2.print( ); 五、子类与父类中的内部类同名内部类并不存在覆盖的概念,假如子类与父类中存在同名的内部类,那么这两个内部类也会分别在不同的命名空间中,因此不会发生冲突。package nooverride;class OuterInner in

15、;Outer( )in=new Inner( );public class Inner public Inner( )System.out.println(“inner of Outer”); public class SubOuter extends Outerclass Inner public Inner( )System.out.println(“inner of SubOuter”);public static void main(String args ) SubOuter.Inner in1=new SubOuter( ).new Inner( ); Outer.Inner in

16、2=new Outer( ).new Inner( ); 六、匿名类匿名类是一种特殊的内部类,这种类没有名字。package noname;public class AA(int v)System.out.println(“another constructor”);A( ) System.out.println(“default constructor”);void method( ) System.out.println(“from A”);public static void main(String args )new A( ).method( );A a=new A( )void me

17、thod( ) System.out.println(“from anonymous”);a. method( );七、内部类的用途l 封装类型l 直接访问外部类的成员l 回调外部类的方法(1)封装类型 public interface Tool public int add(int a,int b); public class Outer private class InnerTool implements Toolpublic int add(int a,int b) return a+b;public Tool getTool( ) return new InnerTool( ); 在客

18、户类中不能访问Outer.InnerTool类,但是可以通过getTool( )方法获得InnerTool的实例。Tool tool=new Outer.getTool( );(2) 直接访问外部类的成员例如:class A private int count; public int add( )return +count; public int getCount( )return count; public void setCount(int count)this.count=count;class B A a; B(A a)this.a=a; public void reset( ) if

19、(a.getCount)0) a.setCount(1); else a.setCount(-1); 假如应需求要求类A的count的属性不允许被除了类B以外的其他类读取或设置,那么以上实现方式不能满足这一要求。class A private int count; public int add( )return +count; public int getCount( )return count; public void setCount(int count)this.count=count;class B public void reset( ) if(Count)0) Count=1; e

20、lse Count=-1; (3)回调public interface Adjustable/*调节温度*/ public void adjust(int temperature);public class Baseprivate int speed;public void adjust(int speed) this.speed=speed;public class Sub extends base implements Adjustable private int temperature; public void adjust(int temperature) this.temperatu

21、re=temperature;以上Sub类实现了Adjustable接口中的方法,并且把base类中的方法覆盖了,这意味着Sub类仅仅有调节温度的功能,但失去了调节速度的功能。public class Sub extends base private int temperature; public void adjustTemperature(int temperature) this.temperature=temperature;public class Closure implements Adjustablepublic void adjust(int temperature)adjustTemperature(temperature);public Adjustable getCallBackReference return new Closure( ); 客户类使用Sub类的调节温度的功能。Sub sub=new Sub( ) ;Adjustable ad=sub.getCallBackReference( );ad.adjust( );

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1