`
k1280000
  • 浏览: 202571 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

内部类的继承从而实现对父类的private字段的引用

 
阅读更多


 

子类

public class SubClass extends SuperClass.InnerClass {
	SuperClass superClass;
	public SubClass (SuperClass superClass){
		superClass.super();   //由于内部类构建器必须同封装类对象的一个句柄联系到一起,
                                                     //所以从一个内部类继承的时候这里建立一个句柄
		this.superClass = superClass;
	}
	
	public void show(){
		System.out.println(this.returnPrivates());
	}
}

父类: 有一个private 的字段privates

public class SuperClass {
	private String privates = "know by Super itsself";
	
	public class InnerClass {
				
		public String returnPrivates(){
			return privates;
		}
	}
}

  测试类:

public class Test {
	public static void main(String[] args) {
		SubClass sub = new SubClass (new SuperClass());
		sub.show();
	}

}

 

 

--------如何实现继承内部类 (转) http://hi.baidu.com/huhoo99/item/6308b1c40d95f97789ad9eb1 --------------------------------------------------

 

从内部类继承
由于内部类构建器必须同封装类对象的一个句柄联系到一起,所以从一个内部类继承的时候,情况会稍微变得有些复杂。这儿的问题是封装类的“秘密”句柄必须获得初始化,而且在衍生类中不再有一个默认的对象可以连接。解决这个问题的办法是采用一种特殊的语法,明确建立这种关联:

    //: InheritInner.java// Inheriting an inner classclass WithInner {  class Inner {}}public class InheritInner     extends WithInner.Inner {  //! InheritInner() {} // Won't compile   InheritInner(WithInner wi) {     wi.super();   }  public static void main(String[] args) {     WithInner wi = new WithInner();     InheritInner ii = new InheritInner(wi);   }} ///:~


从中可以看到,InheritInner只对内部类进行了扩展,没有扩展外部类。但在需要创建一个构建器的时候,默认对象已经没有意义,我们不能只是传递封装对象的一个句柄。此外,必须在构建器中采用下述语法:
enclosingClassHandle.super();
它提供了必要的句柄,以便程序正确编译。

7.6.7 内部类可以覆盖吗?
若创建一个内部类,然后从封装类继承,并重新定义内部类,那么会出现什么情况呢?也就是说,我们有可能覆盖一个内部类吗?这看起来似乎是一个非常有用的概念,但“覆盖”一个内部类——好象它是外部类的另一个方法——这一概念实际不能做任何事情:

    //: BigEgg.java// An inner class cannot be overriden // like a methodclass Egg {  protected class Yolk {    public Yolk() {       System.out.println("Egg.Yolk()");     }   }  private Yolk y;  public Egg() {     System.out.println("New Egg()");     y = new Yolk();   }}public class BigEgg extends Egg {  public class Yolk {    public Yolk() {       System.out.println("BigEgg.Yolk()");     }   }  public static void main(String[] args) {    new BigEgg();   }} ///:~


默认构建器是由编译器自动合成的,而且会调用基础类的默认构建器。大家或许会认为由于准备创建一个BigEgg,所以会使用Yolk的“被覆盖”版本。但实际情况并非如此。输出如下:
New Egg()
Egg.Yolk()
这个例子简单地揭示出当我们从外部类继承的时候,没有任何额外的内部类继续下去。然而,仍然有可能“明确”地从内部类继承:

    //: BigEgg2.java// Proper inheritance of an inner classclass Egg2 {  protected class Yolk {    public Yolk() {       System.out.println("Egg2.Yolk()");     }    public void f() {       System.out.println("Egg2.Yolk.f()");     }   }  private Yolk y = new Yolk();  public Egg2() {     System.out.println("New Egg2()");   }  public void insertYolk(Yolk yy) { y = yy; }  public void g() { y.f(); }}public class BigEgg2 extends Egg2 {  public class Yolk extends Egg2.Yolk {    public Yolk() {       System.out.println("BigEgg2.Yolk()");     }    public void f() {       System.out.println("BigEgg2.Yolk.f()");     }   }  public BigEgg2() { insertYolk(new Yolk()); }  public static void main(String[] args) {     Egg2 e2 = new BigEgg2();     e2.g();   }} ///:~


现在,BigEgg2.Yolk明确地扩展了Egg2.Yolk,而且覆盖了它的方法。方法insertYolk()允许BigEgg2将它自己的某个Yolk对象上溯造型至Egg2的y句柄。所以当g()调用y.f()的时候,就会使用f()被覆盖版本。输出结果如下:
Egg2.Yolk()
New Egg2()
Egg2.Yolk()
BigEgg2.Yolk()
BigEgg2.Yolk.f()
对Egg2.Yolk()的第二个调用是BigEgg2.Yolk构建器的基础类构建器调用。调用
g()的时候,可发现使用的是f()的被覆盖版本。
分享到:
评论

相关推荐

    WPF继承_子类继承父类,实现跨类调用方法

    标题“WPF继承_子类继承父类,实现跨类调用方法”表明我们将讨论如何在WPF应用程序中利用继承来实现在不同类之间进行方法调用。 1. **类继承基础** - 在C#中,我们使用`:`符号来表示一个类继承自另一个类。例如,...

    C# 类继承中的私有字段都去了哪里?.doc

    在C#中,类继承是通过继承父类的字段和方法来实现的。但是,私有字段的继承是如何实现的呢?在父类中,私有字段是无法被子类访问的,这使得我们很难理解私有字段的继承机制。 在本文中,我们将通过一个示例程序来...

    Java中extends类的继承

    类的继承是面向对象编程的一个核心特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,从而实现代码的复用和扩展。下面将详细探讨`extends`关键字在Java中的使用、特点以及相关知识点。 1. **类的继承...

    在父类获取子类属性

    这个主题涉及到面向对象编程的基本原理,特别是子类继承父类后如何访问和操作子类特有的属性。下面我们将深入探讨这个话题。 首先,我们了解基本的继承概念。在Java中,一个类(子类)可以继承另一个类(父类),...

    java内部类学习资料

    静态内部类不持有对外部类的引用,而非静态内部类则需要一个外部类的实例才能被实例化。 2. **匿名内部类**:这是一种没有名字的内部类,通常用于创建一次性使用的类。匿名内部类可以继承一个类或实现一个接口,...

    C++类封装设计继承

    3. 继承:子类继承父类的属性和行为,实现代码重用和类层次结构。 4. 多态:通过继承实现,允许使用父类指针或引用处理不同子类的对象,提高了程序的灵活性和可扩展性。 5. 测试用例:编写用于验证类功能的代码,...

    Java中类的继承学习小结

    然而,私有成员(private)不会被继承,但可以通过内部类或者友元类访问。 多态性是继承的关键特性之一。多态允许我们使用父类引用指向子类对象,从而可以调用子类重写或扩展的父类方法。这在处理不同类型的对象时...

    Java面向对象继承.pdf

    `this`关键字则用于在类内部引用当前对象,常用来调用本类的方法或访问本类的字段。例如: ```java public class MyClass { private String myField; public MyClass(String myField) { this.myField = myField;...

    Java-Java面向对象继承的实现教程

    继承允许子类继承父类的所有非私有(public和protected)成员,包括字段(变量)和方法。这减少了代码重复,提高了代码的复用性。子类可以扩展或修改父类的功能,而无需完全重新编写父类的代码。 在Java中,继承的...

    轻松学Java之继承与多态优秀PPT.pptx

    子类除了可以继承父类中的字段及方法之外,还可以增加自己的成员方法。 通过继承和多态,我们能够快捷的开发出新的类,而不需要编写相同的代码,从而大大将少了工作量。同时,继承和多态也使得代码更加灵活和可维护...

    实现对字段和方法的递归查找

    总之,实现对字段和方法的递归查找是软件开发中的一个重要技能,它涉及类层次结构、接口、注解、反射等多个方面。掌握这项技术有助于我们更好地理解和操作复杂的代码库,提高代码质量和可维护性。在实践中,我们可以...

    Java 类的继承

    它允许创建一个新类(子类),该类不仅具有自身的属性和方法,还能直接继承一个或多个已存在的类(父类)的属性和方法,从而实现代码的重用和扩展。这种机制使得Java程序设计更加灵活和模块化。 **类的定义与继承**...

    java类的继承实例

    异常类也可以通过继承来建立层次结构,Java 的 `Exception` 类是所有异常类的父类。 综上所述,Java 类的继承是其面向对象编程的重要组成部分,它使我们能够构建复杂、模块化的软件系统,并有效地管理和重用代码。...

    java反射获取所有属性,获取所有get方法,包括子类父类

    Java反射是Java编程语言中的一个强大工具,它允许运行中的Java程序对自身进行检查并且可以直接操作程序的内部属性。在Java中,反射主要用于在运行时分析类和对象,包括访问私有成员、调用私有方法、创建动态代理等。...

    654.652.JAVA基础教程_反射-获取运行时类的父类及父类的泛型(654).rar

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作对象的内部属性、方法和实现。本教程聚焦于通过反射获取运行时类的父类以及父类中的泛型信息。这是一项高级技能,对理解和调试...

    Java课件 第一章 继承 类的重写

    在这个例子中,`Car`类通过继承`Vehicle`并重写`drive()`方法,实现了对车辆驾驶行为的定制。 总之,类的继承在Java中是一个强大的工具,它使得我们可以构建复杂且相互关联的类体系,提高了代码的可读性、可维护性...

    关于Java继承性的探讨.pdf

    Java的继承性是其面向对象特性的重要组成部分,它允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和方法,从而实现代码的复用和扩展。这种机制大大提高了软件开发的效率和灵活性,同时也支持了面向对象...

    java继承与多态

    当子类继承父类时,需要通过显式调用父类的构造器来初始化父类中的数据成员。这通常通过`super()`关键字完成。 **2.5 多层继承** Java支持多层继承,即一个类可以从另一个类继承,而这个父类本身也可以从另一个...

    C#应用程序开发-类的继承.pptx

    继承允许一个类(子类或派生类)从另一个类(父类或基类)继承属性和行为,从而实现代码的复用和模块化。在C#中,类的继承语法如下: ```csharp [修饰符] class 子类名: 父类名 { // 新增派生成员 } ``` 例如,...

Global site tag (gtag.js) - Google Analytics