java基础 类 多态

多态

多态包含两层 :

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

第二次即运行时多态:看内存(等号右边)---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"); 
        p.bb(); 
    }
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.bb(); //编译时多态: 看类型---该引用的类型中有没有被访问的成员。 本例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();

 

猜你喜欢

转载自blog.csdn.net/lx678111/article/details/81258447