Java面向对象之——继承

1. 继承的概念

  Java中每一个类都可以被继承,被继承的类称为父类/超类(super class),继承super class的类称为子类(subclass)。类之间的继承类似于人类社会中的父子继承。下面以人类的继承来帮助理解类之间的继承。

  我们都知道,孩子可以继承父辈的财产(如房子、汽车、股票等),可以向父辈学习他们会的技能,但不能继承父辈的长相、品质等个人私有属性。同样的,在Java类里的继承也有限制。

  Java类中,子类只能继承父类的 非  private 属性和 非  private 方法。private 属性和方法就好像父辈的长相和品质一样,是不可被继承的。非private的属性和方法就好像父辈的某些财产和会的技能,是可以继承和学习的。

  注意:子类可以继承父类的构造方法!子类使用super关键字只是调用了父类的构造方法而已。

2. 类的继承形式

  类继承的关键字是 extends,类的继承形式如下:

class A{
    private int id;
    public String name;
    
    public A(){}
    
    public void setName(){};
    private void setID(){};
    ......
}

class B extends A{
    ......
}

  在上面的代码中,类B继承了类A,但类B只能继承类A的name属性和setName()方法,因为它们是非private的;而不能继承id属性和setID()方法,因为它们是private的。同时,类A有一个自己的构造方法,子类B也可以在自己的构造方法里使用super关键字调用父类的构造方法。

  注意:如果父类构造方法没有参数,则在子类的构造方法中不需要使用 super 关键字调用父类构造方法,系统会自动调用父类的无参构造器。而如果父类的构造方法有参数,则子类需要在自己的构造方法中使用super关键字调用父类的构造方法,同时需要配上对应的参数列表。

 

3. 继承的优点

  继承是面向对象的重要概念(面向对象的基本特性之一。PS:面向对象三大基本特性:封装、继承、多态)。继承可以让子类直接重用父类的方法,降低了代码冗余,提高了代码的复用性,降低了代码的复杂性,提高了代码的可读性和可维护性。

  子类可以重写(override)父类的方法,也可以直接使用父类的方法(使用super关键字),还可以实现父类没有的方法,从而对父类进行扩展,提高了代码的灵活性。

4. 继承的缺点

  继承是一种侵入式设计,父类的代码可能会对子类的代码造成污染,而且提高了类之间的耦合性(高耦合)。

5. 继承的类型

  与CPP不同的是,Java的继承只支持单继承(即一个子类只能继承一个父类),就好像一个人只能有一个亲生父亲一样;但Java支持多个类继承同一个父类,一个类的所有子类称为兄弟类,这就好像一个父亲可以有多个孩子一样。我觉得说Java是完全纯粹的面向对象的编程语言毫不为过。因为所有关于面向对象的思想都可以在现实世界中找到类比的例子。Java类的继承类型如下图所示:

(注:上图来自于 Java继承: 菜鸟教程

6. 不可被继承的类

  如果我们希望一个类不能被其他类继承,就可以将类定义为 final 类,形式如下:

final class A{}

class B extends A{}

  将类A定义为了 final 类,那么类A将不能被其他类继承。如果我们像上面的代码那样让类B继承类A,编译器会直接报错。

7. 方法重写(Override)

  重写(override)是子类对父类允许访问的方法的实现过程(即方法体)进行重新编写。

  重写的优点在于可以根据子类特有的特性来定义自己的泛有行为,让子类更具有自己的特性。

  异常(Exception)限制:重写的方法只能抛出比被重写方法抛出的异常更狭隘的异常,比如如果被重写的类抛出了IOException,那么重写方法只能抛出与IOException相同或更狭小的异常(比如 UnknownServiceException),而不能抛出比IOException更广泛的异常(比如Exception)。

  在面向对象原则里,重写意味着可以重写任何现有方法。

重写的原则

  重写只能发生在子类中(如果一个类不继承另一个类,则即使该类有一个方法是与另一个类的某方法满足其它重写原则,那也不叫重写);

  参数列表必须与被重写方法完全相同;

  返回值类型可以与被重写方法不同,但必须是其返回值的派生类型(比如是其返回类型的父类);

  访问权限必须比被重写方法高或相同(比如被重写方法是public,则重写方法不能是protected);

  父类中声明为 final 和 static 的方法不可被重写,但 static 方法可以被再次声明;

  子类只能重写父类中自己可以访问到的非final和static方法(同一个包中子类可访问非private方法,不在同一个包中子类只能访问public方法)。

8. 重写与重载的区别

(内容来源:方法的重写与重载:菜鸟教程))

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值