4
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?

}
}
4

7 に答える 7

9

簡単な説明:使用する場合

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.
于 2013-03-24T07:37:12.560 に答える
2

上記のコードを使用して作成された2つのオブジェクトの違いは何ですか?

2つのオブジェクトはまったく同じです。異なるのは、オブジェクト参照が格納されている変数のタイプです。実際には、これは、に固有のメソッドがある場合subClass、を介してアクセスすることはできますが、を介してアクセスすることはできないことをsc2意味しますsc1(後者にはキャストが必要です)。

于 2013-03-24T07:36:14.643 に答える
2

どちらの場合も、のオブジェクトsubClassが作成されますが、参照は異なります。

superClassieを参照すると、に存在するがに存在しないsc1メソッドを呼び出すことはできません。メソッドを呼び出すにはキャストが必要になります。subClasssuperClasssubClass

好き :

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

  }
}
于 2013-03-24T07:38:47.710 に答える
1

オブジェクトは同じです。ただし、sc1は型として宣言されているため、キャストせずにメソッドをsuperClass使用することはできません。subClass

于 2013-03-24T07:36:04.400 に答える
1

上記の回答に加えて、構築されたオブジェクトは実際にはタイプのオブジェクトであるため、 SubClassキャストしてSubClassメソッドを呼び出すことができます。

SuperClass superClass = new SubClass();
superClass.method1();
((SubClass)superClass).method2();
于 2014-06-14T10:31:26.727 に答える
0

このように考えてください。親(スーパークラス)参照を使用すると、親が持っているもの(変数、メソッド)のみにアクセスできます。ただし、子の参照を使用すると、親と子が持つすべてのものが取得されます(子は親からプロパティを継承します)。

于 2013-03-24T08:44:51.780 に答える
0
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が実際にサブクラスオブジェクトを内部に保持しているためです。

于 2021-12-26T05:59:30.043 に答える