什么是多态
多态,即方法和对象具有多种状态。多态是在封装、继承之上的。
多态的具体体现
方法的多态:重载和重写
对象的多态:向上转型和向下转型
父类的编译类型可以指向子类的对象。
向上转型
- 本质:父类的引用指向了子类的对象
- 语法:
父类类型 引用名 = new 子类类型(参数列表);
- 特点:编译类型看左边,引用类型看右边
可以访问父类中的所有成员(遵守访问权限)
不可以访问子类中独有的成员
最终效果看子类的具体实现(有无重载,重写)。
编译类型决定该引用能够访问的成员的范围,
运行类型决定运行时的实际结果。
public class PolyObj {
public static void main(String[] args) {
//向上转型
Base base = new Sub();
base.output();
}
}
class Base{
public void output(){
System.out.println("Base");
}
}
class Sub extends Base{
@Override
public void output() {
System.out.println("Sub");
}
}
//Sub
向下转型
- 为什么需要向下转型
在向上转型之后,父类的引用无法访问子类的特有成员。若此时想要访问子类的特有成员,则对该父类类型的引用进行一次向下转型,就能够访问到子类中所有的成员。 - 语法:
子类类型 引用名 = (子类类型) 父类引用;
- 特点:向下转型一定在向上转型之后
只能强制转换父类的引用,而不能强制转换父类的对象
要求父类的引用必须是指向当前类型的对象
可以调用子类类型中的所有的成员public class PolyObj { public static void main(String[] args) { //向上转型 Base base = new Sub(); base.output(); // 向下转型 Sub sub =(Sub) base; sub.SubOutput(); } } class Base{ public void output(){ System.out.println("Base"); } } class Sub extends Base{ @Override public void output() { System.out.println("Sub"); } public void SubOutput(){ System.out.println("Sub Output"); } } //Sub //Sub Output
属性重写
属性没有重写一说,属性由编译类型决定
public class Prop {
public static void main(String[] args) {
// 编译类型是Base,属性的值由编译类型决定,所以会输出10
Base base = new Sub();
System.out.println(base.n);
}
}
class Base{
public int n=10;
}
class Sub extends Base{
public int n=20;
}
// 结果是10
instanceof 关键字
判断对象的运行类型是否是XX类型及其子类类型,返回值是boolean类型
用法:
对象 instanceof 类型;
举例:
public class Prop {
public static void main(String[] args) {
Sub sub = new Sub();
System.out.println(sub instanceof Base);
System.out.println(sub instanceof Sub);
}
}
class Base{ }
class Sub extends Base{ }
//true
//true
public class Prop {
public static void main(String[] args) {
Base base = new Sub();
System.out.println(base instanceof Base);
System.out.println(base instanceof Sub);
}
}
class Base{ }
class Sub extends Base{ }
//ture
//false