多态性
1.多态性的理解:可以理解为一个事物的多种形态
2.什么是多态性:父类的引用指向子类的对象/子类的对象父类的引用
Person p = new Man(); Object obj = new Date()
3.多态的使用:虚拟方法调用
编译时,只能调用父类中声明的方法,执行时,实际执行的是子类重写父类的方法
4.多态的使用前提:(1)子类继承父类 (2)子类重写父类方法
5.多态性代码举例
class Person{
String name;
int age;
public void eat(){
System.out.println("人吃饭");
}
public void walk(){
System.out.println("人走路");
}
}
class Woman extends Person{
public void eat(){
System.out.println("女人少吃长胖");
}
public void walk(){
System.out.println("女人走路减肥");
}
public void goShopping(){
System.out.println("女人喜欢购物");
}
}
public class WomanTest{
public static void main(String[] args){
Person p1 = new Woman();
p1.eat();
p1.walk();
}
}
注意多态只使用于方法
6.向上转型和向下转型
向上转型:多态
向下转型(为什么要向下转型):有了对象的多态性之后,内存中实际是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致编译时,只能调用父类声明的属性和方法。子类特有的属性和方法不能调用。通过向下转型,可以调用子类特有的属性和方法
instance of关键字的使用:
为什么用向下转型要使用到instance of?
为了避免在向下转型时出现ClassCastException异常,我们在进行向下转型之前,先进行 * instanceof的判断,一旦返回true,就进行向下转型。如果返回false,不进行向下转型。
a instanceof A:判断对象a是否是类A的实例。如果,返回true,如果不是,返回false;
if(p1 instance of Woman){
Woman w1 = (Woman)p1;
p1.goShopping(); //向下转型为Woman类型可以调用Woman的特有方法
}
7.关于多态的面试题:
7.1 谈谈你对多态性的理解?
① 实现代码的通用性。
② Object类中定义的public boolean equals(Object obj){ }
JDBC:使用java程序操作(获取数据库连接、CRUD)数据库(MySQL、Oracle、DB2、SQL Server)
③ 抽象类、接口的使用肯定体现了多态性。(抽象类、接口不能实例化)
7.2多态是编译时行为还是运行时行为?