【Java】的面向对象笔记(中)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

继承性

哲学三问

什么是继承性

银行卡有很多种有借记卡、信用卡、亲情卡、工资卡等等他们各有不同但都具有相同的银行卡特征即余额、卡号等共有的属性如果每定义一个类都需要写一次那就太麻烦了。有没有什么办法抽取出相同特征呢

利用继承性我们可以在银行卡类中定义共同特征然后将单独的特征再定义。

在Java 中继承的关键字用的是“extends”即子类不是父类的子集而是对父类的“扩展”

为什么需要继承性优点

  1. 减少代码冗余提高代码复用性

  2. 便于功能拓展

    如果现在所有的银行卡都需要添加实名登记功能那么我们就可以在父类中直接写通过继承其他子类自然可以获得这个功能不必每个都写一遍。

  3. 为多态性提供了基础

怎么使用

extends关键字

class A extends B{}

  • A: 子类、派生类、subclass

  • B: 父类、超类、基类、superclass

例如现在要让Student类继承Person类

public class Student extends Person{}

调用时可以直接当作自己的来用

Student stu = new Student("Math");
stu.setName("yuan");
stu.setAge(18);
System.out.println("student " + stu.getName() + " is " + stu.getAge() + " years old, and his/her major is " + stu.getMajor() + ".");

此时此刻我想起一句歌词。哦~~爸爸妈妈给我的不少不多~~~~

一旦子类A继承父类B以后子类A中就获取了父类B中声明的所有的属性和方法。不过如果是父类中的private私有属性和方法呢

私有属性、方法继承

一般地我们可以浅显地理解为继承了。但是不能直接使用必须通过共有方法来操作。私有方法也是必须通过共有方法来进行调用。

继承规则

但是这只是表象如果你深入理解会发现完全不是这样并且这个理解在逻辑上有漏洞既然继承了这个属性和方法就应该能够在自己的类中进行调用你父类的私有属性和方法自己都可以调用为什么我子类的私有方法就不行天生低人一等现在这个情况即使使用封装性来解释也是差强人意。

来看官方的解释

Private Members in a Superclass

A subclass does not inherit the private members of its parent class. However, if the superclass has public or protected methods for accessing its private fields, these can also be used by the subclass.

A nested class has access to all the private members of its enclosing class—both fields and methods. Therefore, a public or protected nested class inherited by a subclass has indirect access to all of the private members of the superclass.

翻译一下第二句话涉及内部类如果没接触过可以先忽略

父类中的私有成员

子类不会继承父类的private私有成员。然而如果父类有publicprotected 方法能够访问它的私有属性那这些属性就可以被子类使用。

内部类可以访问其外部类的所有私有成员包括属性和方法。因此由子类继承的publicprotected 的内部类可以间接访问父类的所有私有成员。

分析内存后会发现当一个子类被实例化的时候默认会先调用父类的构造方法对父类进行初始化即在内存中创建一个父类对象然后再父类对象的外部放上子类独有的属性两者合起来成为一个子类的对象。

说人话就是

实际上并没有被继承但是子类在创建时会附带着创建父类对象因此父类对象中的private属性虽然对我来说不可见但是我拥有你的公共方法通过我的公共方法可以来对你进行操作。

为什么要这样做呢

这样的设计的意义就是我们可以用这个方法将我们的成员保护得更好让子类的设计者也只能通过父类指定的方法修改父类的私有成员这样将能把类保护得更好这对一个完整的继承体系是尤为可贵的。

关于继承性的规定

  1. 一个类可以被多个子类继承。
  2. Java中类的单继承性一个类只能有一个父类
  3. 子父类是相对的概念。
  4. 子类直接继承的父类称为直接父类。间接继承的父类称为间接父类
  5. 子类继承父类以后就获取了直接父类以及所有间接父类中声明的属性和方法

多层继承image-20230115150903755

所有类的父类Object

  1. 如果我们没有显式的声明一个类的父类的话则此类继承于java.lang.Object

  2. 所有的java类除java.lang.Object类之外都直接或间接的继承于java.lang.Object

  3. 意味着所有的java类具有java.lang.Object类声明的功能。

Object

本文参考

子类到底能不能继承父类的私有属性

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java