Java之继承1

1. 继承

1.1 为什么要继承

在Java中我们定义猫类和狗类,如下

在这里插入图片描述

public class Cat {public String name;public int age;public String color;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}public void bark(){System.out.println(name + "在喵喵叫");}
}

在这里插入图片描述

public class Dog {public String name;public int age;public String color;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}public void bark(){System.out.println(name + "在汪汪叫");}
}

在这里插入图片描述
根据图片我们可以发现猫类和狗类有大量重复的代码,我框住的就是重复的地方。
在Java中,于是就提出了继承这个概念,用来抽取共性。

1.2 继承的概念

在Java中,继承是面向对象编程的重要特性之一,它允许一个类(子类)继承另一个类(超类)的属性和方法。通过继承,子类可以重用超类的代码,从而提高代码的可重用性和可维护性,即实现共性的抽取,代码复用

上述代码中,猫和狗都是动物,我们可以定义一个动物类将共性抽取,再让猫类和狗类都继承这个动物类实现代码复用

在这里插入图片描述

1.3 如何继承

继承需要用到 extends关键字

修饰符 class 子类 extends 父类 {// ...  
}

将上述代码用继承实现

public class Animal {public String name;public int age;public String color;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}
}public class Cat extends Animal {public void bark(){System.out.println(name + "在喵喵叫");}
}public class Dog extends Animal{public void bark(){System.out.println(name + "在汪汪叫");}
}

子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

1.4 父类成员的访问

那么子类怎么访问父类的成员变量和方法呢?

1.4.1 子类怎么访问父类的成员变量

子类访问父类的成员变量也分为两种情况,分别为不同名的成员变量如何访问、同名的成员变量如何访问。

