2011-12-29 44 views
3

我可能只是无法正确的单词谷歌,但我无法找到以下问题的答案。Java集实例的超级实例

是否可以显式设置新类实例的超类。例如。我有一个SuperClazz实例,并且想要创建一个Clazz的新实例,它扩展了SuperClazz。我可以做这样的事情(代码正是我想要做的,它不会编译和不正确):

class Clazz extends SuperClazz{ 

Clazz(SuperClazz superInstance){ 
    this.super = superInstance; 
} 
} 
+0

'this.super'不会是一个类,而是一个实例。并且没有'superinstance'这样的事情,因为super就是实例本身。 – Howard 2011-12-29 11:55:52

+3

也许你可以改述你的问题,并询问你想用这种结构解决你面临的“真实世界”问题。 – Howard 2011-12-29 11:57:15

+1

不,你不能。 – 2011-12-29 11:58:40

回答

3

超类总是隐式实例化,所以你不能做到这一点— “扩展”类中的“超级类”。你可能想要的是一个拷贝构造函数。

+0

是的,我想要一种方法来使用复制构造器。 – 2011-12-29 12:13:15

6

你在混合继承和委派。当一个对象调用

super.doThis(); 

它不具有对象的超类的类型另一个对象调用doThis。它自己调用它。 thissuper是同样的事情。 super只允许访问在超类中定义的方法的版本,并在子类中重写。所以,改变超级实例没有意义:没有超级实例。

1

我认为你有一些意思或你正在使用的术语的误解。

实例(或对象)是您在运行时使用new Clazz()创建的内容。你不能改变它(除非你使用字节码修改技巧)。 你真正想要的是创建2个类:基类和它的子类。这是最简单的例子。

class SuperClazz { 
} 

class Clazz extends SuperClazz { 
} 

如果你想从子类中使用的构造函数中调用父类的构造函数exlplitly super(): 类clazz中扩展SuperClazz { 公共clazz中(){ 超(); } }

+0

不,我想我正在使用正确的术语。问题是java看起来并没有超级实例的概念。我最近在JS中处理原型实例,所以我通过Java可能会将超类的实例与子类的实例分开,但事实并非如此? (是的,我知道JS和Java是两个不同的东西,我只是虽然这个特定的方面有一些来自Java ...) – 2011-12-29 12:10:49