Java多態中的若干問題

私有方法”複寫”

子類繼承父類後,private修飾的方法對子類是不可見的,因此存在複寫的可能。當子類中方法名與父類私有方法名相同時,容易造成混淆,應儘量避免此種情況。
Thinking in java中的相關例子
import static net.mindview.util.Print.*;
public class PrivateOverride {
private void f() { print("private f()");
}
public static void main(String[] args) {
PrivateOverride po = new Derived();
po.f();
}
}
class Derived extends PrivateOverride {
public void f() { print("public f()"); }
}

輸出:
private f()

字段與靜態方法

字段和靜態方法不具有多態特性。
名稱相同的public修飾的子類和父類中的字段分配的內存空間並不相同,因此在向上轉型後無法訪問子類字段。
靜態方法與類綁定,不與對象綁定,而多態是依靠對象與方法的動態綁定(運行時綁定)實現的,因此靜態方法也不具有多態性。
Thinking in Java中的相關例子
class Super {
public int field = 0;
public int getField() { return field; }
}
class Sub extends Super {
public int field = 1;
public int getField() { return field; }
public int getSuperField() { return super.field; }
}
public class FieldAccess {
public static void main(String[] args) {
Super sup = new Sub(); // Upcast
System.out.println("sup.field = " + sup.field +
", sup.getField() = " + sup.getField());
Sub sub = new Sub();
System.out.println("sub.field = " +
sub.field + ", sub.getField() = " +
sub.getField() +
", sub.getSuperField() = " +
sub.getSuperField());
}
}

輸出:
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0

構造器與多態

父類構造器會先於子類構造器調用
如果需要顯式回收內存,內存回收函數順序與構造器的調用調用順序相反
構造器中的多態表現與內存中變量初始化順序直接相關,初始化順序如下:
1)對象分配空間受限全部初始化爲0
2)調用父類構造器
3)子類的成員變量根據聲明的先後順序進行初始化
4)調用子類構造器
Thinking in Java中的相關例子
import static net.mindview.util.Print.*;
class Glyph {
void draw() { print("Glyph.draw()"); }
Glyph() {
print("Glyph() before draw()");
draw();
print("Glyph() after draw()");
}
}
class RoundGlyph extends Glyph {
private int radius = 1;
RoundGlyph(int r) {
radius = r;
print("RoundGlyph.RoundGlyph(), radius = " + radius);
}
void draw() {
print("RoundGlyph.draw(), radius = " + radius);
}
}
public class PolyConstructors {
public static void main(String[] args) {
new RoundGlyph(5);
}
}

輸出:
Glyph() before draw()
RoundGlyph.draw(), radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph(), radius = 5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章