面向对象特征之三:多态性
*
* 1.理解多态性:可以理解为一个事物的多种形态。
* 2.何为多态性:父类的引用指向子类的对象
* 3.多态的使用,虚方法调用
* 有了对象的多态性以后,我们在编程期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
*
* 总结:编译看左边,运行看右边
*
* 4.多态性使用的前提:
* ①继承关系
* ②方法的重写
*
*
* 5.为什么要有多态性?
*
* 6.多态性不用于属性(属性:编译运行都看左边)
*
*
* 向上转型(多态)
*
*
*
*
* 向下转型(使用)
*
*有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致
*编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
*
*如何才能调用子类特有的属性和方法?
*向下转型,使用强制类型转换
*
*使用强转型时,可能出现异常
*
*instanceof关键字使用
* a instanceof A :判断对象a是否是类A的实例,如果是,返回true;如果不是返回false
* 使用情景:为了避免向下转型时出现异常,我们在向下转型之前,先进行instanceof的判断,一旦
* 返回true,就进行向下转型。如果返回false,不进行向下转型。
public class PersonTest {
public static void main(String[] args) {
//
// Person p1=new Man();
// p1.eat();
// p1.earnMoney();
//有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,导致
//编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
//如何才能调用子类特有的属性和方法?
//向下转型,使用强制类型转换
//使用强转型时,可能出现异常
//
// instanceof关键字使用
// a instanceof A :判断对象a是否是类A的实例,如果是,返回true;如果不是返回false
//下转型对象
Person p2=new Man();
// Man man=(Man)p2;
// man.earnMoney();
// Women women=(Women)p2;
if(p2 instanceof Women)
{
Women women=(Women)p2;
women.sleep();
}
}
}
class Person
{
int age;
String name;
public void eat()
{
System.out.println("吃饭");
}
public void walk()
{
System.out.println("走路");
}
}
class Man extends Person{
boolean fat;
@Override
public void eat()
{
System.out.println("男人吃饭");
}
@Override
public void walk()
{
System.out.println("男人走路");
}
public void earnMoney()
{
System.out.println("赚钱");
}
}
class Women extends Person{
boolean height;
@Override
public void eat()
{
System.out.println("女人吃饭");
}
@Override
public void walk()
{
System.out.println("女人走路");
}
public void sleep()
{
System.out.println("睡觉");
}
}