什么是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
对象,但引用会有所不同。
使用superClass
即sc1
的引用,您将无法调用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
类型的对象,你可以将它SubClass
为SubClass
并调用方法:
SuperClass superClass = new SubClass(); superClass.method1(); ((SubClass)superClass).method2();