什么是subClass sc = new subClass()和superClass sc = new subClass之间的区别?

时间:2013-03-24 07:34:39

标签: java object initialization

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?

}
}

6 个答案:

答案 0 :(得分:5)

简单说明: 当你使用

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.

答案 1 :(得分:2)

  

使用上面的代码创建的两个对象之间的区别是什么?

这两个对象完全相同。不同的是存储对象引用的变量的类型。在实践中,这意味着如果有任何特定于subClass的方法,您将能够通过sc2访问它们,但不能通过sc1访问它们(后者需要强制转换)。

答案 2 :(得分:2)

在这两种情况下,都会创建subClass的对象,但引用会有所不同。

引用superClasssc1,您将无法调用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

  }
}

答案 3 :(得分:1)

对象是一样的。但是,由于sc1被声明为superClass类型,因此您无法在不进行转换的情况下使用subClass方法。

答案 4 :(得分:1)

除上述答案外,由于构造的对象实际上是SubClass类型的对象,您可以将其强制转换为SubClass并调用方法:

SuperClass superClass = new SubClass();
superClass.method1();
((SubClass)superClass).method2();

答案 5 :(得分:0)

就这样想。 当您使用父(超类)引用时,您将只能访问父项具有的内容(变量,方法)。但是如果你使用孩子的引用,你将获得父母和孩子所拥有的一切(孩子从父母那里继承属性)。