class superClass {}
class subClass extends superClass{}
public class test
{
public static void main()
{
superClass sc1 = new subClass();
subClass sc2 = new subClass();
//whats the difference between the two objects created using the above code?
}
}
7 に答える
簡単な説明:使用する場合
SuperClass obj = new SubClass();
で定義されているパブリックメソッドにのみSuperClass
アクセスできます。で定義されているメソッドはそうでSubClass
はありません。
使用する場合
SubClass obj = new SubClass();
で定義されSubClass
ているパブリックメソッドは、パブリックメソッドと一緒にアクセスすることもできSuperClass
ます。
どちらの場合も作成されるオブジェクトは同じです。
元:
public class SuperClass {
public void method1(){
}
}
public class SubClass extends SuperClass {
public void method2()
{
}
}
SubClass sub = new SubClass();
sub.method1(); //Valid through inheritance from SuperClass
sub.method2(); // Valid
SuperClass superClass = new SubClass();
superClass.method1();
superClass.method2(); // Compilation Error since Reference is of SuperClass so only SuperClass methods are accessible.
上記のコードを使用して作成された2つのオブジェクトの違いは何ですか?
2つのオブジェクトはまったく同じです。異なるのは、オブジェクト参照が格納されている変数のタイプです。実際には、これは、に固有のメソッドがある場合subClass
、を介してアクセスすることはできますが、を介してアクセスすることはできないことをsc2
意味しますsc1
(後者にはキャストが必要です)。
どちらの場合も、のオブジェクトsubClass
が作成されますが、参照は異なります。
superClass
ieを参照すると、に存在するがに存在しないsc1
メソッドを呼び出すことはできません。メソッドを呼び出すにはキャストが必要になります。subClass
superClass
subClass
好き :
class superClass {
public void superClassMethod(){
}
}
class subClass extends superClass{
public void subClassMethod(){
}
}
今 :
public class test
{
public static void main(){
superClass sc1 = new subClass();
subClass sc2 = new subClass();
//whats the difference between the two objects created using the above code?
sc2.subClassMethod(); //this is valid
sc1.subClassMethod(); // this is a compiler error,
// as no method named subClassMethod
// is present in the superClass as the
// reference is of superClass type
// for this you require a type cast
(subClass)sc1.subClassMethod(); // Now this is valid
}
}
オブジェクトは同じです。ただし、sc1
は型として宣言されているため、キャストせずにメソッドをsuperClass
使用することはできません。subClass
上記の回答に加えて、構築されたオブジェクトは実際にはタイプのオブジェクトであるため、 SubClass
キャストしてSubClass
メソッドを呼び出すことができます。
SuperClass superClass = new SubClass();
superClass.method1();
((SubClass)superClass).method2();
このように考えてください。親(スーパークラス)参照を使用すると、親が持っているもの(変数、メソッド)のみにアクセスできます。ただし、子の参照を使用すると、親と子が持つすべてのものが取得されます(子は親からプロパティを継承します)。
public class SuperClass {
public void method1(){
}
public void method3(){
}
}
public class SubClass extends SuperClass {
public void method2()
{
}
@override
public void method3(){
}
}
SubClass sub = new SubClass();
sub.method1(); //Valid through inheritance from SuperClass
sub.method2(); // Valid
sub.method3();//valid
superClass sc1 = new subClass();
superClass.method1();
superClass.method2();////compilation error: cannot find symbol method
superClass.method3();//run over ridden version
superClass sc1 = new subClass();
参照sc1(実際にはサブクラスオブジェクトを保持している)のスーパークラスで定義されているすべてのメソッドを呼び出すことができます。これは、サブクラスインスタンスがそのスーパークラスのすべてのプロパティを所有しているためです。
ただし、参照sc1 、.のサブクラスで定義されたメソッドを呼び出すことはできません。
// sc1はスーパークラス参照であるため、サブクラスのメソッドを呼び出すことはできません
これは、sc1がスーパークラスへの参照であり、サブクラスで定義されたメソッドを認識していないためです。
sc1はスーパークラスへの参照ですが、そのサブクラスのオブジェクトを保持しています。ただし、参照sc1はその内部IDを保持します。この例では、サブクラスはメソッドMethod3をオーバーライドします。sc1.Method3は、スーパークラスで定義されたバージョンではなく、サブクラスで定義されたオーバーライドされたバージョンを呼び出します。これは、sc1が実際にサブクラスオブジェクトを内部に保持しているためです。