0

我想知道,超类是否有可能访问继承的子类的方法,例如在 Java 中?

我知道子类可以覆盖甚至实现,在抽象类的情况下,超类的方法,但是上面提到的问题是可能的吗?

谢谢

4

4 回答 4

0

Java、PHP、Ruby、Python、C#(等等)方法总是virtual,所以,无论如何,当你在子类中重写一个方法时,这个版本将被调用:

public class SuperClass {
    public void someMethod() {
        otherMethod();
    }

    public void otherMethod() {
        System.out.println("Super");
    }
}

public class SubClass extends SuperClass {
    public void otherMethod() {
        System.out.println("Sub");
    }
}

SubClass o1 = new SubClass();
o1.someMethod(); // Outputs: Sub 

SuperClass o2 = new SubClass();
o2.someMethod(); // Also outputs: Sub

因此,您不仅可以访问您的子类方法,而且还必须这样做。

只是为了比较,例如,在 C++ 中,事情的工作方式不同。如果您不将方法声明为虚拟方法,则无法覆盖它。

于 2013-11-12T13:24:51.063 回答
0

c#中的示例..在超类中制作抽象方法,在派生类中实现

public abstract class SuperCLass
{
    public void CallSubMethod()
    {
        Test(); // calls method in derived class
    }
    public abstract void Test();
}

public class SubClas : SuperCLass
{
    public override void Test()
    {
        // code here 
    }
}
于 2013-11-12T13:16:59.083 回答
0

我会尽力解释他们在大学时向我解释的。

你有一个参考:

Object o = new Object()
  • 他的静态类型(ST)是 Object :这是他自己的类型,永远不会改变。

  • 他的动态类型(DT)也是Object(在这种情况下):指向Object类型对象的引用,但它可以改变。

    例如,如果我写:

    Object o = new String("abc") // now his ST == Object but the DT == String
    

话虽如此:

  • 向上转型总是被允许的:考虑两个引用sr。赋值 s=r 总是编译和执行 if ST(r) <= ST(s)(在层次结构中, r 的静态类型小于或等于s静态类型

    例如:

    class A { }
    class B extends A { }
    ...
    A a = new A(); B b = new B();
    a = b  // OK, upcast
    
  • 向下转换:在编译时,如果XY属于层次结构,则从X类型向下转换为Y类型始终是合法的。考虑参考s。我想将s 强制转换为类型C,因此如果 C <= TS(s) 如果我将强制转换为: C r = (C)s

    例如:

    class A { }
    class B extends A { }
    class C extends A { }
    ...
    A a = new A(); B b = new B();
    C c = new C();
    ...
    b = c // ILLEGAL
    b = (B)a // OK at compile-time but maybe at run-time it is not!
    

    如果向下转换失败,当我们运行我们的应用程序时,Java 会引发一个异常。否则就成功了。

    正确地向下转换: 考虑一个引用ref并且我们想要转换为类型C。因此,如果DT(ref) <= C <= ST(ref).
    并且沮丧将获得为:C ref2 = (C)ref

    例如:

    // I suggest to write the hierarchy in a piece of paper and 
    // try the rules before coding.
    
    class A { }
    class B extends A { }
    class C extends A { }
    class D extends B { }
    ...
    
    A a = new A(); B b = new B();
    C c = new C(); D d = new D();
    A r = new B();
    A s = new D();
    a = b; // OK, upcast
    a = d; // OK, upcast
    /* b = c; */ // ILLEGAL
    b = (B)r; // OK, downcast
    d = (D)r; // downcast: it compiles, but fails at run-time
    d = (D)s; // OK, downcast
    /* b = s; */ // ILLEGAL
    /* d = (D)c; */ // ILLEGAL
    b = (B)s; // OK, downcast
    b = (D)s; // OK, downcast
    

PS:如果我写错了,请原谅,但我写的有点匆忙。

于 2013-11-12T15:47:20.893 回答
-1

在 Java 中,这是不可能的,而且我认为你所要求的会违背 OOP。

于 2013-11-12T14:47:36.263 回答