在Java中调用派生类中的方法

时间:2013-12-27 11:05:44

标签: java oop method-overriding

我用Java编写了这个示例。

public class Person {
    public static void ShowInfo() {
        System.out.println("I am Person");
    }
}

public class Student extends  Person {
    public static void ShowInfo() {
        System.out.println("I am Student");
    }
}

当我运行此代码时:

 Person person = new Student();
 person.ShowInfo();

为什么我会获得I am Person

5 个答案:

答案 0 :(得分:2)

很简单。在Java中,派生类是隐式多态的。在C#中,您需要virtualoverride个关键字(当使用abstract类或interface时)才能获得相同的行为。

虽然要在Java中获得相同的C#“行为”,但您只需在方法签名中的final关键字上进行标记:

public final void ShowInfo() {
        System.out.println("I am Student");
}

我不知道Java中的静态方法是多态的:这是你的实际代码吗?

答案 1 :(得分:1)

对于

为什么我知道我是谁。

我不知道为什么这个答案不适合你。

我想说两件事:

  • 默认情况下,java方法是虚拟的。但是默认情况下静态方法不是虚拟的,因此这不是动态多态的情况。如果它是多态的,你会得到“我是学生”而不是“我是人”。
  • 使用obj引用调用静态方法确实是一种不好的做法,更喜欢用 ClassName
  • 调用它

答案 2 :(得分:1)

您所做的不是方法重载而是方法隐藏。静态方法可以在子类中重新定义(具有相同的签名),这称为方法隐藏。调用的静态方法的版本(子类或父类中的版本)取决于引用类型,而不是运行时的实际实例类型。

答案 3 :(得分:0)

Lews Therin(我看到的TWoT的粉丝)是对的:

试着写下这个:

public class Teacher : Person
{
    public override void ShowInfo()
    {
        Console.WriteLine("I am a teacher");
    }
}

看看你得到了什么

答案 4 :(得分:0)

在Java中,默认情况下所有方法都是虚拟的。这就是为什么你在Java中获得重写方法(也是默认方法),即使引用属于基类型。