Java 是一种面向对象的语言。这意味着 Java 中的一切都由类及其对象组成,并遵循 OOP(面向对象编程)的范式。其中一个范例是继承,这是 Java 中的一种机制,通过该机制允许一个类继承另一个类的功能(字段和方法)。简单来说,在Java中,继承就是在现有类的基础上创建新的类。
Java 继承的关键角色
- 继承是这样的概念:一个类可以部分或完全重复其父类(它所继承的类)的属性和方法。
- 子类、子类、扩展类或派生类是从另一个类继承的类。
- 父类、超类或基类是具有许多函数的类,并且这些函数可以被另一个类(子类)传递(继承)。
- 方法重写正在更改派生类方法的行为。这通常是更具体、更精致的行为。如果您重写继承者中父类中已有的方法,它会替换父类方法。
- 一个类只能有一个祖先类,但每个类可以有很多“孩子”。
怎么运行的
继承链从最抽象的类指向更具体的类。也就是说,超类是类链中最抽象的。通常它被表示为抽象(不需要实现的基类)。所有进一步的课程都更加具体。例如,有一个名为“Gadget”的类。它可以具有现场(或状态)“重量”现场电池容量、现场充电水平以及“工作”和充电的方法(或行为)。在这种情况下,方法可以是抽象的,即它们没有具体的实现。虽然我们不能说它是什么类型的小工具,但它绝对是任何可充电的小工具。让我们创建 Gadget 类的 Phone 子类。它不再需要重新定义重量和电池,它只是从抽象小工具继承它们。但工作的行为需要澄清。您还可以添加其他字段“屏幕对角线”、连接器等。您可以添加新方法“更新操作系统”。接下来,我们可以再创建两个类,它们都将从 Phone、Android 和 iPhone 继承。这两个类都继承了 Gadget 和 Smartphone 的所有字段和方法,并且这些方法可以被重写。第一类需要“品牌名称”字段,而 iPhone 不需要该字段,因为只有一家公司生产此类智能手机。class Gadget {
…
}
}
//subclass of Gadget class
class Phone extends Gadget {
…
}
//subclass of Phone class
class IPhone extends Phone {
…
}
//subclass of Phone class
class AndroidPhone extends Phone {
…
}
子类继承父类的所有公共成员和受保护成员。子类位于哪个包中并不重要。如果子类与父类位于同一包中,则它也会继承父类的包私有成员。您可以按原样使用继承的成员、替换它们、隐藏它们或添加新成员:
- 您可以像任何其他字段一样直接使用继承字段。
- 您可以在子类中声明一个与父类中同名的字段。它隐藏了它(所以最好不要这样做)。
- 您可以在子类中声明新字段(父类没有的字段)。
- 继承的方法可以直接使用,无需在派生类中重写。
- 您还可以在子类中编写一个与父类中的方法具有相同签名的新实例方法。此过程将覆盖它。
- 您可以在子类中声明父类中未声明的新方法。
- 您可以编写一个子类构造函数,该子类构造函数隐式或使用 super 关键字调用超类构造函数。
例子
让我们创建一个包含权重和商标字段以及work()方法的 MusicalInstrument 基类。我们还定义了一个构造函数。public class MusicalInstrument {
int weight;
String tradeMark;
public MusicalInstrument(int weight, String tradeMark) {
this.weight = weight;
this.tradeMark = tradeMark;
}
public void work() {
System.out.println("the instrument is playing...");
}
}
完全不清楚它是什么类型的乐器以及如何演奏它。让我们创建一种更具体的乐器:小提琴。它将具有与乐器中相同的字段(它们将在构造函数中使用 super 关键字调用。我们还可以重写工作方法并创建一个用于按字符串设置小提琴弦的方法。
public class Violin extends MusicalInstrument {
String master;
String owner;
int age;
boolean isTuned;
public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
super(weight, tradeMark);
this.master = master;
this.owner = owner;
this.age = age;
this.isTuned = isTuned;
}
@Override
public void work() {
System.out.println("THe violin's playing");
}
public void violinTuning () {
System.out.println("I'm tuning 1st string...");
System.out.println("I'm tuning 2nd string...");
System.out.println("I'm tuning 3rd string...");
System.out.println("I'm tuning 4th string...");
}
}
让我们创建一个Demo类来测试Violin类并看看继承是如何工作的。
public class InheritDemo {
public static void main(String[] args) {
Violin violin = new Violin(1, null, "Amati", "Kremer", 285, false);
violin.violinTuning();
violin.work();
}
}
在这种情况下,程序的输出将如下:
我正在调第一弦...我正在调第二弦...我正在调第三弦...我正在调第四弦...小提琴在演奏
也就是说,如果子类中存在重写的方法,那么将不再调用祖先方法。如果它不存在怎么办?也就是说,Violin 类如下所示:
public class Violin extends MusicalInstrument {
String master;
String owner;
int age;
boolean isTuned;
public Violin(int weight, String tradeMark, String master, String owner, int age, boolean isTuned) {
super(weight, tradeMark);
this.master = master;
this.owner = owner;
this.age = age;
this.isTuned = isTuned;
}
// @Override
// }
public void violinTuning () {
System.out.println("I'm tuning 1st string...");
System.out.println("I'm tuning 2nd string...");
System.out.println("I'm tuning 3rd string...");
System.out.println("I'm tuning 4th string...");
}
}
输出是:
我正在调第一弦...我正在调第二弦...我正在调第三弦...我正在调第四弦...乐器正在演奏...
即会自动调用祖先方法。顺便说一句,子类可以通过祖先来定义,即进行向上转型:
Parent parent = new Child()
此初始化用于仅访问父类中存在的成员和重写的方法。在我们的例子中它将是:
public class InheritDemo {
public static void main(String[] args) {
MusicalInstrument violin = new Violin(1, null, "Amati", "Kremer", 285, false);
//violin.violinTuning();
violin.work();
}
}
在这种情况下,我们无法配置小提琴方法。但同时,子孙类的 work()方法将被调用(如果存在)。
Java 平台类层次结构
在Java中,一切都是由类组成的,并且它们从属于一个层次结构。问题出现了:是否有一个类可以继承所有其他类?答案是肯定的,确实存在这样一个类。它被简单地称为Object。java.lang 包中的Object类定义并实现所有类(包括您创建的类)通用的行为。在 Java 平台中,许多类直接派生自Object,其他类派生自其中一些类,依此类推,形成类层次结构。Java 中的继承类型
让我们重点介绍 Java 中的几种继承类型。1.单一继承 这种类型就像我们上面的例子一样,子类继承一个超类的特性。下图中,A类作为派生类B的基类。 2.多级继承 这只是一个继承链,即有一个基类A,从它继承了B类,还有C类继承自类B。在Java中,类不能直接访问祖父母的成员。3. 层次继承 在层次继承中,一个类充当多个子类的超类(基类)。上面,我们给出了 Phone 类的示例,它可以有两个“子级”——AndroidPhone 和 IPhone。class A {
public void printA() {
System.out.println("A");
}
}
class B extends A {
public void printB() {
System.out.println(" B"); }
}
class C extends A {
public void printC() {
System.out.println("C");
}
}
class D extends A {
public void printD() {
System.out.println("D");
}
}
public class Demo {
public static void main(String[] args)
{
B objB = new B();
objB.printA();
objB.printB();
C objC = new C();
objC.printA();
objC.printC();
D objD = new D();
objD.printA();
objD.printD();
}
}
输出是:
A B A C D
4. 多重继承,即存在多个祖先...但是等等,Java 中不支持经典的多重继承。在某种程度上,它可以不使用类而是使用接口来实现。
interface A {
public void printA();
}
interface B {
public void printB();
}
interface C extends A, B {
public void print();
}
class InheritDemo implements C {
@Override
public void print()
{
System.out.println("Print something");
}
@Override
public void printA() {
}
@Override
public void printB() {
}
}
GO TO FULL VERSION