【JavaSE】继承

news2024/11/23 15:12:56

文章目录

  • 1. 如何继承
  • 2. 子类如何访问父类的成员
    • 2.1 子类中访问父类的成员变量
    • 2.2 子类中访问父类的成员方法
  • 3. super关键字
  • 4. 如何写构造方法

前言:为方便讲解一个java文件写多个类。

1. 如何继承


class Cat {
    public String name;
    public int age;
    public String sex;  //性别
    public void sleep() {
        System.out.println(this.name + "正在睡觉");
    }
    public void mew() {
        System.out.println(this.name + ":喵喵喵");
    }
}
class Dog {
    public String name;
    public int age;
    public String sex;  //性别
    public void sleep() {
        System.out.println(this.name + "正在睡觉");
    }
    public void bark() {
        System.out.println(this.name + ":汪汪汪");
    }
}

我们可以看到以上类中,狗类和猫类都有姓名、年龄、性别,同时都会有睡觉的动作。这时我们就可以把这些共性抽出来放到创建的父类中进行继承。

class Animal {
    public String name;
    public int age;
    public String sex;  //性别
    public void sleep() {
        System.out.println(this.name + "正在睡觉");
    }
}
//继承用到关键字extends表示Cat继承Animal
class Cat extends Animal{
    public void mew() {
        System.out.println(this.name + ":喵喵喵");
    }
}
class Dog extends Animal{
    public void bark() {
        System.out.println(this.name + ":汪汪汪");
    }
}

这时 Cat 和 Dog 类继承了 Animal 类,可以使用 Animal 中的变量和方法。

public class Test {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.name = "凉凉";
        cat.age = 3;
        cat.sex = "公";
        cat.sleep();
    }
}

这时用谁的对象进行访问 name、age等变量和方法就属于那个对象的,像上面猫访问name,name就属于猫的。

通过上面可以看出,继承就是抽出共性,达到代码的复用

注意:

  1. 子类会将父类中的成员变量或者成员方法继承到子类中了
  2. 子类继承父类之后,建议要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。
    如上面的猫和狗,都有自己特有的成员方法,猫会喵喵叫,狗会汪汪叫。
  3. 这时 Cat 和 Dog 可以叫做子类派生类,Animal 可以叫 父类、基类或超类

2. 子类如何访问父类的成员

那么我们子类该如何访问父类中的成员变量和成员方法呢?


2.1 子类中访问父类的成员变量


1. 子类和父类不存在同名成员变量

class Base {
    public int data1 = 10;
    public int data2 =20;

}
class Derived extends Base {
    public int data3 = 30;
    public int data4 = 40;
    public void method() {
        System.out.println(data1);
        System.out.println(data2);
        System.out.println(data3);
    }
}

public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

在这里插入图片描述此时 derived 对象的内存情况为:

在这里插入图片描述

2. 子类和父类存在同名成员变量

class Base {
    public int data1 = 10;
    public int data2 =20;

}
class Derived extends Base {
    public int data1 = 30;
    public int data4 = 40;
    public void method() {
        System.out.println(data1);//优先访问自己的成员变量
        System.out.println(data2);
    }
}

public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}

在这里插入图片描述当子类和父类有同名成员变量时,应优先访问自己的成员变量。

那我们该如何在子类访问父类的同名成员变量呢
使用 super 关键字。

在这里插入图片描述在这里插入图片描述
当然这时也可以使用 this 引用 data2 因为子类继承了父类此时 data2 也属于子类的成员变量

在这里插入图片描述

总结:

在子类方法中 或者 通过子类对象访问父类成员变量时:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
  • 如果访问的成员变量与父类中成员变量同名,则优先访问自己的,即:子类将父类同名成员隐藏了。
  • 成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

3. 父类中成员被 private 修饰时。

当父类中的成员变量被 private 修饰时,需要提供get 或 set 来对此成员变量进行操作,此时 data1 是被继承下来了,不过只能通过 get 或 set 进行访问。

class Base {
    private int data1 = 10;

    public int getData1() {
        return data1;
    }

    public void setData1(int data1) {
        this.data1 = data1;
    }
}
class Derived extends Base {
    public int data1 = 100;
    
    public void test() {
        System.out.println(this.getData1());
    }
}

2.2 子类中访问父类的成员方法

1. 子类和父类不存在同名成员方法

class Base {
    public void method1() {
        System.out.println("父类的方法");
    }
}
class Derived extends Base {
    public void method2() {
        System.out.println("子类的方法");
    }
    public void test() {
        method1();
        method2();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.test();
    }
}

在这里插入图片描述
这里和访问成员变量是一样的方法,就不再说了。


1. 子类和父类存在同名成员方法

class Base {
    public void method1() {
        System.out.println("父类的方法");
    }
}
class Derived extends Base {
    public String name;

