java 多态
多态是实现代码重用的一种机制。
- 重载:调用一系列具有相同名称的方法,这些方法可根据传入参数的不同而得到不同的处理结果,这属于静态多态,在代码编译阶段就确定下来。
- 动态多态:在程序运行阶段才能体现出来。简称为多态。
- 多态存在的前提:1.要有继承关系;2.子类要重写父类方法;3.父类引用指向子类。
- 向上转型:父类对象通过子类对象实例化。
- 向下转型:父类对象转换为子类对象,但必须强制转换。
//一、向上转型:
class Animal {
int age = 10;
public void eat() {
System.out.println("动物吃东西");
}
public void shout() {
System.out.println("动物在叫");
}
public static void run() {
System.out.println("动物在跑");
}
}
class Dog extends Animal {//满足了:1.要有继承关系
String name = "dog";
public void eat() {//满足了:2.子类要重写父类方法
System.out.println("dog is eating");
}
public static void run() {
System.out.println("dog is running");
}
public void watchDoor() {
System.out.println("dog is watching door");
}
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a1 = new Dog();//向上转型,满足了:3.父类引用指向子类。
a1.eat();//输出:dog is eating
a1.shout();//输出:动物在叫
a1.run();//输出:动物在跑
System.out.println(a1.age);//输出:10
Animal a2 = new Dog();
a2.watchDoor();//错误,对于子类中存在而父类中不存在的方法,该引用是不能使用的。
System.out.println(a1.name);//错误,指向子类的父类引用只能访问父类中拥有的方法和属性。
}
}
由以上代码可以看到向上转型之后,多态的特点:
- 指向子类的父类引用只能访问父类中拥有的方法和属性。
- 对于子类中存在而父类中不存在的方法,该引用是不能使用的。
- 如果子类重写了父类中的某些方法,调用这些方法时,使用的是子类中定义的这些方法。但是如果父类的方法是stasic的,子类是不能够重写父类的这个stasic方法的。
如果想要a1访问子类独有的方法和属性,可以通过向下转型实现:
//二、向下转型:
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Animal a1 = new Dog();
Dog d1 = (Dog) a1;//强制类型转换父类对象为子类对象
d1.eat();//dog is eating
d1.shout();//动物在叫
d1.run();//dog is running
//访问子类独有的方法和属性,此时访问的是子类中的run方法。
System.out.println(d1.age);//10
d1.watchDoor();//dog is watching door
//访问子类独有的方法和属性
System.out.println(d1.name);//dog
}
}
向下转型的特点:
- 可以访问子类和父类中的成员变量和方法。
- 如果子类没有父类中相应的成员变量或者方法,则调用父类的。
- 如果子类有父类中相应的成员变量或者方法,则调用子类的。
来源:CSDN
作者:_jym
链接:https://blog.csdn.net/qq_40828914/article/details/104284309