多态就是拥有多种形态(结果)。(可能这么说你们会觉得我在说废话)。
多态就是通过一个父类类型指向之类对象,当我们实例化时,实例化名称是一个父类类型的变量。通过这个变量我们可以调用所有子类中重写父类的实例方法和实例变量。通过一个变量调用相同的方法,但是得到不同的结果。
在编译是,程序会先去父类中查找是否有此方法。
在运行时,程序会优先调用子类中重写的方法,如果没有的话会调用父类方法。
事实上,多态的语法格式也是一个向上转型。由父类类型指向一个子类对象。
主人喂宠物小例子:
父类:
class Pet{
public void eat(){
System.out.println("宠物正在吃....");
//案例并不需要使用到实例变量,所以我这里就不写了。
//由于这是一个父类方法,在子类中需要重写方法,所以父类方法可以随意写一些
}
}
子类(猫类):
class Cat extends Pet{
//子类继承父类并重写父类方法
public void eat(){
System.out.println("小猫正在吃鱼");
}
public void play(){
System.out.println("小猫正在玩皮球");
}
}
主人类:
class Master{
//主人类不需要继承任何类,这是一个单独类
public void feed(Pet p){
p.eat();
}
}
编写一个测试类用来测试:
public class Test{
public static void main (String[] args){
//首先创建一个猫实例
Cat c = new Cat();
Master m = new Master();
m.feed(c)
}
}
此时我们就已经完成了一个多态,有些人没看懂,多态在哪里。在我们的测试类中,我们创建了一个猫的对象和一个主人对象,我们调用主人的喂养方法时传入了一个子类对象的地址,而我们主人类中的方法参数为父类对象,可以理解为Pet p = c,当形成多态(也可以说是向上转型)时,子类对象会自动转换为父类类型,就变成了一个父类类型指向子类对象的形式,这就是一个多态,也是向上转型。
向下转型
简单来说,向下转型就是一个强制类型转换,将一个父类类型转换为一个子类的类型。
向下转型的作用:可以访问子类独有的(父类没有的)实例方法和实例变量。
请看以下代码:
public static void main (String[] args){
double b = 12.12;
//此时我们可以强制转换为int型。
int a = (int)b;
}
以上代码就是一个强制类型转换,那么多态如何进行强制类型转换(向下转型)?
同样,我们使用上面的喂宠物小例子来演示
通过上面这一小段代码,我们已经清楚了强制类型转换,下面我们看多态如何转换:
在上面喂养宠物的案例当中,猫类有一个独有方法play,那么我们如何访问此方法?
public class Test{
public static void main (String[] args){
//构建一个多态
Pet p = new Cat();
//使用向下转型,参考基本类型的强制转换,访问子类独有方法
Cat c = (Cat)p;//强制类型转换,将父类对象转换成子类对象
//此时我们可以访问子类独有方法和变量
c.play();
//此时我们正常访问子类独有方法,也就是向下转型了。
}
}
如果说我们就单纯的这么写,有可能会出现问题,比如说可能出现空指针问题。所以,我们对代码进一步优化。
public class Test{
public static void main (String[] args){
//构建一个多态
Pet p = new Pet();
//使用if语句判断能否进行向下转型
if(p instanceof Cat){
//使用instanceof判断p是否是Cat的实例
Cat c = (Cat)p;
c.play;
}else{//如果不是就结束程序
return;
}
}
}
instanceof是什么?
instanceof用来判断一个对象是否为一个类的实例。
此文由本人所写,本人也是新手一枚,如果文中出现错误,希望大家可以及时提醒我改正。
欢迎关注本人微信公众号