目录

  • 一、Java中的多态
  • 1. 方法的多态:
  • 2. 对象的多态 (关键)
  • 二、对象的多态 (关键)
  • 1.多态的向上转型
  • 2.多态的向下转型
  • 总结


一、Java中的多态

多态,就是方法或对象有多种形态,包括方法的多态和对象的多态。

1. 方法的多态:

重写override和重载overload就体现多态,重写和重载不多赘述。

java 判断几个是否有重复数据_java 判断几个是否有重复数据

2. 对象的多态 (关键)

编译类型 对象名 = new 运行类型();

编译类型:简单理解 javac 编译时看的类型,要编译过的去不能报语法错误;
运行类型:过了编译阶段,到了运行阶段 java 要看的类型。

编译类型看 = 的左边,运行类型看 = 的右边:
如:Animal animal = new Dog();
对象animal的编译类型是Animal,运行类型是Dog

二、对象的多态 (关键)

1.多态的向上转型

(可以调用父类中所有的成员,但执行的方法是子类中重写的方法)
语法:

父类类型 父类引用名 = new 子类类型();

// 向上转型:父类的引用名 指向 子类的对象   
Animal animal = new Cat();
Object object = new Cat(); // 父类可以不是直接父类

注意两点:

1)编译阶段:能调用哪些成员,是由编译类型决定的,所以父类引用名,不能调用子类特有的成员,否则编译不通过直接报错;

2)运行阶段:如果调用的是方法,则由运行类型决定,调用方法要从子类开始查找,一般调用的就是子类重写的方法;如果调用的是属性,就直接看编译类型,也调用的是父类属性!!!(要记住,属性无重写)

class Base{ // 父类
	int count = 10;
	public void display(){System.out.println(this.count);} 
}
class Sub extends Base{ // 子类
	int count = 20;
	public void display(){System.out.println(this.count);}
}
// main中调用
public static void main(String[] args){
	Sub sub = new Sub(); 
	Base base = sub; // 向上转型
	System.out.println(base.count); // 输出10,调用父类中的count
	base.display(); // 输出20,调用子类中的display()
}

2.多态的向下转型

(可以调用子类中所有的成员)
语法:
子类类型 子类引用名 = (子类类型)父类引用;

向下转型,要和向上转型结合起来思考,后面的父类引用是向上转型产生的。

注意两点:

1)只能强转父类的引用,不能强转父类的对象;

2)强转的父类引用,先前已经指向要强转类型 (子类) 的对象;

也就是向下转型是和向上转型结合起来的,

向上转型:Animal animal = new Cat();
向下转型:Cat cat = (Cat) animal;
向下转型:Dog dog = (Dog) animal; // 错误!!animal此时指向Cat对象

Animal animal = new Cat();
Cat cat = (Cat) animal;
cat.CatchMouse(); // 调用Cat类中特有的猫抓老鼠方法

总结

为何需要向上转型和向下转型 ?

  1. 向上转型:父类引用可以调用子类中重写父类的方法,这样当需要添加新功能时,新增一个子类即可,而不需要更改父类代码;
Animal animal = new Dog(); 
animal.eat(); // 会调用Dog类中的eat方法;
animal = new Cat(); 
animal.eat(); // 又会调用Cat类中的eat方法;
  1. 向下转型:一般是为了重新获得因为向上转型而失去的子类特性,所以向下转型前一般都有向上转型,也会结合instanceOf使用;
Animal animal = new Dog();
Dog dog = (Dog) animal; // 为了使用Dog类中独有的属性和方法

animal = new Cat();  
Cat cat = (Cat) animal; // 为了使用Cat类中独有的属性和方法