超类对象是否可以引用未继承的子类成员方法?
Is it possible for a superclass object to refer a subclass member method which is not inherited?
在动态方法绑定中,超类引用只能调用被它继承和覆盖的子类方法。但是,否则可以实现。
abstract class in
{
abstract void print();
}
class a extends in
{
String name=this.getClass().getSimpleName();
void show()
{
System.out.println("class "+name);
}
void print()
{
show();
}
}
class Main
{
public static void main(String args[])
{
in x;
x = new a();
x.print();
}
}
到这里,打印成功了
class a
还有getClass() returns子类名而不是超类名因为this指的是main中的超类对象方法。
未来未知 今天编写 class A.java
的开发人员永远无法预测未来任何其他开发人员可能会使用的方法的名称或签名包括在他的 class 扩展 A.java
中。同样,这样的 classes 可能很多,每个都有单独的方法。
Base class 永远不应与其子 class 耦合。它一定不关心子 classes 是如何实现的。
虽然不推荐,但如果您希望调用子 class 之一中定义的方法,您可以通过 typecasting 来实现,如下所示。
public class Parent {
public class someMethod(){
if( this instanceof Child1){
((Child1)this).someAdditionalMethod();
}
}
}
public class Child1 extends Parent{
public class someAdditionalMethod(){
}
}
父对象引用仅受其 class 定义中的方法的约束。如果这些方法被 subclass 覆盖,并且在 运行 时,如果父引用引用的实际对象是 subclass 类型,那么将调用被覆盖的方法。被覆盖的方法调用的方法最初不存在于父 class 中,或者访问的变量不存在于父 class 中并不重要。
这就是多态性的意义所在。这是设计使然,因为它使程序扩展更容易,以防万一我们有不同的特定继承层次结构,其中父 class 不需要知道某些方法的确切实现并且可以使子[实现的东西] =14=]是某种合同。
在动态方法绑定中,超类引用只能调用被它继承和覆盖的子类方法。但是,否则可以实现。
abstract class in
{
abstract void print();
}
class a extends in
{
String name=this.getClass().getSimpleName();
void show()
{
System.out.println("class "+name);
}
void print()
{
show();
}
}
class Main
{
public static void main(String args[])
{
in x;
x = new a();
x.print();
}
}
到这里,打印成功了
class a
还有getClass() returns子类名而不是超类名因为this指的是main中的超类对象方法。
未来未知 今天编写 class A.java
的开发人员永远无法预测未来任何其他开发人员可能会使用的方法的名称或签名包括在他的 class 扩展 A.java
中。同样,这样的 classes 可能很多,每个都有单独的方法。
Base class 永远不应与其子 class 耦合。它一定不关心子 classes 是如何实现的。
虽然不推荐,但如果您希望调用子 class 之一中定义的方法,您可以通过 typecasting 来实现,如下所示。
public class Parent {
public class someMethod(){
if( this instanceof Child1){
((Child1)this).someAdditionalMethod();
}
}
}
public class Child1 extends Parent{
public class someAdditionalMethod(){
}
}
父对象引用仅受其 class 定义中的方法的约束。如果这些方法被 subclass 覆盖,并且在 运行 时,如果父引用引用的实际对象是 subclass 类型,那么将调用被覆盖的方法。被覆盖的方法调用的方法最初不存在于父 class 中,或者访问的变量不存在于父 class 中并不重要。
这就是多态性的意义所在。这是设计使然,因为它使程序扩展更容易,以防万一我们有不同的特定继承层次结构,其中父 class 不需要知道某些方法的确切实现并且可以使子[实现的东西] =14=]是某种合同。