一、什么是多态
1、多态的概念
-
多态是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果
-
Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
-
多态体现为父类引用变量可以指向子类对象。
-
多态的定义为( 父类类型 变量名 = new 子类类型() )
2.多态存在的三个必要条件:
- 需要存在继承和实现关系(一定有父子关系)
- 同样的方法调用而执行不同的操作、运行不同的代码(重写),注意使用多态后的父类在引用变量调用方法时,会调用子类重写后的方法
- 在运行时父类或者接口的引用变量可以引用其子类的对象的多态的作用
- 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
- 多态消除了类型之间的耦合关系
- 多态的存在提高了程序的拓展性和后期的可维护性
class Animal
{
void eat(){
System.out.println("eat");
}
}
class dog extends Animal
{
void eat(){
System.out.println("狗吃骨头");
}
}
public class Test {
public static void main(String[] args) {
Animal an1 = new dog(); //父类的变量指向子类
an1.eat();
}
}
输出结果为
狗吃骨头
二、对象上下转型
1、上下转型的概念
- 由子类 转型成父类,在继承意图上是向上移动的,一般称为向上转型
- 向上转型是从一个较专业类型向通用类型转换,所以总是安全的(安全体现在是否能通过编译,因为子类实现更具体,如果在子类中添加一个父类没有的方法,在引用父类对象时编译会出错)。子类是父类的超集
- 向上转型过程中,类接口中唯一可能发生的是丢失方法(子类有而父类没有,这时会丢失这个方法)
- 与之相反的是向下转型,是不安全的(往往需要instanceof来协助,使用见下文)
2、上下转型的格式
-
向上转型:使用格式:父类类型 变量名=new 子类类型();
适用场景:当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作。 -
向下转型:使用格式:子类类型 变量名=(子类类型) 父类类型的变量;
适用场景:当要使用子类特有功能时。
3、instanceof的使用
- instanceof运算符是在运行时通过返回值来指出对象是否是特点类或是他的子类 的一个实例
result = object instanceof class - result是布尔类型
- object:必选项,任意对象
- class:必选项,任意已定义的对象类
说明:如果object是class或其子类的一个实例,则instanceof 运算返回ture,如果不是或者object 是null,则返回false
class Animal
{
void eat(){
System.out.println("eat");
}
}
class dog extends Animal
{
void eat(){
System.out.println("狗吃骨头");
}
void sleep(){
System.out.println("狗睡觉");
}
}
class cat extends Animal
{
void eat(){
System.out.println("猫吃鱼");
}
void sleep(){
System.out.println("猫睡觉");
}
}
public class Test {
public static void main(String[] args) {
Animal an1 = new dog();
cat c = (cat)an1;
c.eat();
}
}
以上这个例子就是向下转型的例子,把Animal类型的an1强制转换成cat类型,这在编译上是可以通过的,但是运行时程序会崩溃,所以应该加上instanceof 判断
class Animal
{
void eat(){
System.out.println("eat");
}
}
class dog extends Animal
{
void eat(){
System.out.println("狗吃骨头");
}
void sleep(){
System.out.println("狗睡觉");
}
}
class cat extends Animal
{
void eat(){
System.out.println("猫吃鱼");
}
void sleep(){
System.out.println("猫睡觉");
}
}
public class Test {
public static void main(String[] args) {
Animal an1 = new dog(); //an1指向的是dog类型
if(an1 instanceof cat){
System.out.println("可以转换");
cat c = (cat)an1;
c.eat();
}
else{
System.out.println("不可转换");
}
}
}
结果为
不可转换