多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。
多态是由方法重载,继承,方法重写,自动转型等技术的组合。
- 编译时多态:重载
运行时多态(编译类型和运行类型不一致):
1. 重写
2. 父类或者接口指向子类对象(向上转型)
前提: 继承父类或实现接口
并重写方法。
好处:提高代码扩展性,前期定义的代码可以使用后期的内容
如果方法被子类重写会调用子类的方法(多态的最大好处) (如果子类中没有覆盖该方法,那么会去父类中寻找)弊端:对于子类特有中的方法访问不到。
子类的属性,访问不到。即使与父类重名的属性,也是访问父类的属性(覆盖只发生在方法上)。多态时成员的访问特点:
成员变量:编译和运行都是看左边(编译能不能通过和实际运行的都是父类或者接口里边的)
成员方法:编译是左边的,运行是右边的
静态方法:编译和运行都是看左边。静态是属于类的,直接用类名调用
package cn.test;
public class Animal {
public void eat(){
System.out.println("动物吃饭");
}
public void sleep(){
System.out.println("动物睡觉");
}
}
class Dog extends Animal{
public void eat(){
System.out.println("狗吃骨头");
}
public void like(){
System.out.println("狗抓老鼠");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("猫吃鱼");
}
public void like(){
System.out.println("喜欢抓老鼠");
}
}
class Duotai{
public static void main(String[] args) {
//父类型指向子类对象
Animal am = new Cat();
method(am);//同一操作作用于不同的对象,有不同的结果。
// Animal am1 = new Dog();
//method(am1);
}
/**
* 这实际上就是设计模式中的简单工厂模式!
*
* 类型的参数.,传入参数的时候,可以传入任何一个类的对象,只要是对应的类的对象名称就可以了
* 这就是多态的应用!
* */
public static void method(Animal animal){
animal.eat();
}
}
向下转型
向下转型注意事项
- 在向下转型之前,它得先向上转型。(不然编译能通过,运行无法通过)
- 向下转型只能转型为本类对象,子类引用不能指向父类对象。
转型:自始至终,都是子类对象在做着类型的变化
public static void main(String[] args) {
//父类型指向子类对象,向上转型,猫提升为动物类型
Animal am = new Cat();
//am.like();特有方法无法访问。
//向下转型 ,为了使用子类特有的方法
Cat cat =(Cat)am;
cat.like();
}
- instanceof
boolean result = cat instanceof Animal
其中 cat为一个对象,Animal 表示一个类或者一个接口
当 cat为 Animal 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false。