“手撕“三大特性之一的<继承>(上)

news/2024/9/25 21:22:48/

目录

一、为什么需要继承

二、什么是继承

三、继承怎么写

四、成员的访问

1.父类与子类的成员变量不同名

2.父类与子类的成员变量同名 

3.父类与子类的成员方法不同名

4.父类与子类的成员方法同名 

五、super关键字


一、为什么需要继承

先让我们看一段Java代码:

java">// Dog.java
public class Dog{string name;int age;float weight;public void eat(){System.out.println(name + "正在吃饭");
}
public void sleep(){System.out.println(name + "正在睡觉");
}
void Bark(){System.out.println(name + "汪汪汪~~~");
}
}// Cat.Java
public class Cat{string name;int age;float weight;public void eat(){System.out.println(name + "正在吃饭");
}public void sleep()
{System.out.println(name + "正在睡觉");
}
void mew(){System.out.println(name + "喵喵喵~~~");
}
}

我们会发现有大量的代码是相同的。比如:名字年龄体重啊,吃饭睡觉啊。所以我们思考,有没有一种更加简便的写法,把大家都有的东西抽取出来,可以实现代码的复用(就是大家都可以用)减少了程序员的工作量。  

有,那就是继承

二、什么是继承

 

把公共的东西抽取出来,让对象去获得公共的东西(名字年龄吃饭等等)就叫做继承。对于抽取出来的东西做成一个类,我们叫做父类,对于自己额外有的东西(比如:狗狗的汪汪汪,猫猫的喵喵喵)做成一个类,我们叫做子类。 有什么好处呢?就是可以实现代码的复用,提高工作效率。

三、继承怎么写

继承的关键字是extend。具体如下:

 修饰符 class 子类 extends 父类 {

        // ...

}

所以对于上面狗狗和猫猫可以怎么继承呢?代码如下: 

java">// Animal.java
public class Animal{String name;int age;public void eat(){System.out.println(name + "正在吃饭");
}
public void sleep(){System.out.println(name + "正在睡觉");
}
}
// Dog.java
public class Dog extends Animal{
void bark(){System.out.println(name + "汪汪汪~~~");
}
}
// Cat.Java
public class Cat extends Animal{
void mew(){System.out.println(name + "喵喵喵~~~");
}
}
// TestExtend.java
public class TestExtend {
public static void main(String[] args) {Dog dog = new Dog();
// dog类中并没有定义任何成员变量,name和age属性肯定是从父类Animal中继承下来的System.out.println(dog.name);System.out.println(dog.age);
// dog访问的eat()和sleep()方法也是从Animal中继承下来的dog.eat();dog.sleep();dog.bark();
}
}

1.子类会将父类的东西全部继承下来(也可以说copy下来了)。

2.子类需要有自己额外的共性(比如汪汪汪),不然就没必要继承了。 

四、成员的访问

1.父类与子类的成员变量不同名

java">public class Base {int a;int b;
}
public class Derived extends Base{int c;
public void method(){a = 10; // 访问从父类中继承下来的ab = 20; // 访问从父类中继承下来的bc = 30; // 访问子类自己的c
}
}

2.父类与子类的成员变量同名 

java">public class Base {int a;int b;int c;
}
/
public class Derived extends Base{int a; // 与父类中成员a同名,且类型相同char b; // 与父类中成员b同名,但类型不同
public void method(){a = 100; // 访问子类新增的ab = 101; // 访问子类新增的bc = 102; // 子类没有c,访问的肯定是从父类继承下来的c// d = 103; // 编译失败,因为父类和子类都没有定义成员变量b
}
}

 所以我们可以发现规律:

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

3.父类与子类的成员方法不同名

java">public class Base {
public void methodA(){System.out.println("Base中的methodA()");
}
}
public class Derived extends Base{
public void methodB(){System.out.println("Derived中的methodB()方法");
}
public void methodC(){methodB(); // 访问子类自己的methodB()methodA(); // 访问父类继承的methodA()// methodD(); // 编译失败,在整个继承体系中没有发现方法methodD()
}
}

4.父类与子类的成员方法同名 

java">public class Base {
public void methodA(){System.out.println("Base中的methodA()");
}
public void methodB(){System.out.println("Base中的methodB()");
}
}
public class Derived extends Base{
public void methodA(int a) {System.out.println("Derived中的method(int)方法");
}
public void methodB(){System.out.println("Derived中的methodB()方法");
}
public void methodC(){methodA(); // 没有传参,访问父类中的methodA()methodA(20); // 传递int参数,访问子类中的methodA(int)methodB(); // 直接访问,则永远访问到的都是子类中的methodB(),基类的无法访问到
}
}

