Java多态
- 子类对象调用子类特有的方法(Java多态))
- 前言
- 问题引入
- 转型介绍
- 代码
- 结论
子类对象调用子类特有的方法(Java多态))
前言
在使用多态时,可以通过重写父类成员方法实现提升代码效率,然而在实例化对象后,对父类或者子类的成员变量和方法的访问却并不是想象中的那么简单能直接使用,对于此问题我们通过此篇文章进行相关的讨论。
问题引入
在使用多态时(即一般的向上转型),可以让我们把具有共同特性的多个类更加方便地使用,但是简单的多态使用会导致一个很严重的问题,就是子类对象只能调用子类中重写的父类方法,而不能调用子类特有的方法;并且对于成员变量,向上转型(也就是一般的多态)只能调用父类的成员变量,而不能访问子类的成员变量,这是很让人头疼的,Java多态提供了一种解决办法,就是多态的转型。
转型介绍
转型又分为两类,向上转型和向下转型。
- 向上转型就是子类创建的对象转型为原本继承的父类对象,后面我们会拿代码进行具体解释;
- 向下转型就是将向上转型反过来,是将父类对象强制转为子类对象,代码在下面进行具体解释;
代码
父类
类成员描述如下:成员有成员变量name和成员方法eat()方法;
public class Animal {
public String name = "****";
public void eat() {
System.out.println("动物吃饭");
}
}
子类
类描述如下:继承了父类,成员有成员变量age、重写的eat()方法和自己特有的game()方法;
public class Cat extends Animal{
public int age = 20;
@Override
public void eat() {
System.out.println("小猫咪吃饭");
}
public void game() {
System.out.println("小猫咪玩游戏");
}
}
向上转型测试类
public class MainTest{
public static void main(String args[]){
Animal a = new Cat();//向上转型
a.eat();
//(); 无法调用 注释掉
System.out.println("名字:"+a1.name);
//(); 无法使用子类的成员变量 注释掉
}
}
输出结果
小猫咪吃饭
名字:****
结论:测试中,通过多态的方式创建对象时其实就是向上转型,测试中调用了父类成员变量name和子类成员变量age,父类eat()方法和子类game()方法,结果显示父类成员变量调用成功,子类成员变量调用失败,父类eat()方法调用成功但无法调用子类中特有的game()方法;
向下转型测试类
类的描述如下:
public class MainTest{
public static void main(String args[]){
Animal a = new Cat();
Cat c = (Cat)a;//向下转型
c.eat();
c.game(); //调用成功
System.out.println("名字:"+c.name);
System.out.println("年龄:"+c.age); //输出成功
}
}
输出结果
小猫咪吃饭
小猫咪玩游戏
名字:****
年龄:20
结论:通过向下转型,我们成功地调用了子类和父类中的所有成员和子类特有的game()方法;
友情提示:可以近似地把转型理解为强转,但兼具了子类和父类的特征
结论
通过多态转型后我们可以访问到子类的特有方法,并且可以访问到父类和子类的成员,如果向下转型,创建的对象在访问成员变量时,只能访问父类的成员变量与子类重写的父类的成员方法,而向下转型后可以访问到所有的成员变量和方法。
口诀来啦
向上转,变量方法都看父类,方法必须是子类重写的方法
向下转,无限制!
感谢阅读,希望我的文章能对你有所帮助~有什么疑问或者不对的地方欢迎在评论区留言评论。