1.4.1.1 子类和父类的成员变量不同名
public class Test1 {public int a = 1;public int b = 2;
}public class Test2 extends Test1{public int c = 3;public void test(){System.out.println(a);//从父类中继承下来的aSystem.out.println(b);//从父类中继承下来的bSystem.out.println(c);//自己类的c}
}public class Main {public static void main(String[] args) {Test2 test2 = new Test2();test2.test();}
}//运行结果
1
2
3
1.4.1.2 子类和父类的成员变量同名
public class Test1 {public int a = 1;public int b = 2;
}public class Test2 extends Test1{public int b = 5;public int c = 3;public void test(){System.out.println(a);//从父类继承下来的aSystem.out.println(b);//是访问父类继承下来的b还是自己类的b呢System.out.println(c);//自己类的c}
}public class Main {public static void main(String[] args) {Test2 test2 = new Test2();test2.test();}
}//执行结果
1
5
3

根据执行结果来看,访问的是自己类的b

如果我们将Test2的代码改动,如下

public class Test2 extends Test1{public int b = 5;public int c = 3;public void test(){System.out.println(a);System.out.println(b);System.out.println(c);System.out.println(d);}
}

在这里插入图片描述
访问父类和子类都没有的成员变量编译器会报错。

结论

  1. 如果访问的成员变量子类中有时,就访问子类自己的成员变量。
  2. 如果访问的成员变量子类中没有时,就访问父类中的成员变量,如果父类中也不存在该成员变量,编译器报错。
  3. 如果访问的成员变量子类中和父类中同名时,优先访问子类的

优先访问子类自己的,如果没有再去访问父类的。

1.4.2 子类怎么访问父类的成员方法

同上,分为不同名的成员方法如何访问、同名的成员方法如何访问。

1.4.2.1 子类和父类的成员方法不同名
public class Test1 {public void f1(){System.out.println("Test1的方法f1");}
}public class Test2 extends Test1{public void f2(){System.out.println("Test2方法中的f2");}public void test(){f1();//访问父类中的该方法f2();//访问子类中该方法}
}public class Main {public static void main(String[] args) {Test2 test2 = new Test2();test2.test();}
}//运行结果
Test1的方法f1
Test2方法中的f2
1.4.2.2 子类和父类的成员方法同名
public class Test1 {public void f1(){System.out.println("Test1的方法f1");}public void f2(){System.out.println("Test1的f1方法");}
}public class Test2 extends Test1{public void f1(int a){System.out.println("Test2的方法f1");}public void f2(){System.out.println("Test2的方法f2");}public void test(){f1();//没有传参,访问父类中的该方法f1(1);//传参,访问自己类中的该方法f2();//访问子类中的该方法}
}public class Main {public static void main(String[] args) {Test2 test2 = new Test2();test2.test();}
}//执行结果
Test1的方法f1
Test2的方法f1
Test2的方法f2

结论

  1. 如果访问的成员方法不同名时,优先在子类中找,找到则访问,找不到在父类中找;如果父类和子类都没有时,则编译器报错。
  2. 如果访问的成员方法同名时,优先访问自己的;如果父类和子类同名方法的参数列表不同(重载),根据调用
    方法适传递的参数选择合适的方法访问。

在这里插入图片描述

有点给我写懵了,明天再写吧,嘻嘻
未完待续~
在这里插入图片描述
不要走开,明天再来

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

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

相关文章

网页聊天——测试报告——Selenium自动化测试

一,项目概括 1.1 项目名称 网页聊天 1.2 测试时间 2024.9 1.3 编写目的 对编写的网页聊天项目进行软件测试活动,揭示潜在问题,总结测试经验 二,测试计划 2.1 测试环境与配置 服务器:云服务器 ubuntu_22 PC机&am…

国庆电影扎堆来袭,AI智能体帮你推荐必看佳片!(附制作教程)

大家好,我是凡人。 今天看到新闻,发现国庆有10部影片要扎堆儿上映,对于选择困难症的我属实有点难选,同时也想避开一些坑省的浪费金钱和时间。 本着不知道就问AI的习惯,想问问大模型怎么看,但做了简单的交…

Go语言基础学习02-命令源码文件;库源码文件;类型推断;变量重声明

命令源码文件 GOPATH指向的一个或者多个工作区,每个工作区都会有以代码包为基本组织形式的源码文件。 Go语言中源码文件可以分为三类:命令源码文件、库源码文件、测试源码文件。 命令源码文件: 命令源码文件是程序的运行入口,是每…

descrTable常用方法

descrTable 为 R 包 compareGroups 的重要函数,有关该函数以及 compareGroups 包的详细内容见:R包compareGroups详细用法 加载包和数据 library(compareGroups)# 加载 REGICOR 数据(横断面,从不同年份纳入,每个变量有…

十五、差分输入运算放大电路

差分输入运算放大电路 1、差分输入运算放大电路的特点、用途, 2、输出信号电压与输入信号电压的关系。

Python | Leetcode Python题解之第420题强密码检验器

题目: 题解: class Solution:def strongPasswordChecker(self, password: str) -> int:n len(password)has_lower has_upper has_digit Falsefor ch in password:if ch.islower():has_lower Trueelif ch.isupper():has_upper Trueelif ch.isdi…

YOLOv10 简介

YOLOv10,由清华大学的研究人员基于 Ultralytics Python 包构建,引入了一种全新的实时目标检测方法,该方法解决了以往 YOLO 版本中后处理和模型架构方面的不足。通过消除非极大值抑制(NMS)并优化各种模型组件&#xff0…

Linux文件IO(五)-三种进程退出方法及空洞文件

1.三种进程退出方法 return 当程序在执行某个函数出错的时候,如果此函数执行失败会导致后面的步骤不能在进行下去时,应该在出错时终止程序运行,不应该让程序继续运行下去,那么如何退出程序、终止程序运行呢?有过编程…

数据结构:内部排序

文章目录 1. 前言1.1 什么是排序?1.2 排序的稳定性1.3 排序的分类和比较 2. 常见的排序算法3. 实现常见的排序算法3.1 直接插入排序3.2 希尔排序3.3 直接选择排序3.4 堆排序3.5 冒泡排序3.6 快速排序3.6.1 hoare思想3.6.2 挖坑法3.6.3 lomuto前后指针法3.6.4 非递归…

Mobile net V系列详解 理论+实战(3)

Mobilenet 系列 论文精讲部分0.摘要1. 引文2. 引文3. 基础概念的讨论3.1 深度可分离卷积3.2 线性瓶颈3.3 个人理解 4. 模型架构细节5. 实验细节6. 实验讨论7. 总结 论文精讲部分 鉴于上一小节中采用的代码是V2的模型,因此本章节现对V2模型论文讲解,便于…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用, clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

【数据结构-二维差分】力扣2536. 子矩阵元素加 1

给你一个正整数 n ,表示最初有一个 n x n 、下标从 0 开始的整数矩阵 mat ,矩阵中填满了 0 。 另给你一个二维整数数组 query 。针对每个查询 query[i] [row1i, col1i, row2i, col2i] ,请你执行下述操作: 找出 左上角 为 (row1…

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

使用Diskgenius系统迁移

使用Diskgenius系统迁移 1、使用系统迁移2、注意点3、新备份的系统盘装在电脑上可能出现盘符错乱导致开机不进入桌面情况 1、使用系统迁移 参考视频: DiskGenius无损系统迁移,换硬盘无需重装系统和软件 2、注意点 1)新的硬盘里面的所有资料…

数据结构_1.1、数据结构的基本概念

1、基本概念 数据:是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理…

【IEEE 独立出版,快速EI检索】第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024)

第四届人工智能、虚拟现实与可视化国际学术会议(AIVRV 2024) 2024 4th International Conference on Artificial Intelligence, Virtual Reality and Visualization 官方信息 会议官网:www.aivrv.org 2024 4th International Conference on…

NXP官方或正点原子mfgtool下载系统报错initialize the library falied error code:29

这是因为mfgtool版本或者源文件被破坏了,你可以重新下载一个被改过的mfgtool程序,我就是去原子官网重新在linux包里找了新的更迭过的mfgtool

【AI大语言模型】提示词工程基础及进阶

【AI大语言模型】提示词工程基础及进阶 什么是提示词(Prompt) 提示词(Prompt)是与人工智能对话时用来引导或触发生成某种输出的指令。 它相当于你在与 AI 进行互动时所提出的问题或任务说明。提示词可以是简短的指令、一个问题…

springboot注册和注入组件方式概览

IoC:Inversion of Control(控制反转) 控制:资源的控制权(资源的创建、获取、销毁等) 反转:和传统的方式不一样了 DI :Dependency Injection(依赖注入) 依赖&…

C++编程语言:基础设施:命名空间(Bjarne Stroustrup)

第 14 章 命名空间(Namespaces) 目录 14.1 组成问题(Composition Problems) 14.2 命名空间(Namespaces) 14.2.1 显式修饰(Explicit Qualification) 14.2.2 使用using 声明 14.2.3 using 指令 14.2.4 参数依赖查询 14.2.5 命名空间的开放性 14.3 模块化和接口 …