java基础 类 多态
原创
©著作权归作者所有:来自51CTO博客作者wx639ab1ba8473b的原创作品,请联系作者获取转载授权,否则将追究法律责任
多态
多态包含两层 :
第一层即编译时多态:看类型(等号左边)---该引用类型中有没有被访问的成员。
第二次即运行时多态:看内存(等号右边)---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();