橘子味的心
标题:Java继承

Java中的继承是一种机制,表示为一个对象获取父对象的所有属性和行为。

在Java中继承是:可以创建基于现有类构建新的类。 当您从现有类继承时,就可以重复使用父类的方法和字段,也可以在继承的新类中添加新的方法和字段。

继承表示IS-A关系,也称为父子关系。

为什么在java中使用继承?

对于方法覆盖(因此可以实现运行时的多态性),提高代码可重用性。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写(覆盖)。

Java继承的语法

  1. class Subclass-name extends Superclass-name
  2. {
  3. //methods and fields
  4. }
  5. Java

extends关键字表示正在从现有类派生创建的新类。 “extends”的含义是增加功能。在Java的术语中,继承的类称为父类或超类,新类称为子或子类。

Java继承示例

如上图所示,Programmer是子类,Employee是超类。 两个类之间的关系是Programmer IS-A Employee. 它表示 Programmer 是一种 Employee 的类型。

参考下面示例代码的实现 -

  1. class Employee {
  2. float salary = 40000;
  3. }
  4.  
  5. class Programmer extends Employee {
  6. int bonus = 10000;
  7.  
  8. public static void main(String args[]) {
  9. Programmer p = new Programmer();
  10. System.out.println("Programmer salary is:" + p.salary);
  11. System.out.println("Bonus of Programmer is:" + p.bonus);
  12. }
  13. }
  14. Java

执行上面代码得到以下结果 -

  1. Programmer salary is:40000.0
  2. Bonus of programmer is:10000
  3. Java

在上面的例子中,Programmer对象可以访问自身类以及Employee类的字段,即提高了代码可重用性。

java继承类型

在类的基础上,在java中可以有三种类型的继承:单一,多级和分层。在Java编程中,仅能通过接口支持多重和混合继承。稍后章节中我们将了解学习接口的应用。

注意:在java中的类不支持多继承。

当一个类扩展多个类,即被称为多重继承。 例如:

(1). 单一继承示例

文件 TestInheritance.java 中的代码如下 -

  1. class Animal {
  2. void eat() {
  3. System.out.println("eating...");
  4. }
  5. }
  6.  
  7. class Dog extends Animal {
  8. void bark() {
  9. System.out.println("barking...");
  10. }
  11. }
  12.  
  13. class TestInheritance {
  14. public static void main(String args[]) {
  15. Dog d = new Dog();
  16. d.bark();
  17. d.eat();
  18. }
  19. }
  20. Java

执行上面代码得到以下结果 -

  1. barking...
  2. eating...
  3. Java

(2). 多级继承示例

文件 TestInheritance2.java 中的代码如下 -

  1. class Animal {
  2. void eat() {
  3. System.out.println("eating...");
  4. }
  5. }
  6.  
  7. class Dog extends Animal {
  8. void bark() {
  9. System.out.println("barking...");
  10. }
  11. }
  12.  
  13. class BabyDog extends Dog {
  14. void weep() {
  15. System.out.println("weeping...");
  16. }
  17. }
  18.  
  19. class TestInheritance2 {
  20. public static void main(String args[]) {
  21. BabyDog d = new BabyDog();
  22. d.weep();
  23. d.bark();
  24. d.eat();
  25. }
  26. }
  27. Java

执行上面代码得到以下结果 -

  1. weeping...
  2. barking...
  3. eating...
  4. Java

(3). 多级继承示例

文件 TestInheritance3.java 中的代码如下 -

  1. class Animal {
  2. void eat() {
  3. System.out.println("eating...");
  4. }
  5. }
  6.  
  7. class Dog extends Animal {
  8. void bark() {
  9. System.out.println("barking...");
  10. }
  11. }
  12.  
  13. class Cat extends Animal {
  14. void meow() {
  15. System.out.println("meowing...");
  16. }
  17. }
  18.  
  19. class TestInheritance3 {
  20. public static void main(String args[]) {
  21. Cat c = new Cat();
  22. c.meow();
  23. c.eat();
  24. // c.bark();//C.T.Error
  25. }
  26. }
  27. Java

执行上面代码得到以下结果 -

  1. meowing...
  2. eating...
  3. Java

问题:为什么在Java中不支持多重继承?

为了降低复杂性并简化语言,Java中不支持多重继承。想象一个:ABC是三个类。 C类继承AB类。 如果AB类有相同的方法,并且从子类对象调用它,AB类的调用方法会有歧义。

因为编译时错误比运行时错误好,如果继承2个类,java会在编译时报告错误。 所以无论子类中是否有相同的方法,都会有报告编译时错误。例如下面的代码是编译出错的。

  1. class A {
  2. void msg() {
  3. System.out.println("Hello");
  4. }
  5. }
  6.  
  7. class B {
  8. void msg() {
  9. System.out.println("Welcome");
  10. }
  11. }
  12.  
  13. class C extends A,B
  14. {//suppose if it were
  15.  
  16. Public Static
  17.  
  18. void main(String args[]) {
  19. C obj = new C();
  20. obj.msg();// Now which msg() method would be invoked?
  21. }
  22. }
  23. Java