java基础(5)继承与多态

4480802ac4a84437adcb9e39c4427f32.jpeg


目录

​编辑

1.前言

2.正文

2.1继承

2.1.1继承概念

2.1.2继承语法

2.1.3子类访问父类

2.1.4super关键字

2.2多态

2.2.1多态概念

2.2.2多态条件

2.2.3重写

2.2.4向上转型与向下转型

2.2.5为什么要使用多态

3.小结


1.前言

哈喽大家好啊,今天继续来为大家分享java基础语法的学习,今天分享的是java中的继承与多态,也是Java基础学习当中非常重要的一部分,话不多说让我们开始吧。

2.正文

2.1继承

2.1.1继承概念

先让我们来引入一下继承,当我们在java编写程序的时候,会创建许多个类,如果每个类都单独创建的话,会使代码看起来非常的冗长,于是对于有相同特点的类,我们对其进行共性的抽取,便有了继承的概念。

b6ab0b961d164eedbc14ba240f0fe0eb.png

继承是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。使用继承可以创建一个层次结构,其中子类继承父类的属性和方法,并且可以添加或覆盖它们。 

2.1.2继承语法

那么继承的语法是如何实现的呢。这里我们就需要运用extends关键字,具体例子参照上面那个图,让我们附上代码。

person父类:

public class person {String name;int age;public person(String name,int age) {this.name = name;this.age = age;}public void func(){System.out.println("目前在学校");}
}

student子类:

public class student extends person {int id;public student(String name, int age, int id) {super(name, age);this.id = id;}public void havaClass() {System.out.println("在听课");}
}

teacher子类:

public class teacher extends person{String subject;public teacher(String name, int age, String subject) {super(name, age);this.subject = subject;}public void makeClass() {System.out.println("在上课");}
}

测试类: 

public class test {public static void main(String[] args) {student s1 = new student("张三",16,001);teacher t1 = new teacher("李四",42,"语文");s1.havaClass();s1.func();t1.func();t1.makeClass();}
}

 运行结果如图:

12ac4fcd05ca4f5ea63b7bb349fc0089.png

2.1.3子类访问父类

让我们先来观察下面这段代码:

public class test {static public class A{int a = 1;}static public class B extends A{int a = 2;int b = 3;}public static void main(String[] args) {B b = new B();System.out.println(b.a);System.out.println(b.b);}
}

我们可以看到,在类A与类B中均对a整型进行了定义,那么打印的结果会是怎样呢?

353b88cd56704936a64c47f0a531d678.png

我们可以看到,打印的是子类定义的a与b而非父类中的定义。那如果我们将类B中的int a删除呢?

7f165ca5675a41c09c6743d3a860b8c2.png

这里打印出来的就是父类中定义的a和子类中定义的b,如果我们再将父类A中的int a删除呢,很显然编译器直接报错,由此我们可以得出:

  • 如果访问的成员变量子类中有,优先访问自己的成员变量。
  • 如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。

同理,访问成员方法也是这个道理:

  • 如果一个方法子类中定义就优先子类,子类中没有就去父类里面,父类也没有编译器就报错。
  • 如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错

2.1.4super关键字

学到这里,我们已经基本明白了如何通过子类访问父类,但如果我们遇到,子类与父类存在变量名相同的情况,此时想访问父类里的同名变量时如何更好的去访问呢?这里我们就引入了super关键字。

super关键字可以访问父类的成员变量,构造方法以及成员方法,下面这段代码将都展示出来:

成员变量:

public class A{int a = 1;}
public class B extends A{public void func() {System.out.println(super.a);}
}

构造方法:

public class A{int num;public A(int num) {this.num = num;}}
public class B extends A{String str ;public B(int num, String str) {super(num);this.str = str;}
}

成员方法:

public class test {public static class A {public void func() {System.out.println(1);}}public static class B extends A {public void func() {super.func();}}public static void main(String[] args) {B b = new B();b.func();  }
}

 e741410d343f42269791c3583b037076.png

