gpt4 book ai didi

java - 父类(super class)和子类解析?

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

我是 java 编程的新手,也是 stackoverflow 的新手。遇到了这个我无法理解的简单代码。请帮助我这是如何工作的

class Base {
public static void foo(Base bObj) {
System.out.println("In Base.foo()");
if(bObj instanceof Base){
System.out.println("Base instance");
}
bObj.bar();
}

public void bar() {
System.out.println("In Base.bar()");
}
}
class Derived extends Base {
public static void foo(Base bObj) {
System.out.println("In Derived.foo()");
bObj.bar();
}
public void bar() {
System.out.println("In Derived.bar()");
}
}
class Downcast {
public static void main(String []args) {
Base bObj = new Derived();
bObj.foo(bObj);
}
}

现在我明白了

In Base.foo()
Base instance
In Derived.bar()

虽然我知道它是如何进行的base.foo()。但它是如何派生的。它还打印出它是一个基础对象的实例,然后是如何派生的。给出的解释是早些时候它做了静态解析和后来的动态解析。什么是静态解析和动态解析。

我虽然这个概念是这样的

Base b=new Derived();

这意味着我们创建一个派生对象,然后将其向上转换为 Base。那么为什么不调用 base.bar() 呢?

提前致谢。

最佳答案

这就是多态性的核心。 Java 中的对象试图以与真实对象相同的方式运行。

自行车通常有 3 个档位。

竞赛自行车是自行车。但是他们有 18 个齿轮。

如果我给你看一辆竞赛自行车,然后问你“Is it a bike”,答案是肯定的,没错。但是如果我问你“这辆自行车有多少个齿轮”,你会回答“18”,因为它虽然是自行车,但它是一种特殊类型的自行车,没有像普通自行车那样的 3 个齿轮,而是 18 个。

Java 对象也一样:

Base bObj = new Derived();

相同
Bike bike = new CompetitionBike();

即您正在制造一辆自行车,而自行车的具体类型是“竞赛自行车”。所以,如果你问自行车有多少档位,答案将是 18:

bike.getGears(); // 18

同样,

bObj.bar();

将调用在对象的具体类型中定义的 bar() 方法,该对象是 Derived。因此将打印“In Derived.bar()”。

静态方法不遵循这些规则,因为静态方法不是在对象上调用,而是在类上调用。

调用 bObj.foo(bObj) 是合法的,但却是极其糟糕的做法。您应该调用的是 Base.foo()Derived.foo(),具体取决于您要调用的方法。并且将调用在给定类上定义的方法。当您执行错误 操作并调用bObj.foo() 时,编译器实际上会将bObj 转换为声明的 bObj 的类型,即 Base

关于java - 父类(super class)和子类解析?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24354386/

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