java向上造型的意义,如何理解向上造型有利于提⾼程序的可扩展性和简洁性,
什么时候使⽤向上造型?
java向上造型的意义
如何理解向上造型有利于提⾼程序的可扩展性和简洁性
什么时候使⽤向上造型
关于上⾯三个问题,我之前也在⽹上查询过,但⼤多数回答都感觉要不就是套官话,要不就没说到点上。虽然向上造型使⽤频率不是很⾼,但懂了它会对我们对⾯向对象的理解更深。
以下为我个⼈见解,仅供参考
为⽅便⼤家理解,先来捋⼀下什么是向上造型吧
public class Person{
//定义⽗类Person
public void eat(){
System.out.println("person eat");
};
public void drink(){
System.out.println("person drink")//⽗类独有⽅法
}
}
public class Man extends Person{
//⼦类Man继承⽗类
public void eat(){
System.out.println("man eat");//重写⽗类eat()⽅法
}
public void play(){
System.out.println("man play");//⼦类独有⽅法
}
}
//测试类
public class PersonTest {
public static void main(String[] args){
Person pMan =new Man();//向上造型
pMan.eat();//结果为:man eat
pMan.shower();//结果为:person shower
pMan.drink();//报错: Cannot resolve method 'drink' in 'Person'
}
}
通过代码可知,向上造型就是⽗类指向⼦类的对象。
可以看出,在实现向上造型后,实例化后的对象pMan即可调⽤⼦类重写的⽅法,也可以调⽤⽗类未被重写的⽅法,但不能调⽤⼦类独有的⽅法(可以继续通过向下造型实现),并且如果需要调⽤⽗类已被重写的⽅法,⽤super关键词即可。相⽐于分别创建⽗类和⼦类的对象再去分别调⽤其⽅法,使⽤向上造型可以减少代码量,提⾼程序的简洁性。
向上造型的意义便在此,如果你既想⽤⽗类的⽅法,⼜想特指⼦类的⽅法,向上造型后便可以通过是否重写⽗类的⽅法来实现选择调⽤⽗类还是⼦类的⽅法。
相⽐于分别创建⽗类和⼦类的对象再调其⽅法,使⽤向上造型可以极⼤提⾼程序的可扩展性,便于⽇后维护代码。那除了这样情况还有什么地⽅向上造型⽤的多呢。
接⼝回调
接⼝不可以实例化,但是可以有⼀个类来实现接⼝,实现接⼝的类可以继承接⼝的所有⽅法。
接⼝回调是⽤接⼝句柄来得到并调⽤实现这个接⼝的⼦类的引⽤,本质上和向上转型没有差别。
public interface Inter{
public void sleep();//定义接⼝需要实现的⽅法sleep()
}
public class Woman implements Inter{
@Override//⼦类Woman继承Inter接⼝并实现其⽅法
public void sleep(){
System.out.println("woman 实现接⼝⽅法");
}
public class Man implements Inter{
@Override//⼦类Man继承Inter接⼝并实现其⽅法
public void sleep(){
System.out.println("man 实现接⼝⽅法");
}
这两类都实现了接⼝的⽅法,但是内容可能不⼀致。如果现阶段需要⽤到接⼝Inter,但是暂时不确定使⽤哪个⼦类去实现接⼝Inter的⽅法。
那么可以创建⼀个⽅法,传⼊接⼝的“对象”进去,再调⽤其⽅法,如下:
public class DoThing {
public void doThings(Inter human){
human.sleep();//调⽤⼦类实现的sleep()
}
}
类DoThing⽤到了接⼝的⽅法,但是传参时未定义具体实例化对象,使⽤接⼝Inter的句柄"Inter human"来实现,再调⽤其sleep()⽅法,因其未指定哪个⼦类实现,所以可以根据情况后实例化⼦类对象再调⽤DoThing类的⽅法:
//测试类
public class PersonTest {
public static void main(String[] args){java接口可以创建对象吗
DoThing dt=new DoThing();
Inter interW=new Woman();//Woman接⼝回调⽅法
Inter interM=new Man();//Man接⼝回调⽅法
dt.doThings(interW);//调⽤的是Woman对接⼝的实现
dt.doThings(interM);//调⽤的是Man对接⼝的实现
}
}
结果:
woman 实现接⼝⽅法
Man 实现接⼝⽅法
这样使⽤接⼝调⽤有助于具体实现与事务处理的解耦,在类DoThing处理事务时,我们不需要知道去调⽤哪个⼦类实现接⼝的⽅法,可以在具体运⾏时再去根据实例化对象调⽤相应的实现⽅法,这样还⽅便⽇后扩充和维护代码。
在上述代码中,Man和Woman虽然被声明为Inter接⼝类型,但在实例化过程是实现的⼦类,因此可以称作为接⼝的回调对象。
如有错误,欢迎批评指正@_@
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论