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?
}
}
7 回答
简单说明:当你使用
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
ie的引用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
}
}
对象是一样的。但是,因为sc1
被声明为类型,所以superClass
您不能subClass
在不强制转换的情况下对其使用方法。
除了上面的答案,因为构造的对象实际上是一个类型的对象, SubClass
您可以将其转换为SubClass
并调用方法:
SuperClass superClass = new SubClass();
superClass.method1();
((SubClass)superClass).method2();
只是这样想。当您使用父级(超类)引用时,您将只能访问父级拥有的事物(变量、方法)。但是如果您使用孩子的引用,您将获得父母和孩子所拥有的一切(孩子从父母那里继承属性)。
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 实际上在内部持有一个子类对象。