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

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

简单说明:使用时

 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. 

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

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

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

使用superClasssc1的引用,您将无法调用subClass存在的方法,但不能调用superClass中的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方法。

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

除了上面的答案,因为构造的对象实际上是SubClass类型的对象,你可以将它SubClassSubClass并调用方法:

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