我是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 b=new Derived();


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

提前致谢。

最佳答案

这就是多态性的核心。 Java中的对象尝试行为与真实对象相同。

自行车通常有3档。

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

如果我给您看一辆竞赛自行车并问您“这是一辆自行车”,答案是肯定的。但是,如果我问您“这辆自行车有多少个齿轮”,您会回答“ 18”,因为尽管这是一辆自行车,但它是一种特殊类型的自行车,没有普通自行车的3个齿轮,而是18个齿轮。

Java对象也是如此:

Base bObj = new Derived();


是相同的

Bike bike = new CompetitionBike();


即您正在建造一辆自行车,而该自行车的具体类型是“竞争自行车”。因此,如果您询问自行车有多少个档位,答案将是18:

bike.getGears(); // 18


同样,

bObj.bar();


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

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

调用bObj.foo(bObj)是合法的,但是这是非常糟糕的做法。您应该调用的是Base.foo()还是Derived.foo(),具体取决于您要调用的方法。然后将调用在给定类上定义的方法。当您做错事并调用bObj.foo()时,编译器实际上会将bObj转换为声明的bObj类型,即Base

07-27 23:35