`

java——继承、多态、重载和重写

阅读更多

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

 

 继承

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

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

 1. 普通类:使用class定义且不含有抽象方法的类。
 2. 抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。
 3. 接口类:使用interface定义的类。 

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

  普通类可以继承(extends)普通类,可以继承(extends)抽象类,可以继承(implements)接口。
  抽象类可以继承(extends)普通类,可以继承(extends)抽象类,可以继承(implements)接口。
  接口只能继承(extends)接口。 

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

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

 1. 普通类和抽象类都只能最多继承一个普通类,或者最多继承一个抽象类,并且这两种情况是互斥的,也就是说它们要么继承一个普通类,要么继承一个抽象类。
 2. 普通类、抽象类和接口在继承接口时,不受数量的约束,理论上可以继承无限多个接口。当然,对于普通类来说,它必须实现它所继承的所有接口中定义的全部方法。 

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

 1. public class sub { 
 2. private parent p = new parent()  
 3. 
 4. public void dosomething() { 
 5. // 复用parent类的方法 
 6. p.method()  
 7. // other code 
 8. } 
 9. } 
 10. 
 11. class parent { 
 12. public void method() { 
 13. // do something here 
 14. } 
 15. } 

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

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

 多态

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

 1. //汽车接口 
 2. interface car { 
 3. // 汽车名称 
 4. string getname()  
 5. 
 6. // 获得汽车售价 
 7. int getprice()  
 8. } 
 9. 
 10. // 宝马 
 11. class bmw implements car { 
 12. public string getname() { 
 13. return " bmw"   
 14. } 
 15. 
 16. public int getprice() { 
 17. return 300000  
 18. } 
 19. } 
 20. 
 21. // 奇瑞qq 
 22. class cheryqq implements car { 
 23. public string getname() { 
 24. return " cheryqq"   
 25. } 
 26. 
 27. public int getprice() { 
 28. return 20000  
 29. } 
 30. } 
 31. 
 32. // 汽车出售店 
 33. public class carshop { 
 34. // 售车收入 
 35. private int money = 0  
 36. 
 37. // 卖出一部车 
 38. public void sellcar(car car) { 
 39. system.out.println(" 车型:"  + car.getname() + "  单价:"  + car.getprice())  
 40. // 增加卖出车售价的收入 
 41. money += car.getprice()  
 42. } 
 43. 
 44. // 售车总收入 
 45. public int getmoney() { 
 46. return money  
 47. } 
 48. 
 49. public static void main(string[] args) { 
 50. carshop ashop = new carshop()  
 51. // 卖出一辆宝马 
 52. ashop.sellcar(new bmw())  
 53. // 卖出一辆奇瑞qq 
 54. ashop.sellcar(new cheryqq())  
 55. system.out.println(" 总收入:"  + ashop.getmoney())  
 56. } 
 57. } 

 运行结果:

 1. 车型:bmw 单价:300000
 2. 车型:cheryqq 单价:20000
 3. 总收入:320000 

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

 1. 前期绑定:在程序运行之前进行绑定,由编译器和连接程序实现,又叫做静态绑定。比如static方法和final方法,注意,这里也包括private方法,因为它是隐式final的。
 2. 后期绑定:在运行时根据对象的类型进行绑定,由方法调用机制实现,因此又叫做动态绑定,或者运行时绑定。除了前期绑定外的所有方法都属于后期绑定。 

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

 1. // 桑塔纳汽车 
 2. class santana implements car { 
 3. public string getname() { 
 4. return " santana"   
 5. } 
 6. 
 7. public int getprice() { 
 8. return 80000  
 9. } 
 10. } 

 重载和重写

 重载和重写都是针对方法的概念,在弄清楚这两个概念之前,我们先来了解一下什么叫方法的型构。型构就是指方法的组成结构,具体包括方法的名称和参数,涵盖 参数的数量、类型以及出现的顺序,但是不包括方法的返回值类型,访问权限修饰符,以及abstract、static、final等修饰符。比如下面两个 就是具有相同型构的方法:
 java代码 复制代码

 1. public void method(int i  string s) { 
 2. // do something 
 3. } 
 4. 
 5. public string method(int i  string s) { 
 6. // do something 
 7. } 

 而这两个就是具有不同型构的方法:
 java代码 复制代码

 1. public void method(int i  string s) { 
 2. // do something 
 3. } 
 4. 
 5. public void method(string s  int i) { 
 6. // do something 
 7. } 

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

  重写,英文名是override,是指在继承情况下,子类中定义了与其基类中方法具有相同型构的新方法,就叫做子类把基类的方法重载了。这是实现多态必须的步骤。
  重载,英文名是overload,是指在同一个类中定义了一个以上具有相同名称,但是型构不同的方法。在同一个类中,是不允许定义多于一个的具有相同型构的方法的。 

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

分享到:
评论

相关推荐

    java 三大特性--封装、继承和多态理解

    Java编程语言以其强大的功能和广泛的应用而闻名,其中三大特性——封装、继承和多态是其核心概念,对于理解和编写高效、可维护的代码至关重要。 **封装**是面向对象编程的基础,它涉及到将数据(属性)和操作这些...

    关于Java的几个经典问题

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

    java——基础商城小项目 包含面向对象 多态 接口

    【标题】"java——基础商城小项目 包含面向对象 多态 接口" 提供了关于这个Java项目的三个核心概念:面向对象编程、多态性和接口。这些是Java编程语言中的基本但至关重要的特性。 面向对象编程(Object-Oriented ...

    Java 语言程序设计:第5章接口多态.ppt

    本章主要讲解 Java 语言程序设计中接口和多态的概念、语法和应用。接口是 Java 语言中的一种抽象机制,它提供了一种定义类之间的“协议”的方式,允许类之间实现多继承,同时免除 C++ 中的多继承那样的复杂性。同时...

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

    Java中的四个核心概念——重载(Overloading)、继承(Inheritance)、重写(Overriding)和多态(Polymorphism)是面向对象编程的基础。理解它们的区别有助于编写更灵活、可扩展的代码。 1. 重载(Overloading):...

    JAVA语言程序设计-第七章 类的封装、多态和继承

    **Java语言程序设计-第七章 类的封装、多态和继承** 在Java编程语言中,类的封装、多态和继承是面向对象编程的三大核心特性。这些概念为软件开发提供了强大的抽象能力和代码复用机制,使得程序设计更加灵活、高效。...

    重载与覆写/重写的区别

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

    13.java学习第十三章——方法覆盖和多态.pdf

    ### Java学习第十三章——方法覆盖和多态 #### 一、方法覆盖(重写 —— Override) **1.1 回顾方法重载** 在Java中,**方法重载**(Overloading)指的是在一个类中定义多个同名方法,但这些方法的参数列表必须有所...

    Java语言基础入门教程 Java开发编程基础课程 第11章 继承、多态和接口 共21页.pptx

    总结而言,本章节介绍了Java语言中面向对象编程的核心概念——继承、多态和接口。这些概念是理解和运用Java语言进行软件开发的基础,掌握它们能够帮助开发者写出更加模块化、可维护和高效的代码。

    Java三剑客:封装、继承、多态的魔法世界

    在Java中,多态可以通过重写(Overriding)和重载(Overloading)两种方式实现。 **重写**发生在继承关系中,子类可以重写父类的方法,以提供特定于子类的行为。当通过父类引用调用方法时,实际上执行的是子类的...

    Thinking in Java——自己手写的代码

    - 多态:不同对象对同一消息的不同响应,体现为重写和重载。 - 接口:定义行为规范,实现多继承机制。 2. **封装、抽象与访问控制**: - private、public、protected修饰符,控制类成员的可见性。 - 封装:隐藏...

    Java 语言与面向对象程序设计(2版)实验指导5.1

    在本实验指导中,我们将深入探讨Java编程语言中的核心概念——面向对象程序设计,并重点关注“继承”和“方法重载”这两个关键特性。面向对象编程(Object-Oriented Programming,OOP)是Java的核心思想,它允许我们...

    java笔试-选择题.doc

    多态是指一个对象可以以多种形式出现,例如重载和重写。 二、继承 继承是指子类继承父类的成员变量和方法。在 Java 中,继承可以单继承,也可以多继承。继承的好处是可以实现代码复用和增强代码的可维护性。然而,...

    Java面试题详解,和一些基础知识的深入剖析,个人认为非常棒

    “JAVA面试题解惑系列(九)——继承、多态、重载和重写”是面向对象编程的基础,继承允许类之间的层次结构,多态提供了一种“一个接口,多种实现”的灵活性,而重载和重写则涉及到方法签名和行为的差异。...

    完整版优质java课件 Java基础入门教程 Java编程技术14 补充--对多态、抽象和接口的理解(共24页).ppt

    编译时多态主要通过方法重载(Overloading)实现,而运行时多态则依赖于方法重写(Overriding)和向上转型。 2. **抽象(Abstraction)**:抽象是对复杂现实世界的简化表示,它关注对象的共同特征和行为,而不涉及...

    java课程设计实例——java源代码

    6. **类与对象**:讲解面向对象编程的基础,包括类的定义、对象的创建与销毁,封装、继承和多态的概念。 7. **方法**:函数的定义与调用,参数传递,方法重载和重写。 8. **异常处理**:理解异常的产生,学习try-...

    115个Java面试题和答案——终极(上).pdf

    在Java中,多态可以通过方法重载和方法重写实现。方法重载(overloading)是在同一个类中定义多个同名但参数列表不同的方法;方法重写(overriding)是在子类中重新定义父类的方法。多态的优势在于: - **灵活性**:...

    Java语言程序设计教程(Java 7)——入门与提高篇04

    在Java中,多态是通过方法重载和方法重写来实现的。这意味着父类可以引用子类的实例,并调用与之相关的方法。 ### Object类和Class类的使用 - **Object类**:在Java中,所有的类都直接或间接地继承自`Object`类,...

    JAVA面试题解惑系列合集

    .63 1.9 JAVA面试题解惑系列(九)——继承、多态、重载和重写 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .80 1.10 JAVA面试题解惑系列(十)——话说多线程 . . . . . . . . . . . . . . . ...

    8.java学习第八章——面向对象.pdf

    在Java中,多态可以通过方法重载和方法重写来实现。多态使得我们可以编写更加灵活和可扩展的代码。 综上所述,面向对象编程提供了一种强大的工具集,用于构建复杂而灵活的应用程序。通过理解面向过程和面向对象之间...

Global site tag (gtag.js) - Google Analytics