另外有一些需要注意的点:

  • 用户没有写构造方法时,编译器会自动添加,而且super()必须是子类构造方法中第一条语句。
  • 当子类继承父类需要先初始化继承过来的父类的成员,此时需要通过super来完成。如果没有通过super调用父类的构造方法,编译器会报错。
  • 只能在类的非静态方法中使用,用来访问非静态成员方法和字段。
  • 在java中不支持多继承,若在写代码过程中想要限制多层继承,可以使用final关键字。

 2.1.5final关键字

final关键字可以用于类,变量,方法上,接下来附上代码方便理解

当修饰类时,该类则不能被继承:

public class test {public static final class A {public void func() {System.out.println(1);}}public static class B extends A {@Overridepublic void func() {super.func();  // 调用父类的func方法System.out.println(2);}}public static void main(String[] args) {B b = new B();b.func();  // 调用b的func方法}
}

5674e63236fb4411845fee4c2db9bfd7.png

当修饰方法时,该方法仅能被调用与继承,而并不能被重写:

public class test {public static class A {public final void func() {System.out.println(1);}}public static class B extends A {@Overridepublic void func() {super.func();  // 调用父类的func方法System.out.println(2);}}public static void main(String[] args) {B b = new B();b.func();  // 调用b的func方法}
}

aa5187a42d28418e8f616ee55a36c23f.png

当修饰变量时,该变量则不能被修改:

public static void main(String[] args) {final int a = 10;a = 20;
}

 c52166ed136c4166b2cd296ea619bf20.png

2.2多态

2.2.1多态概念

让我们先引入多态这个概念,当我们在书写代码时创建多个类时,如学生类和老师类,创建俩个类的方法时,有的方法可能存在类似,但处理后的结果却不同,如老师拿到试题是改作业,学生拿到试题是写试题。鉴于这种情况,我们便引入了多态。

多态(Polymorphism)是面向对象编程(OOP)的一个核心概念。它允许同一个类型的对象在不同的情况下表现出不同的行为。这种特性使得Java程序具有更好的可扩展性、可维护性和可重用性。

2.2.2多态条件

达成多态的条件有以下几个:

  • 必须在继承体系下
  • 子类必须对父类中方法进行重写(何为重写下文讲解)
  • 必须通过父类来引用重写的方法

附上代码:

public class test {public static class A {public void func() {System.out.println(1);}}public static class B extends A {@Override//标记重写public void func(){System.out.println(2);}}public static class C extends A {@Override//标记重写public void func(){System.out.println(3);}}public static void main(String[] args) {B b = new B();C c = new C();b.func();c.func();}
}

 我们可以看到实例化b与实例化c都调用了func函数,那么究竟是父类还是子类的func呢?

20ef3bd365b94604b819a8dccd8b3eca.png

根据上文的讲解我们也应该很容易得出,分别调用的是子类重写后的方法。

2.2.3重写

我们上文用了这么多重写,那么到底何为重写呢,下文我们详细盘一盘:

重写(Override)是面向对象编程中的一个重要概念,子类可以重新定义父类中已经定义过的方法,这样当通过子类的实例来调用该方法时,就会执行子类中的实现版本,而不是父类中的版本。


重写的具体规则如下:

  1. 方法签名必须相同:重写的方法必须与父类中被重写的方法具有相同的名称、返回类型和参数列表。

  2. 访问修饰符:子类重写的方法的访问修饰符不能比父类中被重写的方法的访问修饰符更严格。例如,如果父类中的方法是public,那么子类中的重写方法也必须是public。但是,子类可以使用更宽松的访问修饰符,如protected

  3. 不能重写final方法:如果父类中的方法是final的,那么子类不能重写该方法。

  4. 不能重写static方法:静态方法属于类本身,而不是类的实例。因此,子类不能重写父类中的静态方法。

2.2.4向上转型与向下转型

向上转型与向下转型有点类似于数据类型中int与long之间的强转,接下来就让我们来分别介绍何为向上转型,何为向下转型。

向上转型,指的是将一个子类对象的引用赋值给一个父类类型的变量,而向下转型(Downcasting)是指将父类引用类型转换为子类引用类型的过程。

代码如下:

public class test {public static class A {int a = 1;}public static class B extends A {int b = 2;}public static void main(String[] args) {A a = new B();//向上转型if (a instanceof B) {B b = (B) a; // 强制类型转换//向下转型}}
}

其中在进行向下转型之前,通常需要使用instanceof关键字来判断父类引用是否指向了一个子类对象,这是为了确保类型转换的安全性。

2.2.5为什么要使用多态

到此为止我们已经大概讲解完了堕胎的概念以及重写的使用,那我们这样编写代码有什么优缺点呢?

优点有以下主要几点:


提高代码的灵活性和可扩展性

