/*
* 面向对象的特征:多态性
* 1.多态性可以理解为一个事物的多种表现形态
* 1)方法的重载与重写
* 2)子类对象的多态性(主要)
* 2.子类对象的多态性使用的前提:1)发生类的继承 2)要有子类对父类方法的重写3)父类引用指向子类对象
* 3.程序分为编译状态和运行状态
* 1)对于多态性来说,编译时,“看左边”,将此引用变量理解为父类的类型,所以子类特有的方法和属性就不能调用
* 2)运行时,“看右边”,关注于对象的真正的实体:子类的对象,那么执行的方法就是子类重写的
* 4.instanceof
* 1)格式:对象a instanceof 类A:判断对象a是否是类A的一个实例,是的话,返回true;否则返回false
* 2)若a是A类的实例,那么a也一定是A类的父类的实例:对象a instanceof 类A的父类,结果是true
* 3)若一个类被多个类继承,上下转型时一定要注意,子类之间不能转换
* 5.多态的定义:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。
多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,
即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
* 6.实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
* 7.多态的作用:消除类型之间的耦合关系。
* 8.当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的该同名方法。
*
*/
public class Parent {
public static void main(String args[])
{
// Person p=new Person();
// p.eat();
// p.walk();
//
// Man m=new Man();
// m.eat();
// m.walk();
//子类对象的多态性:父类的引用指向子类对象(子类对象赋给父类引用)
Person p1=new Man();//向上转型
//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用子类和父类同名的方法时,实际执行的是子类重写父类的方法
p1.eat();
p1.walk();
//p1.entertainment();没有为类型 Person 定义方法 entertainment(),程序认为p1是Person的,没有entertainment()方法
Man m1=(Man)p1;//向下转型
m1.entertainment();
// Woman w1=(Woman)p1;//编译时没有错误,运行时有错误java.lang.ClassCastException,男人变不成女人
// w1.shopping();
// Woman w1=(Woman)new Man();//编译时就发生错误
//避免上述错误
if(p1 instanceof Woman)
{
Woman w1=(Woman)p1;
w1.shopping();
}
if(p1 instanceof Man)
{
Man m2=(Man)m1;
m1.entertainment();
}
}
//如果没有多态性
public void show(Person p)
{
}
public void show(Man p)
{
}
public void show(Woman p)
{
}
//有多态性只需要一个show方法public void show(Person p){}
}
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person() {
super();
}
public Person(String name,int age) {
super();
this.name=name;
this.age=age;
}
public void walk()
{
System.out.println("人走路!");
}
public void eat()
{
System.out.println("人吃饭!");
}
}
public class Man extends Person{
private boolean smoking;
public Man() {
super();
}
public Man(boolean smoking) {
super();
this.smoking=smoking;
}
public boolean isSmoking() {
return smoking;
}
public void setSmoking(boolean smoking) {
this.smoking = smoking;
}
public void walk()
{
System.out.println("男人笔挺的走路!");
}
public void eat()
{
System.out.println("男人大口的吃饭!");
}
public void entertainment()
{
System.out.println("男人爱请客!");
}
}
public class Woman extends Person{
private boolean isBeauty;
public Woman() {
super();
}
public Woman(boolean isBeauty) {
super();
this.isBeauty=isBeauty;
}
public boolean isBeauty() {
return isBeauty;
}
public void setBeauty(boolean isBeauty) {
this.isBeauty = isBeauty;
}
public void walk()
{
System.out.println("女人窈窕的走路!");
}
public void eat()
{
System.out.println("女人腼腆的吃饭!");
}
public void shopping()
{
System.out.println("女人爱购物!");
}
}