2011-12-29 15 views
3

私は正しい単語のためにgoogleすることができないかもしれませんが、私は次の質問に対する答えを見つけることができません。インスタンスのJava set superインスタンス

新しいクラスインスタンスのスーパークラスを明示的に設定できますか?例えば。私はSuperClazzインスタンスを持っており、SuperClazzを継承するClazzの新しいインスタンスを作成したいと考えています。

class Clazz extends SuperClazz{ 

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

'this.super'はクラスではなくインスタンスです。スーパーはインスタンスそのものなので、「スーパーインスタンス」のようなものはありません。 – Howard

+3

あなたはあなたの質問を言い換えて、あなたがこの構築を使って解決したいと思っている「現実の」問題を尋ねることができます。 – Howard

+1

いいえ、できません。 –

答えて

3

スーパークラスは常に暗黙的にインスタンス化され、あなたはそれを—を行うことはできませんので、私はちょうど(コードはちょうど私が何をしたいのか、それがコンパイルされないで、正しくない)このような何かを行うことができます拡張クラスの中にスーパークラスを「植え付ける」。おそらくコピーコンストラクタが必要です。

+0

はい私はコピーコンストラクタを使用する必要がある方法を望んでいました。 –

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は2つの異なることを知っています、私はちょうどこの特定のアスペクトは、Javaからのいくつかの起源を持っていた...) –

関連する問題