Java面向对象--多态
好了,梦醒了,继续更新。
在《疯狂Java讲义》中提到了两种引用变量的类型:一种是编译时类型,一种是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。
所以在Java中多态可以分为两种:一种是编译时多态(重写式多态),另一种是运行时多态(重载式多态)。
编译时多态:对于引用对象类型以及多个同名方法,在编译时已经确定。
运行时多态:在编译时不确定,只能在运行时才能判断所引用对象的实际类型和方法。
可以这么理解:编译时多态是一种静态绑定,而运行时多态是一种动态绑定。
上面也说了,编译时多态也叫重写式多态,运行时多态也叫重载式多态。那么什么叫重写?什么叫重载呢?
下面来介绍一下这两个概念:
重写(Override):子类存在与父类的方法名字相同,而且参数的个数与类型一样,返回值也一样的方法,但是内容不一样。即:外壳不变,核心重写。
重载(Overload):一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。
继续介绍我们的多态的相关内容。
多态产生的条件:
1.继承
2.重写
3.父类引用指向子类对象
向上转型:子类是一种特殊的父类,Java中允许把一个子类对象直接赋给一个父类引用变量,无需类型强制转换,就被称为向上转换,这个过程由系统自动完成。
向下转换:父类引用变量强制转换为相应的子类对象。
//Animal为父类,Cat为子类
Animal a = new Cat();//向上转换
Cat c = (Cat)a;//向下转换
下面介绍一个具体的例子。
class BaseClass{
public int book = 6;
public void base(){
System.out.println("父类的普通方法");
}
public void test(){
System.out.println("父类的被覆盖的方法");
}
}
public class SubClass extends BaseClass{
//重新定义一个book实例变量隐藏父类的book实例变量
public String book = "Java 新手入门";
public void sub(){
System.out.println("子类的普通方法");
}
public void test(){
System.out.println("子类的覆盖父类的方法");
}
public static void main(String[] args) {
//下面编译时类型和运行时类型完全一样,因此不存在多态
BaseClass bc = new BaseClass();
System.out.println(bc.book);
bc.base();
bc.test();
SubClass sc = new SubClass();
System.out.println(sc.book);
sc.base();
sc.test();
//下面编译时类型和运行时类型不一样,多态发生。
BaseClass polymophicBc = new SubClass();
System.out.println(polymophicBc.book);
polymophicBc.base();
//多态发生,此处调用的是子类重写的方法
polymophicBc.test();
//因为polymophicBc的编译时类型是BaseClass
//BaseClass类没有提供sub()方法,所以下面代码编译时会出现错误
//ploymophicBc.sub()
}
}
输出结果为:
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。要想调用父类中被重写的方法,则必须使用关键字super。
上一篇: Java面向对象
下一篇: JAVA面向对象思想