gpt4 book ai didi

java - 多态性和压倒一切的困惑

转载 作者:行者123 更新时间:2023-11-29 03:09:07 25 4
gpt4 key购买 nike

最近我的老师在教多态,他教多态有两个方面

  1. 运行时多态性

  2. 编译时多态性

然后他向我们展示了这段代码

class A {
void ab(){
System.out.println("ab() in class A");
}
}

class B extends A {
void ab(){
System.out.println("ab() in class B");
}
}

class ObCo {
public static void main(String args[]){
A a1 = new B();
a1.ab();
}
}

输出是ab() in class B

当我尝试下面的代码时,

class A {
int i = 10;
}

class B extends A {
int i = 100;
}

class ObCo {
public static void main(String args[]){
A a1 = new B();
System.out.println(a1.i);
}
}

根据前面的代码,输出应该是100,但是输出是10,这让我产生了这些疑问。

  1. 多态性是一个只与重写方法相关的概念吗?
  2. 第一个代码块与多态相关吗?
  3. 如果是,什么是运行时多态性和编译时多态性?
  4. 如果没有,请给我一个出现多态性的例子。

非常感谢对这些问题的详细回答。

最佳答案

多态性仅适用于非静态非最终方法。你试过的代码不是多态而是field hiding (强调我的):

Within a class, a field that has the same name as a field in the superclass hides the superclass's field, even if their types are different. Within the subclass, the field in the superclass cannot be referenced by its simple name. Instead, the field must be accessed through super, which is covered in the next section. Generally speaking, we don't recommend hiding fields as it makes code difficult to read.

考虑到这一点,回答您的问题:

  1. Is Polymorphism a concept only related to Overriding methods?

是的。

  1. Is the first code block is relevant to Polymorphism?

是的。

  1. If yes, What is run-time Polymorphism and compile-time Polymorphism?

在 Java 中,所有非 staticfinal 方法都是 virtual methods默认情况下,所以如果一个子类有一个方法相同 signature (相同的输入类型,相同的输出类型)父类(super class),即使这不是您的意图,也会覆盖此方法。编译器甚至会发出警告,指出子类中的方法必须使用 @Override 注解来通知其他程序员该方法正在被覆盖。

在 Java 中,根据本教程,方法重载称为编译时多态性(真是个奇怪的名字)。

4.If no, Please give me an example where Polymorphism is seen.

您已经有这样的方法覆盖(动态)示例。

这是方法重载(静态)的另一个例子:

public class Foo {
public void print(int x) {
System.out.println("Printing number: " + x);
}
public void print(String x) {
System.out.println("Printing string: " + x);
}
public static void main(String[] args) {
Foo foo = new Foo();
foo.print(5);
foo.print("5");
}
}

输出:

Printing number: 5
Printing string: 5

关于java - 多态性和压倒一切的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30440037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com