Java复习笔记(十五)多态

多态

一、定义:

  多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。
  具体来说说多态就是一个对象具备多种形态。父类的引用类型变量指向了子类的对象,或者是接口的引用类型变量指向了接口实现类的对象。

二、多态的前提:

  必须存在继承或者实现关系。

三、多态的实现形式:

父类  对象名  = new  子类();

四、多态要注意的细节:

  1. 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。
  2. 多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。
  3. 多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。
  4. 多态情况下,不能访问子类特有的成员。

 总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的成员。(原因:编译看左边,运行不一定看右边。)

abstract class Animal {     //定义一个动物类作为父类
    String color = "AnimalColor";
    String name;

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

    public void eat(){
        System.out.println(this.name+"is eating!");//动物通用的eat方法
    }
    abstract public void move();
}

class Dog extends Animal {

    String color = "黑色";

    public Dog(String name){
        super(name);
    }

    @Override
    public void move() {
        System.out.println(this.name+"is running!");
    }

    public void wang(){
        System.out.println("wangwang!");
    }
}

class Cat extends Animal {

    String color = "CatColor";  //子类与父类同名的成员变量

    public Cat(String name){
        super(name);
    }

    @Override
    public void move() {
        System.out.println(this.name+"is running!");
    }

    public void eat(){
        System.out.println(this.name+"is eating fish!");//子类中重写的eat方法
    }

    public void miao(){
        System.out.println("miaomiao!");
    }
}

public class Mian {

    public static void main(String args[]){
        Animal d = new Dog("2HA");
        System.out.println(d.color+"的"+d.name);
        d.eat();
        d.move();
        ((Dog) d).wang();

        Animal c = new Cat("Tom");
        System.out.println(c.color+"的"+c.name);
        c.eat();
        c.move();
        //c.miao();  error  注意:多态情况下,不能访问子类特有的成员
        ((Cat) c).miao();
    }
}
//AnimalColor的2HA
//2HAis eating!
//2HAis running!
//wangwang!
//AnimalColor的Tom       注意: 多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量
//Tomis eating fish!     注意:多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数
//Tomis running!
//miaomiao!

五、多态的应用:

1.多态用于形参类型的时候,可以接收更多类型的数据 。

public class Mian {

    public static void main(String args[]){
        Circle c = new Circle(4.0);
        print(c);

        Rect r = new Rect(3,4);
        print(r);
    }
    public static void print(MyShape s){ // 可以传入各种MyShape的子类
        s.getArea();
        s.getLength();
    }
}

2.多态用于返回值类型的时候,可以返回更多类型的数据。

public class Mian {

    public static void main(String args[]){
        MyShape m = getShape(0); //调用了使用多态的方法,定义的变量类型要与返回值类型一致。
        m.getArea();
        m.getLength();
        MyShape n = getShape(1);
        n.getArea();
        n.getLength();
    }
    public static MyShape  getShape(int i){
        if (i==0){
            return new Circle(4.0);
        }else{
            return new Rect(3,4);
        }
    }
}

示例代码的剩余部分

//图形类
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));
    }
}

六、多态的好处: 提高了代码的拓展性。

猜你喜欢

转载自blog.csdn.net/qq_29615991/article/details/80307812
今日推荐