2 回答

TA貢獻(xiàn)1846條經(jīng)驗(yàn) 獲得超7個(gè)贊
僅僅因?yàn)橐粋€(gè)類不能被實(shí)例化并不意味著你不能得到它的一個(gè)實(shí)例。
在您的示例中,您所做的只是將其轉(zhuǎn)換為 Graphics 層次結(jié)構(gòu)中的另一個(gè)類。
這是一個(gè)例子。
public class AbstractDemo {
public static void main(String[] args) {
Concrete c = new Concrete();
AClass a = (AClass) c;
a.me();
}
}
abstract class AClass {
public void me() {
System.out.println("Abstract parent");
}
}
class Concrete extends AClass {
}

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超6個(gè)贊
一個(gè)類是抽象的只是意味著你不能直接創(chuàng)建這樣一個(gè)類。一旦有了這樣的類,就可以對(duì)其進(jìn)行強(qiáng)制轉(zhuǎn)換,使其看起來(lái)像是它的任何子類。換句話說(shuō),所有“抽象”意味著你不能做:
SomeAbstractClass obj = new SomeAbstractClass(...);
你可以引用一個(gè)Graphics2D對(duì)象,就像你的例子一樣,但是如果你要求 Java 告訴你對(duì)象的真實(shí)類型,它實(shí)際上永遠(yuǎn)不會(huì)是一個(gè)Graphics2D對(duì)象。從這段代碼中,您不能確定所討論對(duì)象的真實(shí)類型也是一個(gè)Graphics對(duì)象。這可能再次是對(duì)真實(shí)對(duì)象的子類的引用,例如 maybeMyGraphicsObject或類似的東西。
這就是多態(tài)性的全部意義和威力。一旦你創(chuàng)建了一個(gè)對(duì)象,它的行為就像它的任何子類一樣,并且可以通過(guò)向上轉(zhuǎn)換將它視為任何這些子類的純實(shí)例。
下面是一些代碼,指出向上轉(zhuǎn)型的對(duì)象的標(biāo)識(shí)會(huì)發(fā)生什么:
abstract class Abstract {
public void whatAmI() {
System.out.println("I'm Abstract");
}
}
class Concrete extends Abstract {
@Override
public void whatAmI() {
System.out.println("I'm Concrete");
}
}
public class X {
public static void main(String[] args) {
// This won't compile. That's what it means for "Abstract" to be abstract.
// Abstract abs = new Abstract();
// You can create a Concrete, and then upcast it to an Abstract reference...
Concrete concrete = new Concrete();
Abstract abs = (Abstract)concrete;
// But it's stll really a Concrete
System.out.println(abs.getClass().getName());
// And it will still act like a Concrete if Concrete has overridden one of Abstract's methods.
abs.whatAmI();
}
}
結(jié)果:
org.littleshoot.proxy.inlet.Concrete
I'm Concrete
請(qǐng)注意,如果您向 Java 詢問(wèn)對(duì)象的類型,即使您已經(jīng)通過(guò)抽象引用詢問(wèn)了對(duì)象的類型,它仍然是具體的。另請(qǐng)注意,如果您在抽象類上調(diào)用已在具體中被覆蓋的方法,則將調(diào)用具體的版本。
添加回答
舉報(bào)