欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java面向对象--多态

程序员文章站 2022-05-25 20:45:21
...

好了,梦醒了,继续更新。

在《疯狂Java讲义》中提到了两种引用变量的类型:一种是编译时类型,一种是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就可能出现所谓的多态。

所以在Java中多态可以分为两种:一种是编译时多态(重写式多态),另一种是运行时多态(重载式多态)。

编译时多态:对于引用对象类型以及多个同名方法,在编译时已经确定。

运行时多态:在编译时不确定,只能在运行时才能判断所引用对象的实际类型和方法。

可以这么理解:编译时多态是一种静态绑定,而运行时多态是一种动态绑定。

上面也说了,编译时多态也叫重写式多态,运行时多态也叫重载式多态。那么什么叫重写?什么叫重载呢?

下面来介绍一下这两个概念:

重写(Override):子类存在与父类的方法名字相同,而且参数的个数与类型一样,返回值也一样的方法,但是内容不一样。即:外壳不变,核心重写。

重载(Overload):一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同而类型和次序不同。

Java面向对象--多态

继续介绍我们的多态的相关内容。

多态产生的条件:

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()
	}
}
	

输出结果为:

Java面向对象--多态

当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。要想调用父类中被重写的方法,则必须使用关键字super。