这周我进行了多态的学习,明白了多态的使用场景与好处,同时,也明白了多态的劣势与使用时应该注意的点。
1.使用多态有几个前提:有继承的使用,对方法进行重写。
2.在子类调用成员变量与方法时,编译与运行的方式是不一样的。我编写了如下代码,请看:
public class Domo7 {
public Domo7() {
}
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.name);
}
}
以上是测试类。
public class Fu {
String name="1";
public void eat(){
System.out.println("父亲在吃骨头");
}
}
以上是父类。
public class Zi extends Fu {
String name = "2";
@Override
public void eat() {
System.out.println("儿子在喝汤");
}
}
以上是子类。
运行结果是一。
查找了资料,我明白了,在调用成员变量时,编译看的是左边,运行看的也是左边,所以输出的结果是父类的name。
那么如果我调用的是方法呢,请看代码:
public class Domo7 {
public Domo7() {
}
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.name);
f.eat();
}
}
调用的是子类的方法。
所以,我明白了,在调用方法时,编译看的是左边,而运行看的则是右边。
那么接下来,我想说一下使用多态的好处。
我认为,多态最好的好处就是可以解耦合。这是专业名词,按照我的解释来说就是:我有一串代码,并将它用作父类,此时我又创作了一个子类去继承这个父类,这没有问题,可如果我有很多子类,都需要调用重写的方法,那么更改起来极为麻烦,但是我使用多态以后,这个问题就解决了,因为我可以改变子类,想用哪个用哪个,只要更改new关键字后面的子类就行了,非常方便。
那么多态的弊端又在哪儿呢,弊端在于多态没办法调用子类特有的方法。
请看如下代码
public class Domo7 {
public Domo7() {
}
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.name);
f.eat();
f.show()
}
}
此时show方法会报错,因为show方法是子类独有的方法。
那如果我硬是要调用这个方法我该怎么做呢。别着急,有办法。
请看如下代码。
public class Domo7 {
public Domo7() {
}
public static void main(String[] args) {
Fu f=new Zi();
System.out.println(f.name);
f.eat();
Zi z=(Zi) f;
z.show();
}
}
这时,show方法就不会报错了。这个形式类似于基本数据的强行转换一样。
将大的范围强行转换成小的范围。