java的多态
多態性是OOP中的重要特性,在java中,多態性主要通過重載和重寫兩種方式實現。
當一個父類有多個子類,通過多態可正確地調用不同子類的方法:
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 */?
?
但是也有需要注意的地方,如當父類的變量和方法為私有時:
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*/結果并不是我們所認為的“public function public name”。因為父類的私有成員對子類是屏蔽的,無法被重寫,所以jvm直接調用父類的func方法,不會再檢查子類,即使子類中擁有同名方法,也會被認為是新的方法。
為了避免出錯,最好不要在子類中出現與父類私有成員同名的成員,以免被誤導。
?
再來看一個例子:
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 */當子類對象向上轉型為父類對象,并直接調用成員變量時,調用的是父類的成員變量;調用的成員方法還是子類的成員方法。
所以在繼承過程中,如果成員變量可能要被覆蓋,最好將其設置為private,并用get,set方法來對其進行操作,這種方法在很多情況下都會用到,例如在封裝新的數據類型時。
?
轉載于:https://www.cnblogs.com/zhisuoyu/p/5276703.html
總結
- 上一篇: Android毛玻璃处理代码(Blur)
- 下一篇: DJANGO中,用QJUERY的AJAX