在java语言中内部类

上传人:子 文档编号:41676597 上传时间:2018-05-30 格式:DOC 页数:11 大小:51.50KB
返回 下载 相关 举报
在java语言中内部类_第1页
第1页 / 共11页
在java语言中内部类_第2页
第2页 / 共11页
在java语言中内部类_第3页
第3页 / 共11页
在java语言中内部类_第4页
第4页 / 共11页
在java语言中内部类_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《在java语言中内部类》由会员分享,可在线阅读,更多相关《在java语言中内部类(11页珍藏版)》请在金锄头文库上搜索。

1、在 java 语言中,有一种类叫做内部类(inner class),也称为嵌入类(nested class),它是定义在 其他类的内部。内部类作为其外部类的一个成员,与其他成员一样,可以直接访问其外部 类的数据和方法。只不过相比较外部类只有 public 和默认的修饰符不同,内部类作为一个 成员,可以被任意修饰符修饰。编译器在编译时,内部类的名称为 OuterClass$InnerClass.class 。1、内部类访问数据变量 当在某些时候,内部类中定义的变量与外部类中变量名称相同时,如何确保正确地访问每 一个变量呢?1.1 在 main 中直接从外部类调用内部类的方法class Outer

2、 private int index = 10;class Inner private int index = 20;void print()int index = 30;System.out.println(this); / the object created from the InnerSystem.out.println(Outer.this); / the object created from the OuterSystem.out.println(index); / output is 30System.out.println(this.index); / output is 2

3、0System.out.println(Outer.this.index); / output is 10void print() Inner inner = new Inner();/得到内部类的引用inner.print(); class Test public static void main(String args) Outer outer = new Outer();outer.print();在这里内部类 Inner 中关键字 this 指向内部类 Inner 的对象,如果要想指向外部类的对象, 必须在 this 指针前加上外部类名称,表示 this 是指向外部类构造的碎屑,如 O

4、uter.this 。1.2 在 main 中显式返回内部类引用class Outer private int index = 10;class Inner private int index = 20;void print() int index = 30;System.out.println(index);System.out.println(this.index);System.out.println(Outer.this.index);Inner getInner() return new Inner();/返回一个内部类的引用 class Test public static voi

5、d main(String args) Outer outer = new Outer();Outer.Inner inner = outer.getInner();inner.print(); Inner 是 Outer 的内部类,所以在类 Test 中必须用属性引用符来标识出内部类。1.3 当 main 方法在 Outer 类内部class Outer private int index = 10;class Inner private int index = 20;void print() int index = 30;System.out.println(index);System.o

6、ut.println(this.index);System.out.println(Outer.this.index);Inner getInner() return new Inner();/返回一个内部类的引用public static void main(String args) Outer outer = new Outer();Inner inner = outer.getInner(); / 注意此处变化inner.print(); 因为 main 方法在 Outer 内部,故可以直接引用,不需要属性引用符。1.4 在 main 方法中直接产生内部类对象class Test pub

7、lic static void main(String args) Outer outer = new Outer();Outer.Inner inner = outer.new Inner(); / 注意此处变化inner.print(); 在利用 new 构造方法构造一个外部类对象时,并没有连带着构造一个内部类对象,故需要 访问内部类方法时,必须使用 new 操作符为这个外部类对象再构造一个内部类对象。2、局部内部类 在方法中定义的内部类是局部内部类,它只能访问方法中的 final 类型的局部变量,因为用 final 定义的局部变量相当于是一个常量,延长了其生命周期,使得方法在消亡时,其内

8、部 类仍可以访问该变量。另外,它同样也可以引用定义在外部类的变量和方法。而且方法体中的局部内部类不允许有访问修饰符。class Outer int num=10; public void print(final int aArgs)class Innerint num=20;public Inner()System.out.println(“This is Inner.“);/此句可看出它与匿名内部类用 法的不同。public void print() int num=30;System.out.println(this); / the object created from the loca

9、l InnerSystem.out.println(num);System.out.println(this.num);System.out.println(Outer.this.num);System.out.println(aArgs);Inner inner=new Inner();/此句必须放在定义类 Inner 的后面inner.print();public static void main(String args)Outer outer=new Outer();outer.print(40); 对于局部类的命名,不管是在一个方法中定义多个类还是在几个方法中分别定义类,其编 译后命名

10、是:OuterClass$1InnerClass.class3、匿名内部类 匿名内部类作为一种特殊的内部类,除了具有普通内部类的特点,还有自己的一些独有特 性: 匿名内部类必须扩展一个基类或实现一个接口,但是不能有显式的 extends 和 implements 子句;匿名内部类必须实现父类以及接口中的所有抽象方法; 匿名内部类总是使用父类的无参构造方法来创建实例。如果是实现了一个接口,则其构造 方法是 Object(); 匿名内部类编译后的命名为:OuterClass$n.class,其中 n 是一个从 1 开始的整数,如果在 一个类中定义了多个匿名内部类,则按照他们的出现顺序从 1 开始排

11、号。abstract class A abstract public void sayHello(); class Outer public static void main(String args)new Outer().callInner(new A()public void sayHello()System.out.println(this); / the object created from the anonymous InnerSystem.out.println(“Hello!“););public void callInner(A a)a.sayHello(); 4、静态内部类

12、 和非静态内部类相比,区别就在于静态内部类没有了指向外部类的引用。除此之外,在任 何非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类(内部类的嵌套 可以不止一层) 。不过静态内部类中却可以拥有这一切。这也算是两者的第二个区别吧。一 个静态的内部类,才可以声明一个 static 成员,静态内部类可以访问外围类的静态方法、成 员(包括 private static 的成员) 。静态内部类实例化的时候不必先实例化外围类,可以直接 实例化内部类。而对于非静态内部类则必须先实例化其外部类,才能再实例化本身。5内部类的继承 当一个类继承自一个内部类时,缺省的构造器不可用。必须使用如下语法:

13、class WithInner class Innerpublic void sayHello()System.out.println(“Hello.“); public class Test extends WithInner.Inner Test(WithInner wi)wi.super();public static void main(String args)WithInner wi=new WithInner();Test test=new Test(wi);test.sayHello(); 因为每一个内部类都有一个指向外部类的引用,在继承一个内部类,必须先创建一个外部 类,通过这

14、个外部类引用来调用其内部类的构造方法。如果继承的内部类是一个静态内部 类,则就不需要这样,直接 super()调用即可;6、内部类的 2 种特殊用法 一个类从另一个类派生出来,又要实现一个接口。但在接口中定义的方法与父类中定义的 方法的意义不同,则可以利用内部类来解决这个问题。 interface Machine void run(); class Person void run()System.out.println(“run“); class Robot extends Person private class MachineHeart implements Machinepublic v

15、oid run()System.out.println(“heart run“);Machine getMachine()return new MachineHeart(); class Test public static void main(String args)Robot robot = new Robot();Machine m = robot.getMachine();m.run();robot.run(); 在 Robot 类内部使用内部类 MachineHeart 来实现接口 Machine 的 run 方法。同时 Robot 类 又继承了父类 Person 的 run 方法。

16、如果不使用内部类 MachineHeart 而使 Robot 直接实现接 口 Machine,则该如何调用父类的 run 方法?利用内部类可解决 c+中多重继承所解决的问题 class A void fn1()System.out.println(“It s fn1.“); abstract class B abstract void fn2(); class C extends A B getB()return new B() public void fn2()System.out.println(“It s fn2.“); class Test public static void main(String args)C c = new C();c.fn1();c.g

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号