Java面向对象之继承

一、什么是继承

java中提供一个关键字extends,用这个关键字我们可以让一个类和另一个类建立起联系。

public class Student extends Person{}

student称之为子类(派生类),Person称之为父类(基类或超类)。

继承有哪些好处?

继承可以把多个子类中重复的代码抽取到父类中,提高代码的复用性。

换而言之,子类可以在父类的基础上,增加其他的功能,使子类变得更加丰富。

二、什么时候时候继承

类于类之间存在相同的内容。并且满足子类是父类的一种。就可以使用继承来优化代码。

请注意,使用继承必须同时满足这两个条件。

举个例子:

人类(父亲) 学生 老师(子类)

学生和老师都有吃饭,喝水相同行为。学生和老师都是人类。因此可以抽取到(人类)父类中

举个错误的示范:

人类(父亲) 程序员 苹果手机(子类)

程序员和苹果手机虽然都有姓名和重量这两个相同的属性。但是苹果是商品,不满足人类的一种。因此不可以产生继承关系。

三、继承的特点

java和c++不相同。Java中只支持单继承,不支持多继承,但支持多层继承。

A->B->C->D->E 此种关系中,D是E的直接父类,ABC是E的间接父类。

在java中,A并不是真正的祖宗,虚拟机还会将其自动继承给object(隐藏操作)。

Java中所有的类都直接或者间接继承与object类。

四、如何设计继承

画图法:

将所有的元素在一排画好,提取他们的相同属性或者行为,构造父类,重复以上操作。

注意:所构造的父类必须满足子类是父类的一种。代码从父类开始写。

六、子类到底可以继承父类的哪些东西

构造方法访问特点

构造方法 非私有 不能      私有不能

1、子类不可以父类的构造方法,但是可以通过super调用。

2、子类构造方法的第一行,有一个默认的super();由虚拟机自动添加,目的是通过父类空参构造初始化成员变量

3、默认先访问父类无参的构造方法,再执行自己的。

4、想要使用父类有参构造,必须自己手动数=书写super(name,age);

成员变量访问特点

就近原则,先从局部位置找,再从本类成员位置找,父类成员位置找,逐级向上。

sout(name)从局部位置开始找name

sout(this.name)从成员位置开始找name

sout(super.name)从父类位置开始找name

逐级往上找,this,super控制了寻找的开始位置。

成员变量 非私有能    私有能

虽然成员变量都可以被继承,但是私有的成员变量无法被调用,只能通过set/get方法调用。

成员方法访问特点

直接调用满足就近原则:谁离我近,我就用谁。

简介调用,super关键字直接访问父类。

成员方法 非私有能    私有不能

成员方法的继承实际上是借用一种虚方法表的方式进行,即非private,非static,非final关键字修饰的方法。每一个子类都会继承父类的虚方法表并加入自己的虚方法,这样设计的方法是为了加速查找的速度。

子类方法和父类方法有时需要设置一样的方法,但方法内部所表达的东西不同,我们会用一种方法名为方法的重写来操作。

七、方法的重写

何时使用

父类的行为不能满足子类的需求

1、重写时方法的名称和形参必须要和父类中的一致。

2、子类重写父类时,子类访问权限必须大于父类(空着不写<protected<public)。

3、子类重写时,返回值的数据类型必须小于父类。

4、建议:重写的方法尽量和父类保持一致。

7、子类重写需要在方法前加上@Override

8、只有加入到虚方法表里面的方法才可以被重写

八、总结

1、继承中成员方法的访问特点

this:就近原则

super:直接找父类

2、什么是方法重写

在继承体系中,子类和父类出现了一摸一样的方法声明,我们就称子类的这个方法是重写的方法。

3、方法重写为什么要加@override

因为可阅读性好,并且可以自动检测重写是否正确。

4、重写有哪些基本要求

1、重写的方法要求基本和父类保持一致

2、只有虚方法表里的方法才可以被重写

5、重写的本质是什么

子类的方法覆盖虚方法表中继承于父类的方法。

九、补充:this和super总结

this:可以理解为一个变量,表示当前方法调用者的地址值。

super:代表父类存储空间

this   this.成员变量                        this.成员方法(...)                        this(...)

         访问本类成员变量                访问本类成员方法(...)                 访问本类其他构造方法

        (没有局部变量与成员               (可省略)                            主要用来有要求的初始化赋值)

             变量重名省略不写)

空参构造时,用this调用实参构造,来初始化成员变量。



public class student{
    
    String name;
    int age;
    String school;

    public Student(){
        this(null,0,"北京大学");
    }

    public Student(String name, int age,String school){

    this.name=name;
    this.age=age;
    this.school=school;
    }
}

super         super.成员变量               super.成员方法(...)                super(...)

          访问父类成员变量                   访问父类成员方法                访问父类构造方法

                                                                                                          (空参,或者实参调用)

                                                                                                                

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值