繁体   English   中英

(初学者Java)向下转换/向上转换/接口

[英](Beginner Java) Downcasting/Upcasting/Interface

我正在为考试而学习,但我陷入了以下问题。

可以编译以下内容吗? 如果是这样,它将运行吗? 输出是什么?

e) IX i = new C(); A a = (A) i; a.doIt(1.0);

// --- Interfaces and classes
interface IX {void doIt(double d);}

class A implements IX {
public void doIt(double d){out.println("doIt A");}}

class B extends A {public void doIt(int i){out.println("doIt B");}
}

class C extends A{public void doIt(double d){out.println("doIt C");}
}

class D {public void doIt(double d){out.println("doIt D");}
}

因此,经过一些谷歌搜索后,我对此的理解是:

当我们说IX i = new C(); 我们说的是:我们正在创建一个SOME类型的对象(它具有引用变量i ),但是无论它是什么类型,它都必须实现IX接口。 现在,该类型为C

好了,然后我们说引用变量a引用a类型A的对象,它引用的对象与i相同,但是将其转换为(A)

因此,当我们调用a.doit(1.0) ,编译器将查看a具有的类型,并检查是否有一个名为doIt的方法,该方法将double作为输入。 所以我的猜测是应该打印出"doIt A" ,但是我错了。 它打印出"doIt C" 我想念什么? 我确实尝试过使用Google,但是我发现向下转换/向上转换的整个主题都使atm感到困惑。

IX i = new C();

创建一个新的C实例,并为其分配静态类型IX-合法,因为C IX。

A a = (A) i;

创建引用A并将其分配给静态类型A。编译时和运行时安全。 我们知道A是C的父类。

a.doIt(1.0);

调度对对象a的方法调用,然后调用方法A :: doIt(double)。

实际(动态)类型C覆盖了此方法。因此应打印“ doIt C”。

如果我错了,请纠正我,但是会强制转换,例如Bar b = new Bar(); Foo a = Foo(b),其中Bar扩展Foo。 Foo有方法摆动,bar有重写方法摆动和新方法摆动。 然后b不能摆动,但可以摆动。 它将运行Bar版本的摆动。 因此,基本上,这仅意味着您只能运行Foo拥有的方法。 不是酒吧所拥有的方法。 但是,被Bar覆盖的Foo具有的方法(例如摆动)将通过Bar版本运行。 该界面应该使您绊倒。 因此,在一个代码示例中:

abstract class Foo{
    public void wobble() {
        //code A
    }
}

class Bar extends Foo{
    //overridden
    public void wobble() {
        //code B
    }

    public void wibble() {
        //some other code C
    }
}

public class Test {
    public static void main(String[] args) {
        Bar b = new Bar();
        b.wobble(); //runs code B
        b.wibble(); //runs code C

        Foo f = (Foo)b;
        f.wobble(); //runs code B
        f.wibble(); //doesn't compile

        Foo foo2 = new Foo(); //trick cannot instantiate abstract class
        foo2.wobble(); //runs code A (if instantiated which it cant be)
        foo2.wibble(); //will not compile because Foo does not have the wibble method
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM