Java 中的继承是一种机制,其中一个对象获取父对象的所有属性和行为。它是OOPs(面向对象编程系统)的重要组成部分。
Java 中继承背后的思想是您可以创建基于现有类的新类。当您从现有类继承时,您可以重用父类的方法和字段。此外,您还可以在当前类中添加新方法和字段。
继承表示IS-A 关系,也称为父子关系。
为什么在java中使用继承
- 对于方法覆盖(因此可以实现运行时多态性)。
- 为了代码的可重用性。
继承中使用的术语
- 类:类是一组具有共同属性的对象。它是创建对象的模板或蓝图。
- 子类/子类:子类是继承其他类的类。它也被称为派生类、扩展类或子类。
- 超类/父类:超类是子类继承特征的类。它也被称为基类或父类。
- 可重用性:顾名思义,可重用性是一种机制,可以帮助您在创建新类时重用现有类的字段和方法。您可以使用已在上一类中定义的相同字段和方法。
Java继承的语法
class Subclass-name extends Superclass-name
{
//方法和字段
}
extends关键字表示您正在创建一个派生自现有类的新类。“扩展”的意思是增加功能。
在 Java 的术语中,被继承的类称为父类或超类,新类称为子类或子类。
Java 继承示例
如上图所示,Programmer是子类,Employee是超类。这两个类之间的关系是Programmer IS-A Employee。这意味着 Programmer 是 Employee 的一种。
class Employee{
float salary=40000;
}
class Programmer extends Employee{
int bonus=10000;
public static void main(String args[]){
Programmer p=new Programmer();
System.out.println("程序员工资为:"+p.salary);
System.out.println("程序员的奖金是:"+p.bonus);
}
}
输出:
程序员工资为:40000.0
程序员奖金为:10000
在上面的示例中,Programmer 对象可以访问自己类的字段以及Employee 类的字段,即代码可重用性。
java中的继承类型
在类的基础上,java中可以有三种继承类型:单级、多级和层次。
在java编程中,仅通过接口支持多重继承和混合继承。稍后我们将学习接口。
注意:Java 通过类不支持多重继承。
当一个类继承多个类时,称为多重继承。例如:
单一继承示例
当一个类继承另一个类时,它被称为单继承。在下面给出的例子中,
Dog 类继承了 Animal 类,因此存在单继承。
文件:TestInheritance.java
class Animal{
void eat(){
System.out.println("吃...");}
}
class Dog extends Animal{
void bark(){
System.out.println("叫声...");}
}
class TestInheritance{
public static void main(String args[]){
Dog d=new Dog();
d.bark();
d.eat();
}}
输出:
叫声…
吃…
多级继承示例
当有一个继承链时,它被称为多级继承。正如您在下面给出的示例中
看到的,BabyDog 类继承了 Dog 类,Dog 类又继承了 Animal 类,
因此存在多级继承。
文件:TestInheritance2.java
class Animal{
void eat(){
System.out.println("吃...");}
}
class Dog extends Animal{
void bark(){
System.out.println("叫声...");}
}
class BabyDog extends Dog{
void weep(){
System.out.println("哭泣...");}
}
class TestInheritance2{
public static void main(String args[]){
BabyDog d=new BabyDog();
d.weep();
d.bark();
d.eat();
}}
输出:
哭泣…
叫声…
吃…
层次继承示例
当两个或多个类继承一个类时,称为层次继承。在下面给出的例子中,
Dog 和 Cat 类继承了 Animal 类,因此存在层次继承。
文件:TestInheritance3.java
class Animal{
void eat(){
System.out.println("吃...");}
}
class Dog extends Animal{
void bark(){
System.out.println("叫声...");}
}
class Cat extends Animal{
void meow(){
System.out.println("喵呜……");}
}
class TestInheritance3{
public static void main(String args[]){
Cat c=new Cat();
c.meow();
c.eat();
//c.bark();//C.T.Error
}}
输出:
喵呜……
吃…
Q) 为什么java不支持多重继承?
为了降低复杂度和简化语言,java不支持多重继承。考虑一个
场景,其中 A、B 和 C 是三个类。C类继承了A类和B类。如果
A 类和 B 类有相同的方法,而你从子类对象调用它,那么调用
A 类或 B 类的方法就会产生歧义。
由于编译时错误比运行时错误好,如果您继承 2 个类,Java 会呈现编
译时错误。所以无论你有相同的方法还是不同的方法,都会有编译时
错误。
class A{
void msg(){
System.out.println("Hello");}
}
class B{
void msg(){
System.out.println("Welcome");}
}
class C extends A,B{
//假设它是
public static void main(String args[]){
C obj=new C();
obj.msg();//现在将调用哪个 msg() 方法?
}
}
输出:
Compile Time Error