【JavaSE】【面向对象08】面向对象三大特征---继承

面向对象的基本特征之二:继承Inheritance

1、为什么要有继承?

  • 当多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。提高了代码的复用性。

  • 继承的出现让类与类之间产生了关系,可以创建更为特殊的类型。

  • 利于可维护性。

此处的多个类称为子类(派生类SubClass),单独的这个类称为父类(基类或超类SuperClass)
可以理解为:“子类 is a 父类”

2、如何继承?

类继承语法规则:class Subclass extends Superclass{ }
在Java 中,继承的关键字用的是“extends”,即子类不是父类的子集,而是对父类的“扩展”

3、继承的特点

(1)子类可以继承父类所有的属性和方法,包括私有的

  • 父类中的成员,无论是公有(public)还是私有(private),均被子类继承。
  • 只是因为访问控制修饰符的原因,子类不能对继承的私有成员直接进行访问,但可通过继承的公有方法来访问。
    在这里插入图片描述

(2)子类不会继承父类的构造器,但是一定会调用父类的构造器

  • 默认:调用父类的无参构造,super()写或不写都会调用父类的无参构造,如果要写,必须在子类构造器首行;
  • 如果父类没有无参构造,必须在子类的构造器首行使用super(实参列表)显式调用父类的有参构造,否则编译报错;
    注意(☆☆☆):在创建子类对象时,一定会先为从父类继承的属性进行初始化,所以要调用父类的构造器

(3)Java只支持单继承,不允许多重继承,但是Java支持多层继承

  • 一个子类只能有一个父类:只有唯一的亲生父亲
  • 一个父类可以派生出多个子类:子孙满堂
  • Java支持多层继承,代代相传
class SubDemo extends Demo{ }   //ok
class SubDemo extends Demo1,Demo2...//error

在这里插入图片描述

4、方法的重写

 方法的重写(Override):当父类中的方法对于子类来说不适用的时,子类可以对父类中的方法进行重写/覆写。

方法重写的 要求:两同两小一大

  • 方法名:必须完全一致
  • 形参列表:必须完全一致
  • 返回值类型:
    如果是基本数据类型和void,必须完全一致
    如果是引用数据类型,必须是<=,即重写的方法的返回值类型<=被重写方法的返回值类型,
  • 修饰符:重写的方法的修饰符范围>=被重写方法的修饰符范围(public>protected>缺省>private)
  • 抛出的异常:异常类型<=

重写的方法不能是static的、final的、子类不可见的(private)

重载(Overload)与重写(Override)什么区别
(1)重载是在同一个类中,重写是子类与父类中
(2)重载与重写都要求方法的名称完全一致
(3)重载要求参数列表必须不同,重写要求参数列表必须相同
(4)重载和返回值类型无关,重写有很严格的要求
在这里插入图片描述

继承案例

public class _08_继承 {
    public static void main(String[] args) {
        Father f = new Father();
        Son1 s = new Son1();
        System.out.println(f.getInfo());   // atguigu
        System.out.println(s.getInfo());   // atguigu
        s.test(); // atguigu  atguigu
        System.out.println("-----------------");
        System.out.println(f.info);   // atguigu
        System.out.println(s.info);   // 尚硅谷
        s.setInfo("大硅谷");   // s对象中 super.Info变为大硅谷
        System.out.println(f.info);   // atguigu
        System.out.println(s.info);   // 尚硅谷
        System.out.println(f.getInfo());  // atguigu
        System.out.println(s.getInfo());  // 大硅谷
        s.test();   // 大硅谷  大硅谷
        s.test2();  // 尚硅谷  大硅
    }
}

class Father {
    public String info = "atguigu";

    public void setInfo(String info) {
        this.info = info;
    }

    public String getInfo() {
        return info;
    }
}

class Son1 extends Father {
    public String info = "尚硅谷";

    public void test() {
        System.out.println(this.getInfo());
        System.out.println(super.getInfo());
    }
    public void test2(){
        System.out.println(this.info);
        System.out.println(super.info);
    }
}

图解:

在这里插入图片描述
和父类同名属性,子类中会保留两个,一个是this.info 一个是super.info
由于子类没有重写getInfo和setInfo 因此子类调用的都是super.getInfo() 和 super.setInfo()
这两个方法都指向子类中的super.info

super关键字

super:父类的

用法:
1. super.属性
如果子类有与父类同名的属性时,可以用super.属性明确表示是父类的属性。
2. super.方法
如果子类重写了父类的方法时,可以用super.方法明确调用父类被重写的方法
3. super()或super(实参列表)
super()显式调用父类的无参构造
super(实参列表)显示调用父类的有参构造

注意:
(1)通过super引用属性、方法、构造器时,都要求该成员是可见的,即该成员的修饰符不能是private的,跨包的话还不能是缺省的。
(2)super的追溯不仅限于直接父类
(3)如果某个属性或方法前面使用“this.”,那么先从本类中查找,如果未找到,会沿着父类查找
如果某个属性或方法前面使用“super.”,那么先从直接父类中查找,如果未找到,会沿着继承关系往上找
如果某个属性或方法前面既没有“this.”,也没有“super.”,遵循就近原则,开始找
在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值