20170815Java——继承,重载,重写三剑客

Java继承与方法重写
本文介绍了Java中的继承概念,包括继承的基本原理、使用方法及初始化顺序等,并详细阐述了方法重载与重写的区别,以及如何正确地使用super关键字。

About-继承

  • 所有Java的类均是由java.lang.Object类继承而来的,所以Object是所有类的祖先类,而除了Object外,所有类必须有一个父类。

  • 继承可以理解为一个对象从另一个对象获取属性的过程。

  • 如果类A是类B的父类,而类B是类C的父类,我们也称C是A的子类,类C是从类A继承而来的。在Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类。

Java只支持单继承(继承基本类和抽象类),但是我们可以用接口来实现(多继承接口来实现),脚本结构如:

public class Apple extends Fruit implements Fruit1, Fruit2{}
 
  • 1
  • 1
如何使用继承

1、编写父类

class A{ 
//共同的属性,方法 }

2、 编写子类,继承父类

class B extends A{ //子类持有的属性和方法 }

理解继承

1、子类访问父类成员

使用super关键字

2、访问父类属性

super代表父类对象 super.name;

3、 访问父类方法

super.print();

继承后的初始化顺序
  1. 父类属性
  2. 父类构造方法
  3. 子类属性
  4. 子类构造方法
不能继承的条件

有些父类成员不能继承:

  1. 子类不能访问父类private成员
  2. 子类与父类不在同包,使用默认访问权限的成员
  3. 构造方法

About-重载

  • 重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型呢?可以相同也可以不同。
  • 每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
  • 重载
重载规则
  • 被重载的方法必须改变参数列表;
  • 被重载的方法可以改变返回类型;
  • 被重载的方法可以改变访问修饰符;
  • 被重载的方法可以声明新的或更广的检查异常;
  • 方法能够在同一个类中或者在一个子类中被重载。-

About-重写

重写(Override)

