Java 多态

原创
2019/04/27 11:08
阅读数 69

/*
 * 面向对象的三大特征:
    1. 封装
    2. 继承
    3. 多态
    
 * 多态
 * 多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象)或者是接口 的引用类型变量指向了接口实现类的对象)
 * 
 * 多态的前提:必须存在继承或者实现关系。
 * (不同情况的的身份是不一样的)
 *  老钟     老师
 *  老钟     员工
 *  老钟     路人甲
 *  老钟    老公
 *  
 *   动物  a  = new   狗();
 *   多态要注意的细节:
    1.  多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。    (成员变量-静态和非静态都可以)
    2.  多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
    3.  多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
    4.  多态情况下,不能访问子类特有的成员。
    
    总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。
 *   
 *   问什么不能访问不能访问子类特有的成员?
 *   回答:编译看左边,运行不一定看右边(和java编译器有关),
 *       编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。
 *           Animal_1 a = new Mouse("老鼠");
            Animal_1  a  中并不具备dig()函数;
 *  
 * */

 

 

abstract class Animal_1{

    String name;
    String  color = "动物色";
    public Animal_1(String name){
        this.name = name;
    }

    public abstract void run();

    public static void eat(){
        System.out.println("..动物在吃..");
    }
}
//老鼠
class  Mouse extends Animal_1{
    
    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_1 extends Animal_1 {

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

public class polymorphic {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Mouse m = new Mouse("老鼠");
        System.out.println(m.color);    //黑色
        
        //多态: 父类的引用类型变量指向子类的对象
        Animal_1 a = new Mouse("老鼠");
        a.run();
        System.out.println(a.color);    //动物色       访问父类
        a.eat();                        //动物在吃   访问父类
        //a.dig()                       //老鼠特有的方法,不能访问
        
    }

}


/*
 * 多态的应用:
      1. 多态用于形参类型的时候,可以接收更多类型的数据 。
      2. 多态用于返回值类型的时候,可以返回更多类型的数据。
      
 *  多态的好处: 提高了代码的拓展性。
 *  需求1 :定义一个函数,可以接受任意类型的图形对象,并且可以打印图像的面积和周长
 *  需求2 :定义一个函数可以返回任意类型的图形对象。
 * 
 * */

 

//图形类
abstract class MyShape{

    public abstract void getArea();
    public abstract void getLength();    
}

class Circle1 extends MyShape{         //圆形

    public static final double PI = 3.14;
    double r;
    public Circle1(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));
    }
}

public class polymorphic_01 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        // 需求1 :定义一个函数,可以接受任意类型的图形对象,并且可以打印图像的面积和周长
        Circle1 c = new Circle1(4.0);
        print(c);

        Rect r = new Rect(3,4);
        print(r);
        
        MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
        m.getArea();
        m.getLength();
        
    }
    
    public static void print (MyShape s){   
        //MyShape m = getShape(0);    //这个就是调用了使用多态的方法,定义的变量类型要与返回值类型一致。
        //多态用于形参类型的时候,可以接收更多类型的数据 。
        
        s.getArea();
        s.getLength();
    }
    
    // 需求2: 定义一个函数可以返回任意类型的图形对象。
        public static MyShape  getShape(int i){
            if (i==0){
                return new Circle1(4.0);
            }else{
                return new Rect(3,4);
            }
        }

    
//    //多态之前,可以使用函数重载解决这个问题,但是程序的拓展性很差
//    public static void print (Rect c){
//        
//    }
//    public static void print (Circle c){
//            
//    }

}

 

 

 

展开阅读全文
加载中
点击加入讨论🔥(1) 发布并加入讨论🔥
打赏
1 评论
0 收藏
0
分享
返回顶部
顶部