概念
多态:由于参数不同而导致执行效果不同的现象
(多态变量:这个变量在运行时它所管理的那个对象的类型是会变化的)
- Java的对象变量是多态的,它们能保存不止一种类型的对象
- 它们可以保存的是声明类型的对象,或声明类型的子类的对象
- 当把子类的对象赋给父类的变量的时候,就发生了向上造型
例子
interface Aniimal{
void shout();
}
class Cat implements Animal{
public void shout(){
System.out.println("喵喵");
}
}
class Dog implements Animal{
public void shout(){
System.out.println("汪汪");
}
}
class Ex11{
public static void main(String[] args){
Animal an1=new Cat(); //创建Cat对象,使用Animal类型的变量an1的应用
Animal an2=new Dog(); //创建Cat对象,使用Animal类型的变量an2的应用
animalShout(an1); //调用animalShout()方法,将an1参数传入
animalShout(an2); //调用animalShout()方法,将an2参数传入
}
//定义静态的animalShout()方法,接收一个Animal类型的参数
public static void animalShout(Animal an){
an.shout();
}
}
类(class)的本意是类型(type),所以,定义了一个新的类就是定义了一个新的类型
- 类定义了类型
- 子类定义了子类型
- 子类的对象可被当作父类的对象来使用
- 赋值给父类的变量
- 传递给需要父类对象的函数
- 放进存放父类对象的容器里
造型(cast):把一个类型对象赋给另外一个类型的变量的过程
子类的对象可以赋值给父类的变量
注意:Java中不存在对象对对象的赋值!
父类的对象不能赋值给子类的变量!
例子
//Vechicle是Car的父类
Vechicle v ;
Car c = new Car() ;
v = c ; //可以
c = v ; //编译错误!
可以用造型:c = ( Car ) v ; (只有当v这个变量实际管理的是Car才行)
造型:用括号围起类型放在值的前面
对象本身并没有发生任何变化,所以不是"类型转换"
运行时有机制来检查这样的转化是否合理,ClassCastException
向上造型:拿一个子类的对象,当作父类的对象来用
向上造型是默认的,不需要运算符,向上造型总是安全的
String s="Hello";
s=" bye " ; // 这句话的意思是,原本s是管理"Hello"的,后来s去管理另外一个叫做"bye"的对象了
赋值运算符:让一个变量去管理另外一个对象