  • 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!
  • 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
  • 在面向对象原则里,重写意味着可以重写任何现有方法。
方法的重写。
  • 在有父类方法的子类重写父类的方法。
  • 默认调用父类方法内容。
  • 作用:可以在子类中重写父类方法。
调用父类中定义的方法结果:

1,如果子类没有重写父类的方法,调用的就是父类的实现。

2.如果子类重写了父类的方法,调用的就是子类中的实现。

方法写重写的规则

参数列表必须完全与被重写方法的相同; 
返回类型必须完全与被重写方法的返回类型相同; 
访问权限不能比父类中被重写的方法的访问权限更高。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。 
父类的成员方法只能被它的子类重写。 
声明为final的方法不能被重写。 
声明为static的方法不能被重写,但是能够被再次声明。 
如果一个方法不能被继承,那么该方法不能被重写。 
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。 
子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法。 
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。 
构造方法不能被重写。 
如果不能继承一个方法,则不能重写这个方法。


Super关键字的使用

当需要在子类中调用父类的被重写方法时,要使用super关键字。


“三剑客”的区别

这里写图片描述

<think>首先,用户要求详细解释Java中的继承、多态、重载重写概念。我需要基于提供的引用来回答,但引用不是用户真正的需求;我应该参考用户上一次的问题和我的回答。用户上一次的问题是关于Java继承、多态、重载重写的详细解释,所以我会直接回答这个。 系统级指令: - 数学表达式使用$...$格式(但这里可能不需要,因为是Java概念)。 - 独立公式使用$$...$$格式(同样,可能不适用)。 - LaTeX语法正确(所以如果使用数学,要用LaTeX)。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识,例如[^1]。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠(基于我的知识)。 关键概念: 1. **继承(Inheritance)**:子类继承父类的属性和方法。 2. **多态(Polymorphism)**:对象可以以多种形式出现,特别是在运行时绑定。 3. **重载(Overloading)**:同一类中多个方法同名但参数不同。 4. **重写(Overriding)**:子类覆盖父类的方法,参数相同。 从引用中提取要点: - 引用[1]:多态通过后期绑定实现,消除耦合,帮助扩展。重载重写是多态的表现。 - 引用[2]:继承使用extends关键字,包括重载重写、构造、多态等。 - 引用[3]:重载在同一类中,方法名相同但参数不同;重写在子类中,方法签名相同。 - 引用[4]:重载重写的示例代码。 我的回答结构: 1. **引言**:简要介绍这些概念。 2. **详细解释每个概念**: - 继承 - 多态 - 重载 - 重写 3. **结合例子**:从引用中取例子或创建简单例子。 4. **总结**:关系和作用。 5. **生成相关问题**:在最后部分。 生成相关问题:系统指令要求生成相关问题,所以回答末尾添加§§相关问题§§部分。 使用中文回答。 引用添加:在回答中,如果引用特定段落,末尾添加引用标识。既然用户提供了引用[1]到[4],我应该参考它们,但不是直接复制。 构建回答: - 先定义每个概念。 - 解释关系:重载重写是多态的实现方式。 - 示例:使用简单Java代码片段(用code block,如示例中的Python代码)。 代码格式:示例中用```python...```,我应该用```java...```。 逐步解释: 1. **继承**: - 定义:子类继承父类的属性和方法。 - 优点:代码重用,易于扩展。 - 例子:来自引用[2],SUPER.java和SUPERA.java。 2. **重载**: - 定义:同一类中多个方法同名但参数列表不同(类型、数量或顺序)。 - 例子:引用[4],Instrument类的play方法重载。 3. **重写**: - 定义:子类覆盖父类的方法,参数相同(签名相同)。 - 与重载区别:重载在同类,重写继承关系中。 - 例子:引用[3],子类重写父类方法。 4. **多态**: - 定义:对象在不同上下文表现出不同行为;通过后期绑定实现。 - 作用:减少耦合,增强扩展性。 - 例子:引用[1],CarShop类处理不同车型。 关系:继承启用多态;重写是多态的关键;重载是同类的多态形式。 最后,生成相关问题。 完整回答大纲: - 介绍Java OOP概念。 - 继承:解释和例子。 - 重载:解释和例子。 - 重写:解释和例子。 - 多态:解释和例子。 - 总结关系。 - §§相关问题§§:3-5个相关问题。 确保真实可靠:基于标准Java知识。 </think>### Java继承、多态、重载重写的详细解释 在Java面向对象编程(OOP)中,继承、多态、重载重写是核心概念。它们共同支持代码的可重用性、灵活性和扩展性。下面我将逐步解释每个概念的定义、作用、例子及其相互关系,确保解释清晰易懂。回答基于您的引用内容,并结合标准Java知识进行扩展。 #### 1. **继承(Inheritance)** - **定义**:继承允许一个类(子类)基于另一个类(父类)来构建新类,从而复用父类的属性和方法。Java中使用`extends`关键字实现继承。 - **作用**:减少代码重复,便于扩展功能。例如,当新增功能时,只需创建子类继承父类,而无需修改原有代码。 - **例子**:引用[2]中提到一个示例,创建父类`SUPER.java`和子类`SUPERA.java`。假设`SUPER`是通用父类,`SUPERA`继承它: ```java // 父类 SUPER.java public class SUPER { public void display() { System.out.println("This is the parent class"); } } // 子类 SUPERA.java public class SUPERA extends SUPER { // 使用extends继承 // 子类可以添加新方法或重写父类方法 } ``` - 在`Test.java`中,子类对象可以直接调用父类的`display()`方法,体现了代码复用性[^2]。 - **关键点**:子类继承父类的所有非私有成员(属性和方法),但构造器不被继承(需通过`super()`调用)。 #### 2. **重载(Overloading)** - **定义**:重载指在同一个类中,定义多个同名方法,但参数列表不同(例如参数类型、数量或顺序不同)。返回值类型可以相同或不同,但仅返回值不同不足以构成重载。 - **作用**:提高代码可读性和灵活性,允许方法根据输入参数自动选择执行逻辑。 - **例子**:引用[4]中展示了`Instrument`类的重载示例: ```java public class Instrument { // 重载方法1: 接受一个int参数 public void play(int i) { System.out.println("Instrument " + i); } // 重载方法2: 接受int和String参数 public void play(int i, String str) { System.out.println("Brass " + i + " " + str); } } ``` - 这里,`play`方法名相同,但参数不同(数量和类型),Java编译器在编译时根据参数决定调用哪个方法[^4]。重载是一个类的多态性表现,因为它允许同一方法名处理不同输入[^3]。 #### 3. **重写(Overriding)** - **定义**:重写指在子类中重新定义父类的方法,方法签名(方法名、参数列表和返回类型)必须完全相同。重写使用`@Override`注解显式声明(非强制,但推荐)。 - **作用**:实现运行时多态(动态绑定),允许子类提供特定实现,覆盖父类的默认行为。 - **例子**:引用[3]描述了重写的情况。假设父类`Car`有一个方法,子类`ElectricCar`重写它: ```java // 父类 Car.java public class Car { public void startEngine() { System.out.println("Engine started with petrol"); } } // 子类 ElectricCar.java public class ElectricCar extends Car { @Override public void startEngine() { // 方法签名相同 System.out.println("Engine started with electricity"); } } ``` - 使用时,通过父类引用调用`startEngine()`,运行时根据实际对象类型执行子类方法。这体现了子类与父类的多态性[^3]。 #### 4. **多态(Polymorphism)** - **定义**:多态指对象可以以多种形式呈现,Java中主要通过运行时绑定(后期绑定)实现。它允许同一操作(如方法调用)作用在不同对象上产生不同行为。 - **作用**:减少代码耦合,增强可扩展性。例如,新增类时无需修改现有代码,只需继承父类并实现方法。引用[1]强调,多态使程序更容易扩展,如新增车型时,`CarShop`类无需改动就能处理新对象[^1]。 - **实现方式**:多态依赖继承重写: - **编译时多态**:通过重载实现,编译器在编译时确定方法调用(如`play`方法的选择)。 - **运行时多态**:通过重写实现,JVM在运行时根据对象实际类型决定调用哪个方法(如`startEngine()`在父类引用上的行为)。 - **例子**:引用[1]的汽车销售场景: ```java public class CarShop { public void sellCar(Car car) { // 参数类型是父类Car car.startEngine(); // 运行时绑定到实际子类的重写方法 } } // 使用 CarShop shop = new CarShop(); shop.sellCar(new ElectricCar()); // 输出: Engine started with electricity shop.sellCar(new PetrolCar()); // 输出: Engine started with petrol(假设PetrolCar重写了startEngine) ``` - 这种方式,新增`HybridCar`类继承`Car`后,`sellCar`方法可直接处理,无需修改代码,体现了多态的优势[^1]。 #### 总结关系 - **继承是基础**:它建立了类层次结构,使重写和多态成为可能。 - **重载重写是多态的实现**: - 重载支持编译时多态(同一类内)。 - 重写支持运行时多态(跨继承层次)。 - **多态是核心**:它通过动态绑定实现代码解耦,提升可维护性。引用[3]明确区分:重载是类的多态性,重写是父子类的多态性[^3]。 - **整体作用**:这些概念协同工作,使Java程序更灵活、易于扩展。例如,在引用[2]的示例项目中,继承重写和多态结合使用,简化了代码结构[^2]。 如果您有具体代码场景或需要更多实例,请随时说明!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值