多态
-
基本介绍:
方法或对象具有多种形态。多态是建立在封装和继承基础之上的
-
多态的具体表现
(1)方法多态:方法重载就是典型的方法多态
(2)对象的多态:(核心 )
①一个对象的编译类型和运行类型可以不一致
②编译类型在定义对象时就确定了,不能改变
③运行类型是可以变化的
④编译类型看定义时 = 的左边,运行类型看 = 右边
-
细节和各种注意事项
多态的前提是:两个对象(类)之间存在继承关系
多态的向上转型
(1)本质:父类的引用指向了子类
(2)语法:父类类型 引用名 = 子类类型
(3)特点:编译类型看左边,运行类型看右边
可以调用父类中的所有成员(须遵守访问权限)
不能调用子类中特有成员
多态的向下转型
(1)语法:子类类型 引用名 = (子类类型)父类引用
(2)只能强转父类的引用,不能强转父类的对象
(3)要求父类的引用必须指向的是当前目标类型的对象
(4)当向下转型后,可以调用子类类型中所有的成员
!!!属性没有重写这个说法,直接看编译类型
例:
public class Test {
public static void main(String[] args){
Base base = new num();
System.out.println(base.count);
}
}
class Base{
public int count = 10;
}
class num extends Base {
public int count = 100;
}
//输出的结果是 10
-
instanceof比较操作符,用于判断对象的运行类型是否为XX类型或XX类型的子类型
public class Test {
public static void main(String[] args){
Base base = new num();
System.out.println(base instanceof num);//true()
System.out.println(base instanceof Base);//true
}
}
class Base{}
class num extends Base {}
练习:
判断下面的每条语句,说出原因
public class PolyExercise01{
public static void main(String args){
double d = 13.4;//ok
long l = (long)d;//ok double-->long可以自动转换
System.out.println(l);
int in = 5;//ok
boolean b =(boolean)in;//false 不能把一个int型转化为boolean型
Object obj = "hello";//ok 向上转型,把String型转为了Object
String objStr =(String)obj;//ok ,向下转型
System.out.println(objStr);
Object objPri = new Integer(5);//ok ,向上转型
String str = (String)objPri;//false , objPri已经指向了integ,强转不过来
integer str1 = (Integer)objPri;//ok向下转型
}
}
java动态绑定机制(!!!!重中之重)
(1)当调用对象方法时,该方法回合该对象的内存地址/运行类型绑定
(2)当调用对象属性时,没有动态绑定机制,那里声明那里使用。
public class Test {
public static void main(String[] args){
D a = new E();
System.out.println(a.display());
}
}
class D{
public int count = 10;
public int display(){
return get1()+20;
}
public int get1(){
return count;
}
}
class E extends D{
public int count = 100;
// public int display() {
// return get1();
// }
public int get1(){
return count;
}
}//输出 120
//!!!只要是方法,就去子类中找,只要是属性,就在本类中找