`

继承、多态、重载和重写(转载)

    博客分类:
  • java
 
阅读更多

什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写。

 

继承(inheritance)

 

简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。继承是面向对象的三个基本特征--封装、继承、多态的其中之一,我们在使用JAVA时编写的每一个类都是在继承,因为在JAVA语言中,java.lang.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA 就会默认为它是继承自Object类的。

 

我们可以把JAVA中的类分为以下三种:

1. 类:使用class定义且不含有抽象方法的类。

2. 抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。

3. 接口:使用interface定义的类。

 

在这三种类型之间存在下面的继承规律:

类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。

抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接

口。

接口只能继承(extends)接口。

 

请注意上面三条规律中每种继承情况下使用的不同的关键字extendsimplements,它们是不可以随意替换的。大家知道,一个普通类继承一个接口后,必须实现这个接口中定义的所有方法,否则就只能被定义为抽象类。我在这里之所以没有对implements关键字使用“实现”这种说法是因为从概念上来说它也是表示一种继承关系,而且对于抽象类implements接口的情况下,它并不是一定要实现这个接口定义的任何方法,因此使用继承的说法更为合理一些。

 

以上三条规律同时遵守下面这些约束:

1. 类和抽象类都只能最多继承一个类,或者最多继承一个抽象类,并且这两种情况是互斥的,也就是说它们要么继承一个类,要么继承一个抽象类。

2. 类、抽象类和接口在继承接口时,不受数量的约束,理论上可以继承无限多个接口。当然,对于类来说,它必须实现它所继承的所有接口中定义的全部方法。

3. 抽象类继承抽象类,或者实现接口时,可以部分、全部或者完全不实现父类抽象类的抽象(abstract)方法,或者父类接口中定义的接口。

4. 类继承抽象类,或者实现接口时,必须全部实现父类抽象类的全部抽象(abstract)方法,或者父类接口中定义的全部接口。

 

继承给我们的编程带来的好处就是对原有类的复用(重用)。就像模块的复用一样,类的复用可以提高我们的开发效率,实际上,模块的复用是大量类的复用叠加后的效果。除了继承之外,我们还可以使用组合的方式来复用类。所谓组合就是把原有类定义为新类的一个属性,通过在新类中调用原有类的方法来实现复用。如果新定义的类型与原有类型之间不存在被包含的关系,也就是说,从抽象概念上来讲,新定义类型所代表的事物并不是原有类型所代表事物的一种,比如黄种人是人类的一种,它们之间存在包含与被包含的关系,那么这时组合就是实现复用更好的选择。下面这个例子就是组合方式的一个简单示例:

public class Sub {
	private Parent p = new Parent();
	public void doSomething() {
		// 复用Parent类的方法
		p.method();
		// other code
	}
}
class Parent {
	public void method() {
		// do something here
	}
}

 

当然,为了使代码更加有效,我们也可以在需要使用到原有类型(比如Parent p)时,才对它进行初始化。

 

使用继承和组合复用原有的类,都是一种增量式的开发模式,这种方式带来的好处是不需要修改原有的代码,因此不会给原有代码带来新的BUG,也不用因为对原有代码的修改而重新进行测试,这对我们的开发显然是有益的。因此,如果我们是在维护或者改造一个原有的系统或模块,尤其是对它们的了解不是很透彻的时候,就可以选择增量开发的模式,这不仅可以大大提高我们的开发效率,也可以规避由于对原有代码的修改而带来的风险。

 

多态(Polymorphism)

 

多态是又一个重要的基本概念,上面说到了,它是面向对象的三个基本特征之一。究竟什么是多态呢?我们先看看下面的例子,来帮助理解:

//汽车接口
interface Car {
	// 汽车名称
	String getName();
	// 获得汽车售价
	int getPrice();
}

// 宝马
class BMW implements Car {
	public String getName() {
		return "BMW";
	}
	public int getPrice() {
		return 300000;
	}
}

// 奇瑞QQ
class CheryQQ implements Car {
	public String getName() {
		return "CheryQQ";
	}
	public int getPrice() {
		return 20000;
	}
}

// 汽车出售店
public class CarShop {
	// 售车收入
	private int money = 0;
	// 卖出一部车
	public void sellCar(Car car) {
		System.out.println("车型:" + car.getName() + " 单价:" + car.getPrice());
		// 增加卖出车售价的收入
		money += car.getPrice();
	}
	// 售车总收入
	public int getMoney() {
		return money;
	}
	public static void main(String[] args) {
		CarShop aShop = new CarShop();
		// 卖出一辆宝马
		aShop.sellCar(new BMW());
		// 卖出一辆奇瑞QQ
		aShop.sellCar(new CheryQQ());
		System.out.println("总收入:" + aShop.getMoney());
	}
}

 

运行结果:

车型:BMW 单价:300000

车型:CheryQQ 单价:20000

总收入:320000

 

继承是多态得以实现的基础。从字面上理解,多态就是一种类型(都是Car类型)表现出多种状态(宝马汽车的名称是BMW,售价是300000;奇瑞汽车的名称是CheryQQ,售价是2000)。将一个方法调用同这个方法所属的主体(也就是对象或类)关联起来叫做绑定,分前期绑定和后期绑定两种。下面解释一下它们的定义:

1. 前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。

2. 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。

 

多态就是在后期绑定这种机制上实现的。多态给我们带来的好处是消除了类之间的耦合关系,使程序更容易扩展。比如在上例中,新增加一种类型汽车的销售,只需要让新定义的类继承Car类并实现它的所有方法,而无需对原有代码做任何修改,CarShop类的sellCar(Car car)方法就可以处理新的车型了。新增代码如下:

// 桑塔纳汽车
class Santana implements Car {
	public String getName() {
		return "Santana";
	}
	public int getPrice() {
		return 80000;
	}
}

 

 

重载(overloading)和重写(overriding)

 

重载和重写都是针对方法的概念,在弄清楚这两个概念之前,我们先来了解一下什么叫方法的型构(英文名是signature,有的译作“签名”,虽然它被使用的较为广泛,但是这个翻译不准确的)。型构就是指方法的组成结构,具体包括方法的名称和参数,涵盖参数的数量、类型以及出现的顺序,但是不包括方法的返回值类型,访问权限修饰符,以及abstractstaticfinal等修饰符。比如下面两个就是具有相同型构的方法:

public void method(int i, String s) {
	// do something
}
public String method(int i, String s) {
	// do something
}

 

而这两个就是具有不同型构的方法:

public void method(int i, String s) {
	// do something
}
public void method(String s, int i) {
	// do something
}

 

了解完型构的概念后我们再来看看重载和重写,请看它们的定义:

重写,英文名是overriding,是指在继承情况下,子类中定义了与其基类中方法具有相同型构的新方法,就叫做子类把基类的方法重写了。这是实现多态必须的步骤。

重载,英文名是overloading,是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法。在同一个类中,是不允许定义多于一个的具有相同型构的方法的。

 

我们来考虑一个有趣的问题:构造器可以被重载吗?答案当然是可以的,我们在实际的编程中也经常这么做。实际上构造器也是一个方法,构造器名就是方法名,构造器参数就是方法参数,而它的返回值就是新创建的类的实例。但是构造器却不可以被子类重写,因为子类无法定义与基类具有相同型构的构造器。

 

转载自:http://zangweiren.iteye.com/category/34977

分享到:
评论

相关推荐

    继承与多态,重载和重写

    详细描述继承,多态的概念和应用,阐述重载和重写的区别

    java 重载,重写以及继承,多态的区别

    java 重载,重写以及继承,多态的区别

    Java中继承、多态、重载和重写介绍

    主要介绍了Java中继承、多态、重载和重写介绍,需要的朋友可以参考下

    [Java]重载,重写以及继承,多态的区

    [Java]重载,重写以及继承,多态的区

    C#重写重载与多态

    重载:用于在给定了参数列表和一组候选函数成员的情况下,选择一个最佳函数成员来实施调用。多态:c#的多态性主要体现在类的继承上:子类继承父类的时候,可能出现同名但方法定义不同的情况, 所以在子类中会将原方法...

    java 接口 类 继承 多态的简单实例

    实现重载(overload)和重写(override) 调用中用到多态,向上转换,强制转换 所有被创建的类,都各自创建两个实现接口 最底层的类中创建内部类,并在外部类中调用内部类的方法

    java 重载,继承,重写和多态的区别. doc

    java 重载,继承,重写和多态的区别. 下面的例子包含了这四种实现

    《java面向对象程序设计-继承和多态》教案.doc

    super () 方法始终指向调用类的父类 调用父类构造方法 演示:示例 3 多态性 2-1 多态性是指¡°多种形式¡± 它使用不同的实例而执行不同操作 多态包括方法重写和方法重载 多态性 2-2 方法重载 2-1 方法重载 2-2 ...

    JAVA 面向对象程序设计第3章 继承与多态.pptx

    3.3 重载和重写;3.3 重载和重写;3.3.1 重载;3.3.1 重载;3.3.1 重载;3.3.2 重写;3.3.2 重写;3.3.2 重写;3.3.3 重写覆盖问题;3.3.4 学生实践练习;3.3.4 学生实践练习;3.4 多态;3.4 多态;3.4.1 多态应用;3.4.1 多态应用...

    java中重载,继承,重写和多态的区别

    主要介绍了java中重载,继承,重写和多态的区别,需要的朋友可以参考下

    重载与覆写/重写的区别

    重写和被重写方法返回值必须相同 * 此方法错误 */ // public double getSides() { // return 3d; // } // end // begin /** * 4. 重写方法抛出的异常必须和被重写方法抛出异常一致,或者是其子类 * 详细见:...

    第三章 继承与多态 掌握封装的含义及用法 什么是继承? 继承有什么作用? 怎么写继承?

    第三章 继承与多态 掌握封装的含义及用法 什么是继承? 继承有什么作用? 怎么写继承? 1.继承的概念及其用法 2.方法的重写及重载与其的区别 3.多态及其应用 4.super关键字 5.final关键字

    关于Java的几个经典问题

    (四)——final、finally和finalize的区别 (五)——传了值还是传了引用(六)——字符串(String)杂谈 (七)——日期和时间的处理 (八)——聊聊基本类型(内置类型)(九)——继承、多态、重载和重写(十)...

    java多态机制

    java的多态机制的讲解,重写,重载,子类父类的继承 java多态的应用

    JAVA面试题解惑系列114页.pdf

    (一)类的初始化顺序 (二)到底创建了几个String 对象? (三)变量(属性)的覆盖 (四)final、finally 和finalize 的区别 ...(九)继承、多态、重载和重写 (十)话说多线程 (十一)这些运算符你是否还记得?

    抽象类、继承、接口(重写重载)练习

    现在有FA,FB两种型号的飞机,DA,DB两种类型的火车。 以及交通工具这一抽象概念,交通工具必须...并且单独使用一个DeomTest作为入口类,要求汽车、飞机都使用交通工具类型的引用变量调用出行方法,表现出多态的特性。

    java上课笔记

    面向对象,封装,继承,多态,重载和重写的区别。接口,final关键字等笔记

    Java的多态(深入版)

    以及多态中的重写和重载在JVM中的表现是怎么样? (若文章有不正之处,或难以理解的地方,请多多谅解,欢迎指正) 多态 多态是同一个行为具有多个不同表现形式或形态的能力。 举个栗子,一只鸡可以做成白切鸡、豉油...

    javademo java知识的参考代码

    结合继承 重载 重写 多态等知识编写的代码

    Java面试题解惑系列

    来自网络,主要包括以下内容:1、类初始化的顺序;2、到底创建了几个String对象;3、变量(属性)的覆盖;...9.继承,多态,重载,重写;10.多线程;11.运算符总结。 适合将要笔试面试Java的朋友参考。

Global site tag (gtag.js) - Google Analytics