多態1

package c;



    /*
    面向對象的三大特徵:
        1. 封裝
        2. 繼承。
        3. 多態

    多態:一個對象具有多種形態。(父類的引用類型變量指向了子類的對象)

    或者是接口 的引用類型變量指向了接口實現類的對象)

    多態的前提:必須存在繼承或者實現 關係。

        動物  a  = new   狗();

    多態要注意 的細節:
        1.  多態狀況下,子父類存在同名的成員變量時,訪問的是父類的成員變量。
        2.  多態狀況下,子父類存在同名的非靜態的成員函數時,訪問的是子類的成員函數。
        3.  多態狀況下,子父類存在同名的靜態的成員函數時,訪問的是父類的成員函數。

        4.  多態狀況下,不能訪問子類特有的成員。

    總結:多態狀況下,子父類存在同名的成員時,訪問的都是父類的成員,除了在同名非靜態函數時纔是訪問子類的。

    編譯看左邊,運行不必定看右邊。

    編譯看左邊:java編譯器在編譯的時候,會檢查引用類型變量所屬的類是否具有指定的成員,若是不具有立刻編譯報錯。


    */


    //動物類
    abstract class Animal{

        String name;

        String  color = "動物色";

        public Animal(String name){
            this.name = name;
        }

        public abstract void run();

        public static void eat(){
            System.out.println("動物在吃..");
        }

    }

    //老鼠
    class  Mouse extends Animal{

        String color = "黑色";

        public Mouse(String name){
            super(name);
        }
        
        public  void run(){
            System.out.println(name+"四條腿慢慢的走!");
        }

        public static void eat(){
            System.out.println("老鼠在偷吃..");
        }

        //老鼠特有方法---打洞
        public void dig(){
            System.out.println("老鼠在打洞..");
        }
    }



    class Fish extends Animal {

        public Fish(String name){
            super(name);
        }
        
        
        public  void run(){
            System.out.println(name+"搖搖尾巴游..");
        }
    }

    public class duotai {
        public static void main(String[] args) 
        {
            /*
            Mouse m = new Mouse("老鼠");
            System.out.println(m.color);
            
            //多態: 父類的引用類型變量指向子類的對象
            */
            Animal a = new Mouse("老鼠");
            //a.dig();//不能指向子類特有的成員
            a.eat();
        }    
    }

 

 

多態的應用java

/*
多態的應用:
  1. 多態用於形參類型的時候,能夠接收更多類型的數據 。
  2. 多態用於返回值類型的時候,能夠返回更多類型的數據。



多態的好處: 提升了代碼的拓展性。

需求1: 定義一個函數能夠接收任意類型的圖形對象,而且打印圖形面積與周長。
*/

//圖形類
abstract class MyShape{

    public abstract void getArea();

    public abstract void getLength();    
}



class Circle extends MyShape{

    public static final double PI = 3.14;

    double r;

    public Circle(double r){
        this.r =r ;    
    }

    public  void getArea(){
        System.out.println("圓形的面積:"+ PI*r*r);
    }

    public  void getLength(){
        System.out.println("圓形的周長:"+ 2*PI*r);
    }
}


class Rect  extends MyShape{

    int width;

    int height;

    public Rect(int width , int height){
        this.width = width;
        this.height = height;
    }

    public  void getArea(){
        System.out.println("矩形的面積:"+ width*height);
    }

    public  void getLength(){
        System.out.println("矩形的周長:"+ 2*(width+height));
    }
}



class Demo12 {

    public static void main(String[] args) 
    {
        /*
        //System.out.println("Hello World!");
        Circle c = new Circle(4.0);
        print(c);

        Rect r = new Rect(3,4);
        print(r);
        */

        MyShape m = getShape(0); //調用了使用多態的方法,定義的變量類型要與返回值類型一致。
        m.getArea();
        m.getLength();
        

    }


    //需求1: 定義一個函數能夠接收任意類型的圖形對象,而且打印圖形面積與周長。
    public static void print(MyShape s){ // MyShpe s = new Circle(4.0);
        s.getArea();
        s.getLength();
    }


    // 需求2: 定義一個函數能夠返回任意類型的圖形對象。
    public static MyShape  getShape(int i){
        if (i==0){
            return new Circle(4.0);
        }else{
            return new Rect(3,4);
        }
    }


}
相關文章
相關標籤/搜索