我们依旧可以发现规律(与成员变量相同):

就近原则,不管怎么样,优先访问自己新增的,如果没有,就访问父类继承下来的,如果父类也没有,则报错! 

五、super关键字

既然假设子类有的话,就不会访问到父类。那我就想访问父类怎么办?这时候super关键字就孕育而生了。super的作用就是用来在子类的方法中访问父类的东西。 

java">public class Base {int a;int b;
public void methodA(){System.out.println("Base中的methodA()");
}
public void methodB(){System.out.println("Base中的methodB()");
}
}
public class Derived extends Base{int a; // 与父类中成员变量同名且类型相同char b; // 与父类中成员变量同名但类型不同
// 与父类中methodA()构成重载
public void methodA(int a) {System.out.println("Derived中的method()方法");
}
// 与基类中methodB()构成重写(即原型一致,重写后序详细介绍)
public void methodB(){System.out.println("Derived中的methodB()方法");
}
public void methodC(){
// 对于同名的成员变量,直接访问时,访问的都是子类的a = 100; // 等价于: this.a = 100;b = 101; // 等价于: this.b = 101;
// 注意:this是当前对象的引用
// 访问父类的成员变量时,需要借助super关键字
// super是获取到子类对象中从基类继承下来的部分super.a = 200;super.b = 201;
// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法methodA(); // 没有传参,访问父类中的methodA()methodA(20); // 传递int参数,访问子类中的methodA(int)
// 如果在子类中要访问重写的基类方法,则需要借助super关键字methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到super.methodB(); // 访问基类的methodB()
}
}

在子类方法中,如果想要明确访问父类中成员时,借助super关键字即可。

注意: super跟this一样,只能在非静态方法中使用。


http://www.ppmy.cn/news/1426658.html

相关文章

Spring AI ETL 流水线

先纠正 Spring AI 使用本地 Ollama Embeddings 中的一个错误,当启动 Ollama 之后,Windows会有托盘图标,此时已经启动了 Ollama 的服务,访问 Embedding 时不需要运行 ollama run gemma ,只有访问 chat 时才需要启动一个…

富文本插入图片的时候直接复制链接的风险点和解决方案

业务背景 最近由于项目需要开发了一个富文本的功能其中有一个小点是插入图片到富文本中, 插入的时候是可以直接复制图片的链接地址插入的我本来觉得没啥,但是感觉哪里不太对,于是开始了风险点评估,以及对应的解决方案 风险点评…

openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置

文章目录 openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置265.1安装openEuler操作系统265.2 修改操作系统内核PAGESIZE为64KB。265.3 关闭CPU中断的服务irqbalance openGauss学习笔记-265 openGauss性能调优-TPCC性能调优测试指导-操作系统配置 本…

Dual-AMN论文阅读

Boosting the Speed of Entity Alignment 10: Dual Attention Matching Network with Normalized Hard Sample Mining 将实体对齐速度提高 10 倍:具有归一化硬样本挖掘的双重注意力匹配网络 ABSTRACT 寻找多源知识图谱(KG)中的等效实体是知识图谱集成的关键步骤&…

共享软件工厂:软件行业的“滴滴打车”模式

在数字化浪潮席卷全球的背景下,软件行业正面临着前所未有的挑战与机遇。传统软件开发模式由于需求变化快、交付周期长、人才流动性大、迭代升级困难等问题,已经难以满足市场快速变化的需求。在这个关键的时刻,共享软件工厂应运而生&#xff0…

【C++】哈希封装map与set

目录 前言: 一,底层哈希结构 1-1,迭代器的封装 1-2,哈希表的封装 二,unordered_map的封装 三,unordered_set的封装 前言: 上一篇文章说明了哈希结构,这一篇文章来说明如何使用…

【JavaEE多线程】线程安全、锁机制及线程间通信

目录 线程安全线程安全问题的原因 synchronized 关键字-监视器锁monitor locksynchronized的特性互斥刷新内存可重入 synchronized使用范例 volatilevolatile能保证内存可见性volatile不保证原子性synchronized 也能保证内存可见性 wait 和 notifywait()方法notify()方法notify…

【c基础】文件操作

1.fopen和fclose函数 函数原型 FILE *fopen(const char *path, const char *mode); 参数解释: 返回值:fopen打开成功,则返回有效file的有效地址,失败返回NULL。path是文件路径,可以相对路径,可以绝对路径…