多态

多态包含两层 :

第一层即编译时多态:看类型(等号左边)---该引用类型中有没有被访问的成员。

第二次即运行时多态:看内存(等号右边)---new谁调谁(先看所new的类中有没有,

若有则调用,否则看它的父类,依此类推)。

 

编译时多态决定"编译时能否通过",运行时多态决定"程序的执行结果"

多态: 把学生当人  ---子例实例即是父类对象

Person p = new Student("Rose", 22, "English"); 
p.aa();

运行时多态: 看内存---new谁调谁,因为new的是Student实例,因此先看Student中

是否有aa()方法,若有则调用;否则看Person类中是否有,若有则调用; 若还没有

则看Object类,若还没有则肯定是编译时错误的(多态的第一步会拦住的).

@Test //运行时多态
public void demo2(){
Person p = new Student("Rose", 22, "English");
p.aa();
}

    

编译时多态: 看类型---该引用的类型中有没有被访问的成员。 本例p是Person类型,

若Person类中有bb()方法则编译通过,否则看它的父类Object,若有则通过,否则

就是编译错误。

@Test//编译时多态
public void demo3(){
Person p = new Student("Rose", 22, "English");
();
}

 

package cn.hncu.para2.v2;

import org.junit.Test;

/*
* 多态包含两层:
* 第一层(先进行)是编译时多态: 看类型(等号左边)---该引用的类型中有没有被访问的成员
* 第二层(再进行)是运行时多态: 看内存(等号右边)---new谁调谁(先看所new的类中有没有,若有则调用,否则看它的父类,依此类推)
*
* 编译时多态决定"编译时能否通过",运行时多态决定"程序的执行结果"
*
* Person p = new Student("Rose", 22, "English");
* p.aa();
*
*/

public class Demo2 {

@Test
public void demo1() {
Student s = new Student("Jack", 22, "English");
Person p = new Person("张三",23);

System.out.println(s instanceof Person); //true
System.out.println(p instanceof Student);//false

//多态: 把学生当人 ---子例实例即是父类对象
Person p2 = s; //AC
Person p3 = new Student("Rose", 22, "English"); //AC
}


@Test //运行时多态
public void demo2(){
Person p = new Student("Rose", 22, "English");
p.aa(); //运行时多态: 看内存---new谁调谁,,,因为new的是Student实例,因此先看Student中是否有aa()方法,若有则调用;否则看Person类中是否有,若有则调用; 若还没有则看Object类,若还没有则肯定是编译时错误的(多态的第一步会拦住的).
}

@Test//编译时多态
public void demo3(){
Person p = new Student("Rose", 22, "English");
(); //编译时多态: 看类型---该引用的类型中有没有被访问的成员。 本例p是Person类型, 若Person类中有bb()方法则编译通过,否则看它的父类Object,若有还通过,,否则就是编译错误。
}


}

理解多态:
    1) 一个子类实例 既可以作为子类对象(访问子类成员),也可以作为父类对象(访问父类成员)   ---多种形态
    Student s = new Student();
    s.getSpeciality();//子类--Student
    s.setAge(22);//父类--Person
    s.hashCode();//爷爷类--Object
    
    2) 一个父类类型的形参,传实参时既可以用 子类实例,也 可以用父类实例  ---多种形态
    print( Person p ){
     System.out.println( p );
    }
    
    Person p1 = new Person();
    print( p1 );
    print( s ); //渐近匹配
    
    多态的要点:  子类实例即是父类对象---把学生当人
    
     多态最经典的语句:  Person p = new Student();