Java-继承与多态-上篇

关于类与对象,内容较多,我们分为两篇进行讲解:

📚 Java-继承与多态-上篇:------------ <就是本篇>

📕 继承的概念与使用

📕 父类成员访问

📕 super关键字

📕 super 与 this 的区别

📕 子类构造方法

📕 继承方式

📕 final 关键字

📚 Java-继承与多态-下篇:------------ <下篇很快,别急别急>

📕 ... ...

① 继承的概念

首先提到"继承",大家心里想到的是什么?大概和我初听"继承"时一样,也是想到了"父 与 子"。如果大家也有这样的想法,那我要告诉大家,这是对的~

📌 继承的定义:

++📕 继承是面向对象编程的重要概念, 它允许一个类(子类)继承另一个类(父类)的属性和方法。++

📚 ++那么我们思考一个问题:++

我们之前学习**"类与对象"** 的时候,经常使用"学生类"来进行举例 ,在我们仅仅使用"学生类"时,确实不会出现什么错误,也很少有代码的冗余但如果我们在定义"学生类"后,我们还想定义"小学生","初中生","高中生","大学生",又该怎么办呢?

在我们学习继承之前,那肯定就是对这四种年级的学生分别进行定义了:

但是 **"小学生","初中生","高中生","大学生"**都有++学号,成绩,年龄,名字++ 。而且也都会++吃饭,睡觉,学习++ 。++大部分的属性和行为都是重复的,而只有很少一部分内容是不重复的,这就会造成非常多的冗余代码:++

那么此时,我们就可以让 ++"小学生","初中生","高中生","大学生"++ 去"继承"我们的"学生类",从而做到代码的复用,而尽可能地减少代码的冗余~让我们继续往下看:

② 继承的使用

📚 ++继承的用法++:

📕 Java继承的用法是通过使用关键字 extends子类父类建立继承关系。

📕 子类会继承父类的属性和方法,并可以根据需要重写父类的方法或添加新的方法和属性。

java 复制代码
class 父类 {
    // 父类的属性和方法
}

class 子类 extends 父类 {
    // 子类的属性和方法
}
 

接下来我们看一看,如何使用继承的方法,去让 ++"小学生","初中生","高中生","大学生"++ 去"继承"我们的"学生类":

++使用图片的表述大概是这样的++:

📌 ++而具体应该如何用代码实现呢:++

这就是++"小学生","初中生","高中生","大学生"++ 去"继承学生类"的大体代码了~

③ 父类成员访问

++了解了继承的大体使用方法,接下来让我们对"继承"进行更深的一些了解:++

1.子类中访问父类的成员变量

📚 子类可以访问父类的++非私有成员变量++ (包括++公有++ 、++受保护++ 和++默认访问++权限的成员变量)。子类可以通过继承获得父类的成员变量,并且可以直接使用它们。

📌++而通过子类中访问父类的成员变量,分为两种情况:++

📕 子类和父类不存在同名成员变量:

这就证实了:子类可以通过继承获得父类的成员变量,并且可以直接使用它们。

📕 子类和父类存在同名成员变量:

📌 ++注意事项++:

📕 如果访问的成员变量++子类中有++ ,优先访问自己的成员变量

📕 如果访问的成员变量++子类中无++ ,则访问父类继承下来的如果父类也没有定义,则编译报错

📕 如果访问的++成员变量与父类中成员变量同名++ ,则优先访问自己的

2.子类中访问父类的成员方法

++而子类中访问父类成员方法,其实与访问成员变量也是大同小异:++

📚 子类可以通过继承来访问父类的成员方法。子类可以直接调用父类的非私有方法,并且可以在子类中进行重写。

📌 ++通过子类中访问父类的成员方法,分为两种情况:++

📕 成员方法名字不同

📕 成员方法名字相同

📌++注意事项++:

📕 通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问

📕 否则在父类中找,找到则访问,否则编译报错。

📕 如果父类和子类同名方法的参数列表不同(重载),根据调用 方法适传递的参数选择合适的方法访问,如果没有则报错

④ super关键字

++super关键字的主要作用:++

📕 用于表示父类的引用:它可以用于调用父类的构造方法、访问父类的成员变量和方法。

++super++ 调用父类的构造方法:

++super++ 访问父类的成员变量和方法:

📌 ++注意事项++:

📕 只能在非静态方法中使用:

📕 在子类方法中,访问父类的成员变量和方法

⑤ 子类构造方法

和"继承"这个词一样,"父类"与"子类"也有同样的关系,那就是:++先有父类,后有子类++。

所以在子类对象构造时,会先调用子类构造方法,然后执行子类的构造方法。

📚 子类的构造方法可以通过使用super()关键字来调用父类的构造方法,以初始化从父类继承的成员变量。

📌 ++子类的构造方法可以有以下几种使用情况:++

📕 子类调用父类的无参构造方法

📕 子类调用父类的有参构造方法

📌++那么父类与子类的构造方法都有什么关联呢++?

📕当我们定义无参构造方法时,子类构造方法第一行会有隐藏起来的一个super()调用

