目
录
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("子类特有的方法");
}
}
(小编也在努力学习更多哟!以后会多多分享哒!)
希望对友友们有所帮助!!!!