  • 多态允许在运行时动态地决定调用哪个方法,这使得代码更加灵活,易于扩展。
  • 当需要添加新的子类时,只需确保新子类实现了父类或接口中的方法,而无需修改现有代码。

简化代码

  • 通过多态,可以使用父类引用来操作子类对象,从而简化代码结构,减少重复代码。
  • 多态使得代码更加通用,因为父类引用可以指向任何子类对象。

而缺点也显而易见:


性能开销

  • 多态的实现通常依赖于动态绑定,即在运行时决定调用哪个方法。
  • 这可能会使代码的运行效率降低。

复杂性增加

  • 多态使得代码结构更加复杂,因为需要理解父类、子类以及它们之间的关系。

调试难度增加

  • 由于多态允许在运行时动态地决定调用哪个方法,因此调试时可能难以确定哪个方法被实际调用。
  • 会增加调试的难度和时间成本。

3.小结

今天关于继承与多态的讲解到这里就结束了,喜欢的小伙伴不要忘了点点关注点点收藏支持一下哦,你的支持就是对我最大的鼓励。

 

 

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

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

相关文章

【微信小程序_12_全局配置之 tabBar】

摘要:本文介绍了微信小程序中的 tabBar,包括其定义、组成部分、节点配置项和每个 tab 项的配置选项。还通过案例详细说明了配置 tabBar 的步骤,如拷贝图标资源、新建 tab 页面和配置 tabBar 选项等。tabBar 可实现多页面快速切换,合理配置能提升用户体验。 微信小程序_12_全…

刷爆Leetcode Day2

leetcode 6. 和为s的两个数字7.三数之和8. 四数之和9. 长度最小的子数组10. 无重复字符的最长子串 6. 和为s的两个数字 题目 class Solution { public:vector<int> twoSum(vector<int>& price, int target) {//排序双指针sort(price.begin(),price.end());in…

C++ operator new和operator delete的深入讲解

个人主页&#xff1a;Jason_from_China-CSDN博客 所属栏目&#xff1a;C系统性学习_Jason_from_China的博客-CSDN博客 所属栏目&#xff1a;C知识点的补充_Jason_from_China的博客-CSDN博客 前言 关于operator new和operator delete我们需要明确一个概念&#xff0c;这两个都是…

15.5 JDBC数据库编程5——DAO

目录 15.1.1 引言 实体类Product.java 异常类DaoException.java Dao.java ProductDao.java ProductDaoImpl.java ProductDaoTest.java 15.1.1 引言 Java是面向对象编程语言&#xff0c;主要操作对象&#xff0c;而关系数据库的数据并不是对象&#xff0c;Java程序插入…

linux线程 | 线程的控制(下)

前言&#xff1a; 本节内容是线程的控制部分的第二个小节。 主要是列出我们的线程控制部分的几个细节性问题以及我们的线程分离。这些都是需要大量的代码去进行实验的。所以&#xff0c; 准备好接受新知识的友友们请耐心观看。 现在开始我们的学习吧。 ps:本节内容适合了解线程…

对MVC详细解读

一、MVC模式的详细组成部分 1. 模型&#xff08;Model&#xff09; 数据结构&#xff1a; 模型通常使用类或结构来定义应用程序的数据结构。例如&#xff0c;在Ruby on Rails中&#xff0c;模型通常与数据库表相对应&#xff0c;使用Active Record模式。 数据访问层&#xff1…

动态内存管理(C语言 VS C++)

目录 一.动态内存管理的前置知识 1.栈区 a.栈区的特点 b.注意事项 2.堆区 a.堆区的特点 b.注意事项 3.全局/静态区 a.作用域和生命周期 b.注意事项 4.常量区 二.C语言动态内存管理 1.malloc 函数 a.接口简介与使用实例 b.注意要点 2.calloc 函数&#xff1a; 3.…

Flink Web UI 是使用和调试保姆级教程(持续更新)

Flink Web UI 是调试和监控 Flink 应用程序的重要工具&#xff0c;通过它&#xff0c;你可以实时查看正在运行的 Flink 任务的详细信息&#xff0c;包括作业的状态、性能指标、各子任务的运行情况、故障恢复情况等。Flink Web UI 的这些功能为开发者和运维人员提供了调试和优化…

化学元素分子量、氧化物系数计算python类

在网上找到的分子量计算类&#xff0c;做了少量修改,有原子量、分子量、氧化物系数的计算。 import re wt_dict{ #该原子量数据从CRC手册第95版提取。"H": 1.008,"He": 4.002602,"Li": 6.94,"Be": 9.0121831,"B": 10.…

【入门篇】2.4 map映射文件解析

目录 一,编译产物 1.1 .o 文件(目标文件): 1.2 .hex 文件(十六进制文件) 1.3 .bin 文件(二进制文件) 1.4 .elf 文件(可执行链接格式文件) 1.5 .map 文件(映射文件) 1.6 .lst 文件(列表文件) 二,map文件解析 2.1 程序段交叉引用关系(Section Cross Refe…

Git基础-配置http链接的免密登录

问题描述 当我们在使用 git pull 或者 git push 进行代码拉取或代码提交时&#xff0c; 若我们的远程代码仓库是 http协议的链接时&#xff0c;就是就会提示我们进行账号密码的登录。 每次都要登录&#xff0c;这未免有些麻烦。 本文介绍一下免密登录的配置。解决方案 1 执行…

如何在CSS中修改滚动条样式

修改滚动条样式在CSS中是一个有趣而常见的需求&#xff0c;特别是当你希望网页设计更加个性化时。虽然并不是所有浏览器都完全支持修改滚动条样式&#xff0c;但我们可以使用一些专门的CSS选择器来控制滚动条外观。以下是一个详细讲解&#xff0c;适合整理成博客发布。 如何在C…

软考系统分析师知识点十三:软件需求工程

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;24天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

FPGA采集adc,IP核用法,AD驱动(上半部分)

未完结&#xff0c;明天补全 IP核&#xff1a;集成的一个现有的模块 串口写好后基本不会再修改串口模块内部的一些逻辑&#xff0c;将串口.v文件添加进来&#xff0c;之后通过他的上层的接口去对他进行使用&#xff0c;所以我们打包IP&#xff0c;之后就不用去添加源文件了&a…

仿 Mac 个人网站开发 |项目复盘

一、前言 1.1 灵感来源 早年有幸看到国外大佬做的一个 基于 Web 的 Windows XP 桌面娱乐系统, 那时刚好有搭建一个个人博客的想法, 所以就想是否可以基于 WEB 实现一个仿 Mac UI 的个人博客, 以应用的形式来展示博客各个功能! 1.2 相关链接(求个 Star) 前端开源代码后端开源…

Linux之实战命令32:chroot应用实例(六十六)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

【MySQL】入门篇—SQL基础:SQL语言概述

SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;是一种用于管理和操作关系数据库的标准语言。随着信息技术的快速发展&#xff0c;数据成为企业和组织最重要的资产之一。有效地存储、查询和管理数据对于业务决策和运营至关重要。 SQL作为与关…

Java类与对象的分配机制

在Java中&#xff0c;类和对象是不同的概念。 类是一种数据类型&#xff0c;它定义了对象的行为和属性。类可以包含成员变量和方法。 对象是类的实例&#xff0c;它是在程序运行时根据类创建的。每个对象都有自己独立的内存空间&#xff0c;可以访问类中定义的成员变量和方法…

ali 231普通滑块82y版本

有需求可以联系博主 let v Died_in2021

【含开题报告+文档+PPT+源码】基于人脸识别的课堂考勤系统的设计与实现

开题报告 随着科技的不断发展&#xff0c;人脸识别技术已经逐渐渗透到各个领域&#xff0c;包括教育领域。传统的课堂考勤方式通常依赖于学生签到或教师手动记录&#xff0c;这种方式存在着许多不足之处&#xff0c;例如容易出现人为错误、耗费时间和资源等。为了解决这些问题…