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。

猜你喜欢

转载自blog.csdn.net/yong_zi/article/details/81359563