java继承与抽象类的关系

简介: 首先看继承代码class Instrument { void play(Note n) { print("Instrument.play() " + n); } String what() { return "Instrument"; } ...

首先看继承代码

class Instrument {
  void play(Note n) { print("Instrument.play() " + n); }
  String what() { return "Instrument"; }
  void adjust() { print("Adjusting Instrument"); }
}

class Wind extends Instrument {
  void play(Note n) { print("Wind.play() " + n); }
  String what() { return "Wind"; }
  void adjust() { print("Adjusting Wind"); }
}

class Percussion extends Instrument {
void play(Note n) { print("Percussion.play() " + n); }
String what() { return "Percussion"; }
void adjust() { print("Adjusting Percussion"); }
}

class Stringed extends Instrument {
void play(Note n) { print("Stringed.play() " + n); }
String what() { return "Stringed"; }
void adjust() { print("Adjusting Stringed"); }
}

class Brass extends Wind {
void play(Note n) { print("Brass.play() " + n); }
void adjust() { print("Adjusting Brass"); }
}
class Woodwind extends Wind {
void play(Note n) { print("Woodwind.play() " + n); }
String what() { return "Woodwind"; }
}

public class Music3 {
// Doesn’t care about type, so new types
// added to the system still work right:
public static void tune(Instrument i) {
// ...
i.play(Note.MIDDLE_C);
}
public static void tuneAll(Instrument[] e) {
for(Instrument i : e)
tune(i);
}
public static void main(String[] args) {
// Upcasting during addition to the array:
Instrument[] orchestra = {
new Wind(),
new Percussion(),
new Stringed(),
new Brass(),
new Woodwind()
};
tuneAll(orchestra);
}
}

基类Instrument 的方法都是“哑”方法,它这样的设计的目的是所有导出类(子类)创建一个通用的接口(play,what,adjust)。

那么创建一个通用接口的理由是什么?

理由1:不同的子类可以用不同方式表示此接口。通用接口建立起一种基本形式,用来表示导出类的共同部分。
理由2:把Instrument (父类)搞成抽象类。我们创建抽象类的目的是通过通用接口操作一系列的类。

抽象类目的就是建立通用接口,一种通用基本形式,只有方法定义,没有方法体实现。通俗讲就是一种类型标准。

抽象类概念:包含抽象方法的类叫做抽象类。

抽象后的乐器关系图

image.png

可以看出除了基类没有任何变化。
抽象类是普通类和接口之间的一种中庸之道,抽象类有它的使用场景。譬如。部分接口实现,部分接口定义为抽象方法,导出类直接集成就可以了。

抽象类带来的好处是:更快的代码开发,更好的代码组织,更好拓展程序及更容易的代码维护。

目录
相关文章
|
4天前
|
Java
Java 抽象类
5月更文挑战第4天
|
2天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
3天前
|
Java
Java一分钟之-抽象类与接口的应用场景
【5月更文挑战第9天】Java中,抽象类和接口用于实现多态和抽象。抽象类不能实例化,提供部分实现和定义模板;接口包含无实现的抽象方法,用于定义行为规范和解耦合。选择时,关注行为用接口,部分实现用抽象类。注意抽象类的`final`和`static`方法、接口冲突等问题,明确设计目标,适度抽象,遵循接口设计原则,以提高代码质量。
12 1
|
3天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
9 0
|
3天前
|
Java
java面向对象——包+继承+多态(一)-2
java面向对象——包+继承+多态(一)
16 3
|
3天前
|
SQL Java 编译器
java面向对象——包+继承+多态(一)-1
java面向对象——包+继承+多态(一)
16 2
|
6天前
|
机器学习/深度学习 Java C++
Java 继承
5月更文挑战第1天
|
14天前
|
Java 程序员 数据格式
关于Java抽象类和接口的总结和一点个人的看法
关于Java抽象类和接口的总结和一点个人的看法
|
14天前
|
Java
Java语言---面向对象的三大特征之继承
Java语言---面向对象的三大特征之继承
|
15天前
|
Java
java类、封装、继承
java类、封装、继承