    public void method1(String name) {
        System.out.println("子类的方法");
    }
    public void test() {
        method1("张三");
        method1();
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.test();
    }
}

在这里插入图片描述
这里的两个 method 方法构成了重载。

当两个不同类中有相同的方法名,如果它们之间是继承关系那么这两个方法构成重载。


3. super关键字

主要作用:在子类中访问父类的成员变量和成员方法。

super 主要用法:

  • super.成员变量 访问父类的成员变量
  • super.成员变量 访问父类的成员方法
  • super() 访问父类构造方法

在子类中,如果想要明确访问父类成员,则用 super 引用。

class Base {
    public int data1 = 10;
    public void method1() {
        System.out.println("父类的方法");
    }
}
class Derived extends Base {
    public int data1 = 100;
    public void test() {
        super.method1();//访问父类的成员方法
        System.out.println(super.data1);//访问父类的成员变量
        System.out.println(this.data1);
    }
}
public class Test2 {
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.test();
    }
}

在这里插入图片描述

注意:super 关键字不能在静态的方法中使用


4. 如何写构造方法

当我们给父类写构造方法时,子类报错了。
在这里插入图片描述那么我们该如何写呢

当子类写构造方法时,必须先帮父类进行构造。

class Animal {
    public String name;
    public int age;
    public String sex;
    public void sleep() {
        System.out.println(this.name + "正在睡觉");
    }
    public Animal(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
class Dog extends Animal {
    public String hire;
    public void bark() {
        System.out.println(this.name + ":汪汪汪");
    }
    //先帮父类构造方法,在构造子类方法
    public Dog(String name, int age, String hire) {
        super(name, age);//必须写在第一行
        this.hire = hire;
    }

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", hire='" + hire + '\'' +
                '}';
    }
}
public class Test1 {
    public static void main(String[] args) {
        Dog dog = new Dog("小黄", 3,"黄色");
        System.out.println(dog);
    }
}

在这里插入图片描述

当父类中没写构造方法时,编译器默认帮我们提供一个不带参数的构造方法,当我们在父类中写了带参数的构造方法后,编译器就不会帮我们提供了。

也可以这样写,即父类中没写带参数的构造方法编译器会默认提供一个不带参数的构造方法,子类构造方法中,没在第一行写super()时,编译器会帮我们在第一行加上,相当于 super() 隐藏了。当然也可以自己在第一行写上 super()
在这里插入图片描述

最后想要使一个类不想被继承,可以在类前加 final 关键字
在这里插入图片描述
可以看到,被 final 修饰 Animal 不能被继承了

好的,到这里本章节就结束了,如发现有错误,请各位大佬及时指出

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++基础篇(一篇文章带你进入c++的新手村)

前沿: c作为目前比较的流行的语言之一,在就业上也是运用比较广泛的语言之一,并且经过这么多年的历练久经不衰,所以说选择学c是一个不错的选择^_^,前面看到一个段子,如何在21天精通c,我动态里有这…

git 记录

git 工作区介绍 workspace:工作区,就是平时存放项目代码的地方。Index/Stage:暂存区,用于临时存放你的改动,事实上只是一个文件,保存即将提交到文件列表信息。Repository:仓库区(或版…

单机hbase-2.4.15配置snappy压缩

单机hbase配置snappy压缩 前言 1. 过程比较坎坷,网上帖子说法不一,以下过程是参考几个帖子亲自走过一遍,并最终可以成功建表。2. 本人安装的所有目录均为/data/test-hbase,涉及目录的替换为自己的目录即可。参考连接 https://bl…

【黑马程序员】Redis 课程 P37 的练习_三种方式实现功能_【黑马点评项目】给店铺类型查询业务添加缓存

本博客内容对应的视频为:https://www.bilibili.com/video/av766995956/?p37补充介绍:【黑马点评项目】是黑马官方于 2022-02-28 在 BiliBili 发表的学习视频教程的练手项目 1.简介 练习:给店铺类型查询业务添加缓存 店铺类型在首页和其它多…

栈和队列(顺序表、单链表形式)

栈和队列栈栈.顺序表结构体的设计栈的初始化栈的销毁入栈出栈获取栈顶数据判断栈空栈中有效元素的个数Stack.hStack.ctest.c栈.单链表结构体设计栈的初始化栈的销毁入栈出栈获取栈顶元素判断栈是否为空获取栈中元素个数Stack.hStack.ctest.c队列队列.顺序表结构体的设计队列的初…

学生HTML个人网页作业作品 简单的IT技术个人简历模板html下载 简单个人网页设计作业 静态HTML个人博客主页

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

Python老手也会犯的20个新手级错误

Python编码时应避免的常见错误 编程(不仅Python,也包括其它编程语言)最好的一点是,有多种方法来实现同一解决方案。 使用不同的方法来达到相同的结果(图像由作者绘制) 由于下述原因,有些方法会比…

几款很好看的爱心表白代码(动态)

分享几款好看的爱心表白代码❤️爱心代码❤️(C语言)❤️流动爱心❤️(htmlcssjs)❤️线条爱心❤️(htmlcssjs)❤️biu表白爱心❤️(htmlcssjs)❤️matlab爱心函数❤️(需…

Java类和对象(一)

🎀作者:爱塔居的博客_CSDN博客-领域博主 🌭专栏:JavaSE 🍧作者简介:大三学生,想要努力地变得更好! 附上一张可可爱爱的猫猫图~ 🍓🍓🍓&#x1f35…

论文学习——多度量水文时间序列相似性分析

文章目录摘要1 研究背景1.1 主要研究内容1.2 研究背景1.3 启发2 基于改进BORDA投票法的多度量水文时间序列相似性分析2.1 研究方法2.2 BORDA投票法的改进2.2.1 BORDA 的缺点2.2.2 改进的BORDA投票法3 实验验证与分析3.1 实验数据3.2 实验结果分析4 结语多度量组合可以提高相似性…

关于使用GB28181协议实现与大华摄像机的语音对讲功能小记

目前只测试了与大华摄像机的语音对讲功能,在此记录下对接工程中遇到的问题和收获。 首先我们需要理清下思路: 第一步要熟悉语音对讲的协议流程,下图为国标28181中的参考图: 这里我们可以简化下流程,只参与与摄像机的…

计算机网络第二章知识点回顾(自顶向下)

第二章知识点回顾1.应用层1.1网络应用架构1.1.1客户-服务器架构1.1.2P2P架构1.1.3两种架构的对比1.2不同终端上的进程通信1.3进程与网络的接口:套接字1.4进程如何标识自己:进程编址1.5因特网提供的传输服务小结1.6Web应用画像1.7 HTTP协议1.7.1HTTP使用T…

大数据技术基础实验十三:Kafka实验——订阅推送示例

大数据技术基础实验十三:Kafka实验——订阅推送示例 文章目录大数据技术基础实验十三:Kafka实验——订阅推送示例一、前言二、实验目的三、实验要求四、实验原理1、Kafka简介2、Kafka使用场景五、实验步骤1、配置各服务器之间的免密登录2、安装ZooKeeper…

【C++】优先级队列 priority_queue的使用模拟实现 | 仿函数

🌈欢迎来到C专栏~~优先级队列的使用 & 模拟实现 (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort目前状态:大三非科班啃C中🌍博客主页:张小姐的猫~江湖背景快上车🚘,握好方向盘跟我有一起打天下嘞&#xff01…

聚乙二醇衍生物MAL-PEG-NH2,Maleimide-PEG-amine,CAS:1207751-12-9​

英文:MAL-PEG-NH2,Maleimide-PEG-amine 中文:马来酰亚胺-聚乙二醇-氨基 2、CAS编号:1207751-12-9 3、所属分类:Amine PEG Maleimide PEG 4、分子量:可定制,5000、2000、3400、20000、10000、…

【附源码】Python计算机毕业设计汽车租赁网站

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

eBPF学习笔记(一)—— eBPF介绍内核编译

eBPF学习笔记(一)—— eBPF介绍&内核编译eBPF介绍eBPF基础代码验证即时编译eBPF开发工具BCCbpftracelibbpf C/C库eBPF Go库内核编译查看内核版本下载内核源码安装依赖项安装最新版llvm和clang配置内核编译内核BPF示例程序常见问题问题一:…

C++ 堆、大顶堆、小顶堆、堆排序

目录一、什么是堆?1.1 大顶堆1.2 小顶堆1.3 自定义greater1.4 堆索引的特点1.5 堆操作添加元素删除最大元素检查序列是否是堆检查部分序列为堆对堆进行排序升序降序问题:sort()和sort_heap()有什么区别二、排序算法:堆排序2.1 堆排序原理创建…

Bootstrap框架(全)

Bootstrap中文网:点我直达 Bootstrap菜鸟教程:点我直达 目录:(一)Bootstrap标准模板:(二)CSS样式区:一、布局容器:二、栅格系统:1.列组合&#x…

<Linux> 软件包管理器yum及编辑器vim的使用

文章目录一、yum的背景知识1. 商业生态2. 开源生态3. 软件生态本土化二、yum 的基本使用1. 查看软件包2. 安装、卸载、搜索软件实现Windows下和Linux下文件互传三、vim的基本使用1. vim 的基本概念2. vim 的基本操作2.1.模式间切换2.2.插入模式2.3.命令模式2.4.底行模式四、vim…