我们可以看到子类构造方法中并无super(),但仍不报错~这就证明了子类构造方法第一行会有隐藏起来的一个super()调用。

📕当我们定义有参构造方法时,我们需要重新手动写一下子类构造方法中的super()

我们可以看到,此时代码是报错的,所以我们需要重新写一个对应的super():

这样就ok了~

📕 子类构造方法中调用父类构造方法时,super()必须在开头位置:

📕 在同时调用父类和子类方法时,同一类型情况下父类优先级大于子类:

我们可以看到,先打印了"父类...",后打印了"子类..."。

既然我们在"类和对象"的学习中我们学习到了代码块,那我们也用用代码块:

📕 然后我们可以看一个小例题:(记得回忆一下上篇文章中,我们讲到的代码块优先级哦~)

java 复制代码
import java.util.*;
class Animal {
    public String name;
    static
    {
        System.out.println("父类静态代码块");
    }
    {
        System.out.println("父类实例代码块");
    }
    public Animal() {
        System.out.println("父类构造方法");
    }
}
class Dog extends Animal {
    static
    {
        System.out.println("子类静态代码块");
    }
    {
        System.out.println("子类实例代码块");
    }
    public Dog() {
        System.out.println("子类构造方法");
    }
}
public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog();
    }
}

运行后的结果是:

📌 ++知识归纳++:

📕 父类的静态代码块优先级高于子类的静态代码块

📕 父类的实例代码块与构造代码块先后接连执行

📕 子类的实例代码块与构造代码块先后接连执行

⑥ super 和 this 的区别

上述内容观看完毕后,我们也算是把 super 和 this 关键字都学习到了,那么两者看似极为的相似,但却也有许多的不同之处:

  • this关键字用于引用当前对象的成员,而super关键字用于引用父类对象的成员。
  • this在实例方法和构造方法中使用,而super主要在子类中使用。
  • this可以引用当前对象的成员变量和方法,super可以引用父类的成员变量和方法。
  • this可以用于在构造方法中调用其他构造方法,super可以用于在子类构造方法中调用父类构造方法。
  • this和super不能同时使用,因为它们都是用来引用对象的关键字。

相同点:

  • 都是 Java 的关键字
  • 都只能在非静态方法中使用
  • 在构造方法中使用时,都只能在第一行,且不能同时存在

不同点:

  • this是当前对象的引用,而super关键字用于引用父类对象
  • 在非静态成员方法中,this用来访问本类的方法和属性,super用来访问父类继承下来的方法和属性
  • 在构造方法中:this(...)用于调用本类构造方法,super(...)用于调用父类构造方法,两种调用不能同时在构造 方法中出现
  • 构造方法中一定会存在super(...)的调用,用户没有写编译器也会增加,但是this(...)用户不写则没有

⑦ 继承方式

Java中不支持多继承,就像一个"儿子"不能有两个"爹"~

但Java虽然不支持多继承,但就不代表它不能"多个继承"了,为了弥补这个缺陷,Java支持了"多层继承":

而Java同样也支持"单继承"和"不同类继承同一类",而这两种情况在之前我们多次举"学生类"的例子时就都接触过了,这里也就不浪费大家的时间啦

⑧ final 关键字

final 是一个关键字,用于修饰类、方法和变量,具有不同的作用和效果。

📚 final 修饰变量:

📕 当使用 final 修饰一个变量时,该变量被称为常量它的值不能被改变:

📕 对于基本类型的变量,一旦被赋值后就不能再被修改。

📕 对于引用类型的变量,一旦被赋值后,不能再指向其他对象,但对象本身是可以被修改的:

输出结果:

📚 final 修饰成员方法:

📕 当使用****final 修饰一个方法时,该方法不能被子类覆盖(即不能被重写):

📕 使得某个方法的实现是不可改变的,提高了安全性和稳定性。

📚 final 修饰类:

📕 当使用 final修饰一个类时,该类不能被继承,即不能有子类:

那么这篇关于(继承与多态-上篇)的知识,就暂时为大家分享到这里啦,作者能力有限,如果有哪里说的不够清楚或者不够简洁,还请大家在评论区多多指出,那么我们下期再见啦~

相关推荐
芒果披萨2 分钟前
El表达式和JSTL
java·el
q567315233 分钟前
在 Bash 中获取 Python 模块变量列
开发语言·python·bash
吕彬-前端18 分钟前
使用vite+react+ts+Ant Design开发后台管理项目(五)
前端·javascript·react.js
学前端的小朱21 分钟前
Redux的简介及其在React中的应用
前端·javascript·react.js·redux·store
许野平28 分钟前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
guai_guai_guai30 分钟前
uniapp
前端·javascript·vue.js·uni-app
也无晴也无风雨31 分钟前
在JS中, 0 == [0] 吗
开发语言·javascript
狂奔solar39 分钟前
yelp数据集上识别潜在的热门商家
开发语言·python
duration~43 分钟前
Maven随笔
java·maven
zmgst1 小时前
canal1.1.7使用canal-adapter进行mysql同步数据
java·数据库·mysql