[ java基础 ] 继承: 方法重写.抽象方法.super/this关键字

多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类中无需再定义这些属性
和行为,只需要和抽取出来的类构成某种关系。如图所示:

image-20211227213559046

其中,多个类可以称为子类,也叫派生类;多个类抽取出来的这个类称为父类、超类(superclass)或
者基类。

继承:

就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。

好处

提高代码的复用性。
提高代码的扩展性。
类与类之间产生了关系,是学习多态的前提。

格式:class 子类类名 extends 父类类名

注意:

a只支持单继承,不支持多继承,但支持多层继承
b一个子类只能拥有一个直接父类,而一个父类可以拥有多个直接子类c继承关系中成员的特点:

  • 私有成员(包括私有成员变量和成员方法)
  • 静态成员(包括私有静态成员变量和成员方法)
  • 实例变量
  • 实例方法
  • 构造器

继承的特点一:成员变量

私有化(private)

父类中的成员,无论是公有(public)还是私有(private),均会被子类继承。(可用debug观测)
子类虽会继承父类私有(private)的成员,但子类不能对继承的私有成员直接进行访问,可通过继承的公有方法(set,get)进行访问。

继承的特点二:成员方法

方法重写(成员方法) :

重写:子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
重载:方法的名称一样,参数列表【不一样】。
方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。

注意事项

  1. 必须保证父子类之间方法的名称相同,参数列表也相同。
    @Override:写在方法前面,用来检测是不是有效的正确覆盖重写。
    这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。

  2. 子类方法的返回值类型必须【小于等于】父类方法的返回值类型(小于其实就是是它的子类)。
    小扩展提示:java.lang.Object类是所有类的公共最高父类(祖宗类),java.lang.String就是
    Object的子类。

  3. 子类方法的权限必须【大于等于】父类方法的权限修饰符。
    小扩展提示:public > protected > 缺省 > private
    备注:缺省不是汉字缺省,而是什么都不写,留空。

  • 父类的私有方法不可以被重写
  • 不同包的父类的缺省方法不可以被重写

总结:在父子类的继承关系当中,创建子类对象,访问成员方法的规则:创建的对象是谁,就优先用谁,如果没有则向上找。
注意事项:无论是成员方法还是成员变量,如果没有都是向上找父类,绝对不会向下找子类的。
重写(Override)
概念:在继承关系当中,方法的名称一样,参数列表也一样。
重写(Override):方法的名称一样,参数列表【也一样】。覆盖、覆写。
重载(Overload):方法的名称一样,参数列表【不一样】。
方法的覆盖重写特点:创建的是子类对象,则优先用子类方法。

继承的特点三:构造方法

  1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
  2. 构造方法的作用是初始化对象并给对象的成员变量进行初始化。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用

super和this

父类空间优先于子类对象产生

在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对
应的父类空间,便可以包含其父类的成员,如果父类成员非private修饰,则子类可以随意使用父类成
员。代码体现在子类的构造方法调用时,一定先调用父类的构造方法。理解图解如下:

image-20211227214733782

super和this的含义
super :代表父类的存储空间标识(可以理解为父亲的引用)。
this :代表当前对象的引用(谁调用就代表谁)。

super关键字的用法有三种:
在子类的实例方法中,访问父类的成员变量。
在子类的实例方法中,访问父类的成员方法。
在子类的构造方法中,访问父类的构造方法。

this关键字的用法有三种:
在本类的实例方法中,访问本类的成员变量。
在本类的实例方法中,访问本类的另一个成员方法。
在本类的构造方法中,访问本类的另一个构造方法。

在第三种用法当中要注意:
A. this(…)调用也必须是构造方法的第一个语句,唯一一个。
B. super和this两种构造调用,不能同时使用。

访问构造方法

this(…) – 本类的构造方法
super(…) – 父类的构造方法

子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认
的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

Object类

所有的类都隐式继承Object类(隐式继承Object类不占用单继承唯一的一次机会)

toString方法

public String toString() :返回该对象的字符串表示。

toString方法返回该对象的字符串表示,其实该字符串内容就是对象的类型+@+内存地址值。
由于toString方法返回的结果是内存地址,而在开发中,经常需要按照对象的属性得到相应的字符串表现形式,因此也需要重写它。

toString()注意事项:

  • 在Java中,打印所有的对象名和数组名时,其实就是在隐式调用它们toString(),char[]除外

getClass

获取对象的数据类型

System.out.println(sc.getClass());

equals方法

== 和 equals()的区别(面试题):

  • 1.==可以比较基本数据类型,也可以比较引用数据类型
    如果比较基本数据类型,比较的是数据值
    如果比较引用数据类型,比较的是地址值
  • 2.equals()只能比较引用数据类型
    比较引用数据类型的地址值
    如果equals()是重写Object类equals(),需要按照重写后的规则进行比较

封装补充

private:在同一个类中,不包含内部类

缺省:在同一个包中有效

protected : 在同一个项目(模块),子类(不同包的子类也可以访问)

public:在同一个项目(模块),但不同包有效

抽象类

使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。

继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子
类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。

此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法

注意事项

  1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。
    理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意
    义。
  2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。
    理解:子类的构造方法中,有默认的super(),需要访问父类构造方法。
  3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
    理解:未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊
    的类结构设计。
  4. 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。
    理解:假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的
    方法,没有意义。
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值