我是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
。