一、多态的理解
在java中多态是面向对象编程的一种重要特性,它允许不同的对象对同一个消息做出不同的响应。简单来说,多态就是同一种行为在不同对象上的表现方式不同。Java中的多态实现主要依靠两个机制:继承和接口。在继承中,子类可以继承父类的属性和方法,也可以重写父类的方法来实现自己的特定行为。当父类的弓|用指向子类的对象时,可以通过父类的引用调用子类重写的方法,实现多态。在接口中,类可以实现接口中定义的方法,这样可以实现不同的类拥有相同的行为,也可以通过接口的引|用调用这些方法,实现多态。
二、多态的实现
多态前提:继承关系,方法重写,父类引用指向子类对象
成员变量:运行看左边,编译看左边
成员方法:编译看左边,运行看右边
静态成员方法:运行父类
例如下代码:
public class Demo5_polymorphic {
public static void main(String[] args){
//猫是一只动物,父类引用指向子类对象
Animal2 a = new Cat2();
a.eat();
System.out.println(a.num);
//=======================
a.print();
}
}
class Animal2{
int num = 10;
public void eat(){
System.out.println("动物吃饭");
}
public void print(){
System.out.println("父类");
}
}
class Cat2 extends Animal2{
int num = 20;
public void eat(){
System.out.println("猫吃鱼");
}
public void print(){
System.out.println("子类");
}
}
输出:
- 上面代码定义了一个动物类和一个猫类,我们让猫去继承动物类,猫就拥有了动物类的多有方法,接着猫类重写了父类的eat()和print()方法。
- 在主程序main中,我们用Animal2 a = new Cat2()创建了一个a对象,这个代码的含义就是父类引用指向子类对象,Animal2就是父类,Cat2就是子类。
- 当对象a调用eat方法的时候执行的是子类的eat方法,因为在调用成员方法时,遵守的是编译看左边,运行看右边,也就是编译的是a,运行的时候执行的是子类的eat()。
- 在调用成员变量num的时候,遵循的是编译看左边,运行看左边,所有打印的是父类的num值10,而不是子类的20。最后一个print()方法和eat()方法的执行时一样的。
三、向上转型和向下转型
向上转型:就是把子类强转成父类,把低的往高的转。
向下转型:就是把父类强转成子类,把高的向低的转。
代码如下:
public class Demo6_polymorphic2 {
public static void main(String[] args){
/**
多态中向上转型和向下转型
* */
Person p = new SuperMan();
System.out.println(p.name);
SuperMan sm = (SuperMan)p; //向下转型
sm.fly();
method(new SuperMan()); //提高扩展性
}
public static void method(Person p2){
//instanceof判断前面引用类型是否和后面相同
if (p2 instanceof SuperMan){
SuperMan s = (SuperMan) p2;
s.fly();
s.eat();
}
}
}
class Person{
String name = "普通人";
public void eat(){
System.out.println("普通人吃饭");
}
}
class SuperMan extends Person{
String name = "超人";
public void eat(){
System.out.println("超人吃饭");
}
public void fly(){
System.out.println("飞去救人");
}
}
输出:
上面代码中先是通过父类引用指向子类对象创建了一个p对象,然后又创建了一个SuperMan引用类型的对象sm,把p强转成SuperMan对象赋值给sm。现在的p就是一个SuperMan类型的对象,而不再是Person类型的对象。