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

使用上述代码创建的两个对象有什么区别?

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

于 2013-03-24T07:36:14.643 回答
2

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

使用superClassie的引用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

  }
}
于 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 调用 SuperClass 中定义的所有方法,(实际上是持有一个 Subclass 对象),这是因为子类实例拥有其超类的所有属性。

但是,您不能调用引用 sc1, 的子类中定义的方法。

// 不能调用子类中的方法,因为 sc1 是超类引用

这是因为 sc1 是对超类的引用,它不知道子类中定义的方法。

sc1 是对超类的引用,但包含其子类的对象。但是,引用 sc1 保留其内部标识。在我们的示例中,子类覆盖方法 Method3 。sc1.Method3 调用在子类中定义的覆盖版本,而不是在超类中定义的版本。这是因为 sc1 实际上在内部持有一个子类对象。

于 2021-12-26T05:59:30.043 回答