java的多态
多態(tài)性是OOP中的重要特性,在java中,多態(tài)性主要通過重載和重寫兩種方式實現(xiàn)。
當(dāng)一個父類有多個子類,通過多態(tài)可正確地調(diào)用不同子類的方法:
class Shape{public void draw(){System.out.println("draw a shape");} }class Square extends Shape{@Overridepublic void draw() {System.out.println("draw a square");} }class Circle extends Shape{@Overridepublic void draw() {System.out.println("draw a circle");} }class PolyTest{public static void main(String[] args) {Shape[] shapes=new Shape[10];for (int i = 0; i < shapes.length; i++) {shapes[i]=new Random().nextInt(2)==0?new Square():new Circle();}for (Shape shape : shapes) {shape.draw();}} }/* output: draw a square draw a circle draw a square draw a circle draw a circle draw a square draw a square draw a circle draw a square draw a circle */?
?
但是也有需要注意的地方,如當(dāng)父類的變量和方法為私有時:
class Super {private String name = "private name";private void func() {System.out.println("private function");}public static void main(String[] args) {Super sup = new Sub();sup.func();System.out.println(sup.name);} }class Sub extends Super {public String name = "public name";public void func() {System.out.println("public function");} }/** output: private function private name*/結(jié)果并不是我們所認為的“public function public name”。因為父類的私有成員對子類是屏蔽的,無法被重寫,所以jvm直接調(diào)用父類的func方法,不會再檢查子類,即使子類中擁有同名方法,也會被認為是新的方法。
為了避免出錯,最好不要在子類中出現(xiàn)與父類私有成員同名的成員,以免被誤導(dǎo)。
?
再來看一個例子:
class Super {public String name = "super name";public String getName() {return name;} }class Sub extends Super {public String name = "sub name";public String getName() {return name;}public String getSupName() {return super.name;} }class PolyTest {public static void main(String[] args) {Super sup = new Sub();System.out.println("sup name:" + sup.name + ";sup.getName:" + sup.getName());Sub sub = new Sub();System.out.println("sub name:" + sub.name + ";sub.getName:" + sub.getName() + ";sub.getSupName:" + sub.getSupName());} }/* output:sup name:super name;sup.getName:sub name sub name:sub name;sub.getName:sub name;sub.getSupName:super name */當(dāng)子類對象向上轉(zhuǎn)型為父類對象,并直接調(diào)用成員變量時,調(diào)用的是父類的成員變量;調(diào)用的成員方法還是子類的成員方法。
所以在繼承過程中,如果成員變量可能要被覆蓋,最好將其設(shè)置為private,并用get,set方法來對其進行操作,這種方法在很多情況下都會用到,例如在封裝新的數(shù)據(jù)類型時。
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhisuoyu/p/5276703.html
總結(jié)
- 上一篇: Android毛玻璃处理代码(Blur)
- 下一篇: DJANGO中,用QJUERY的AJAX