面向对象的三大特征之一:多态

面向对象三大特征:  封装  ,  继承  ,  多态.

1.多态

2.多态的前提

3.多态的表现形式及如何访问成员

4.多态的好处

5.多态的弊端以及解决方案


面向对象三大特征:  封装  ,  继承  ,  多态.

 

1.多态

多态指的是一种事物,在不同时刻,所表现出的不同状态。

  • 例如生活中猫是猫类的一种也是动物类的一种.
  • 在Java中就是可以 Cat cat=new Cat(); (猫是猫类的一种),也可以 Animal an=new Cat(); (猫是动物类的一种).

2.多态的前提

  •  要有继承,如果没有继承,多态就无从谈起。
  •  要有方法重写,如果不重写,语法层面不报错,但是失去了多态的意义。
  •  要有父类引用指向子类对象。即父 f =  new 子();

3.多态的表现形式及如何访问成员

  • 访问成员变量时,编译看左边,运行看左边。
  • 访问成员方法时,编译看左边,运行看右边。(假如子类没有重写该方法,仍然访问父类种的方法)
  • 访问静态方法时,编译看左边,运行看左边。(静态和类相关,算不上重写,所以,访问还是左边的)

(注意)构造方法:创建子类对象的时候,会先访问父类的构造方法,对父类的数据进行初始化。具体介绍点击这里查看   ------->    这里这里

//定义多态测试类
public class duotaiTest {
    public static void main(String[] args) {
        //多态的表现(父类引用指向子类对象)
        //访问成员变量,编译看左边,运行也看左边。 左边就是父类,右边是子类
        Fu fu = new Zi();
        System.out.println(fu.num);     //输出20
        
        //多态形式访问成员方法,编译看左边,运行看右边。左边就是父类,右边是子类,假如子类没有重写该方法,那么就运行父类的。
        fu.show();                      //调用子类中重写后的方法,输出zi show
        fu.start();                     //调用父类中的方法,输出fu start
        
        //多态形式方法静态方法,访问的还是父类的静态方法,静态方法不参与重写。
        fu.hehe();                      //调用的是父类中的方法,输出 父类静态方法
        Fu.hehe();                      //类名调用方法,输出 父类静态方法
        Zi.hehe();                      //类名调用方法,输出 子类静态方法
    }
}
//定义父类
class Fu {
    int num = 20;
    public void show() {           //子类中重写该方法
        System.out.println("fu show");
    }
    public void start(){           //子类中不重写该方法
        System.out.println("fu start");
    }
    public static void hehe() {
        System.out.println("父类静态方法");
    }
}
//定义子类
class Zi extends Fu {
    int num = 10;

    @Override
    public void show() {           
        System.out.println("zi show");
    }


    public static void hehe() {
        System.out.println("子类静态方法");
    }
}

4.多态的好处

  •  提高了代码的维护性(继承保证)
  •  提高了代码的扩展性(由多态保证) 

5.多态的弊端以及解决方案

多态的弊端: 不能直接使用子类中特有的功能.上面已经学到了访问成员方法时,编译看左边,运行看右边。但是子类中特有的功能,父类中是没有的,所以会编译出错的!

解决方案: 把父类的引用强制转换为子类的引用即可。(向下转型,而多态,其实就是向上转型.)

//测试类
public class duotaiTest2 {
    public static void main(String[] args) {
        Father f = new Son();      //多态,向上转型。
        f.show();                  //zi show
        //f.hehe();不能直接访问子类特有的方法。
        //向下转型
        Son son = (Son) f;
        son.hehe();   //转型之后就可以访问子类特有功能了   输出  子类特有的方法"
    }
}
//父类
class Father {

    public void show() {
        System.out.println("fu show");
    }
}
//子类
class Son extends Father {
    @Override
    public void show() {
        System.out.println("zi show");
    }

    public void hehe() {
        System.out.println("子类特有的方法");
    }
}

 (小编也在努力学习更多哟!以后会多多分享哒!)

 

希望对友友们有所帮助!!!! 

你可能感兴趣的:(JAVASE基础知识,java,多态)