[Java][extends的使用]

本文通过一个手机来电显示功能升级的例子,对比了直接修改原有代码与使用extends继承方式的优劣,强调了extends在代码扩展性和维护性上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个例子说明extends的使用场景

问题

需求:你现在制作了这样一款手机,有一个功能为来电显示,可以显示来电人的姓名

class ExtendsDemo {
	public static void main(String[] args) {
		Phone p = new Phone();
		p.show();
	}
}
class Phone{
	public void show(){
	System.out.println("name");
	}
}

现在手机的显示功能要升级了,不仅可以显示来电人的姓名还可以显示他的号码与他的照片,你要怎么做?

不当的做法:

这好办啊,直接在原来的show功能中填写新的代码就好了啊

class ExtendsDemo {
	public static void main(String[] args) {
		Phone p = new Phone();
		p.show();
	}
}
class Phone{
	public void show(){
	System.out.println("num");
	System.out.println("pic");
	System.out.println("name");
	}
}

这是直接在原来已经可以正确运行的代码上进行修改,在实际的开发过程中,这样的修改不会像这个例子一样只有两条语句,也可能不会只在一处进行修改。一旦运行错误,那么我们就要在很多的代码中进行修改,就会增加许多的时间成本。若是使用extends继承的话:
1.就不会干扰原来正常程序的运行,便于程序功能的扩展。
2.程序明显地有分块,出现错误修改时查看的代码量相对较少,便于程序的维护。

较好的做法:

我们定义一个新的类来继承原来的类,由于新增的功能也是来电显示功能,而且是在父类显示功能的基础上增加了一些功能,相当于原功能方法的升级,所以没必要再新加一个功能,直接在子类中改写show方法就可以了

class ExtendsDemo {
	public static void main(String[] args) {
		NewPhone p = new NewPhone();
		p.show();
	}
}
class Phone{
	public void show(){
	System.out.println("name");
	}
}
class NewPhone extends Phone{
	public void show(){
	System.out.println("num");
	System.out.println("pic");
	super.show();
	}
}

其中,在子类的show方法中,我们没必要把父类的show方法代码直接copy过来,因为在实际开发过程中,父类show方法的代码可能是非常多的,直接copy的话代码会显得冗长,阅读性差,而且完全没必要这么做。我们直接在子类show方法中调用父类的show方法就好了,但是子类中也有show方法,直接写的话,JVM会优先在本类(本例中即子类)查找show方法,所以我们要加上super来告诉JVM我们要调用的是父类中的show方法。

### Java中`extends`关键字的使用方法及示例 在Java中,`extends`关键字用于实现类之间的继承关系。继承是面向对象编程的核心特性之一,它允许一个类(子类)继承另一个类(父类)的属性和方法。通过这种方式,可以提高代码的复用性,并建立清晰的类层次结构。 #### 1. 继承的基本语法 在Java中,使用`extends`关键字来声明一个类是另一个类的子类。其基本语法如下: ```java class 子类extends 父类名 { // 子类的成员变量和方法 } ``` 例如,定义一个名为`Animal`的父类,并定义一个名为`Fish`的子类,表示鱼类继承自动物类: ```java class Animal { void eat() { System.out.println("Animal eat"); } void sleep() { System.out.println("Animal sleep"); } void breathe() { System.out.println("Animal breathe"); } } class Fish extends Animal { void breathe() { System.out.println("Fish breathe"); } } ``` 在这个例子中,`Fish`类继承了`Animal`类的所有非私有方法,并且覆盖了`breathe()`方法以提供特定的行为[^3]。 #### 2. 单继承与多层继承 Java不支持多继承,即一个类不能直接继承多个父类。但是,可以通过多层继承的方式实现类似的功能。例如: ```java class A { void methodA() { System.out.println("Method from class A"); } } class B extends A { void methodB() { System.out.println("Method from class B"); } } class C extends B { void methodC() { System.out.println("Method from class C"); } } ``` 在这个例子中,`C`类继承自`B`类,而`B`类又继承自`A`类。因此,`C`类可以访问`B`类和`A`类中的所有非私有方法。 #### 3. 方法重写(Override) 子类可以重写父类方法以提供不同的实现。例如,在前面的例子中,`Fish`类重写了`breathe()`方法: ```java class Fish extends Animal { @Override void breathe() { System.out.println("Fish breathe"); } } ``` 当调用`Fish`类的实例的`breathe()`方法时,将执行子类中的实现而不是父类中的实现[^5]。 #### 4. 使用`super`关键字 在子类中,可以使用`super`关键字来调用父类的构造函数或方法。例如: ```java class Person { void say() { System.out.println("Person say"); } } class ExPerson extends Person { @Override void say() { System.out.println("Son say"); } void sleep() { super.say(); System.out.println("Son sleep"); } } ``` 在这个例子中,`ExPerson`类的`sleep()`方法通过`super.say()`调用父类`Person`的`say()`方法[^4]。 #### 5. 私有方法与继承 需要注意的是,父类中的私有方法不能被子类继承或重写。例如: ```java class Person { private void age() { System.out.println("Person age"); } } ``` 在这个例子中,`age()`方法是私有的,因此子类无法访问或重写方法[^4]。 #### 6. 完整示例 下面是一个完整的示例,展示了如何使用`extends`关键字以及方法重写和`super`关键字的用法: ```java public class Person { public void say() { System.out.println("Person say"); } public void cry() { System.out.println("Person cry"); } public void run() { System.out.println("Person run"); } } public class ExPerson extends Person { @Override public void say() { System.out.println("Son say"); } public String cry(String cry) { System.out.println("Son cry"); return cry; } public void sleep() { super.say(); System.out.println("Son sleep"); } public static void main(String[] args) { Person per = new Person(); ExPerson exper = new ExPerson(); per.say(); // 输出 "Person say" exper.say(); // 输出 "Son say" exper.sleep(); // 输出 "Person say" 和 "Son sleep" exper.cry("cry"); // 输出 "Son cry" exper.cry(); // 输出 "Person cry" } } ``` 在这个示例中,`ExPerson`类继承了`Person`类,并重写了部分方法,同时增加了新的方法[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值