面向对象-----继承
前面向大家介绍了面向对象中的封装性今天再来向大家介绍面向对象的继承和多态的两大特性。1.继承1.1 为什么需要继承在java语言中我们用类来描述世间万物虽然万物非常复杂但总有一些共同点如果将这些共同点抽取出来便能更好的提高我们写代码的效率。所以在面向对象的语言中提出了继承的概念用来抽取事物的共性实现代码的复用。1.2 继承的概念继承机制在面向对象程序设计中继承可以让程序员实现代码的复用也可以让程序员在原有类父类、基类、超累的基础上进行属性和供能的扩增从而产生出新的类这些新的类被称为派生类同时也被称为子类。继承实现的主要功能为抽取共性实现代码的复用。1.3 继承的语法在Java中如果要用到继承来表示类之间的继承关系我们要用到extend关键字。语法格式修饰符 class 子类名 extends 父类名{ }接下来我们来举一个例子。以猫和狗为例我们知道猫和狗有一些共同点如名字年龄颜色这些都是动物的共性。我们就可以将这些共同点抽取出来放在一个类中这个类就是父类。接着我们分别将猫和狗分别设置为两个类分别继承父类。然后分别在猫和狗的类中各自实现自己的功能与属性如猫要吃猫粮狗要吃狗粮。代码实现父类public class Animal { //共性的抽取 public String name; public int age; public String color; }狗类public class Dog extends Animal{ public void eat(){ System.out.println(this.name在吃狗粮); } }猫类public class Cat extends Animal{ public void eat(){ System.out.println(this.name在吃猫粮); } }测试类public class Test { public static void main(String[] args) { Dog dognew Dog(); System.out.println(dog.name 旺财); System.out.println(dog.age 6); System.out.println(dog.color black); dog.eat(); Cat catnew Cat(); System.out.println(cat.name 咪咪); System.out.println(cat.age 7); System.out.println(cat.color white); cat.eat(); } }通过测试类我们发现即使我们没有在Dog类和Cat类中定义了name、age和color的成员变量但由于都继承了Animal这个父类所以我们通过Dog类和Cat类创建的对象也可以使用name、age和color这三个成员变量。运行代码小总结父类的成员方法和成员变量会被继承到子类中。2. 访问成员变量和成员方法在继承这个机制中成员变量和成员的方法遵循就近原则。在子类的方法中或者通过子类的对象去访问成员方法或者成员变量时优先在子类中寻找使用。如果在子类当中没有找到对应的成员变量或者成员方法在去父类中寻找使用如果父类和子类中都没有找到则编译会报错。2.1 访问成员变量父类的成员变量和子类成员变量不同名优先到子类中找对应的成员变量如果在子类中没找到再去父类中找都没找到就会报错。class Base{ public int a10; } class Derive extends Base{ public int b9; } public class Test { public static void main(String[] args) { Derive derivenew Derive(); System.out.println(derive.b); } }父类的成员变量和子类的的成员变量同名一样遵循就近原则class Base{ public int a10; } class Derive extends Base{ public int a9; } public class Test { public static void main(String[] args) { Derive derivenew Derive(); System.out.println(derive.a); System.out.println(derive.a); } }2.2 访问成员方法父类的成员方法与子类的成员方法不同名字遵循就近原则class Base{ public int a10; public void Base(){ System.out.println(Base()被调用......); } } class Derive extends Base{ public int a9; public void Derive(){ System.out.println(Derive()被调用。。。。。。); } } public class Test { public static void main(String[] args) { Derive derivenew Derive(); derive.Derive(); derive.Base(); } }父类的成员方法与子类的成员方法同名这里涉及到了方法的重写和动态绑定后面讲解多态的时候会介绍这里也先理解为就近原则。class Base{ public void Test(){ System.out.println(父类的Test()......被调用); } } class Derive extends Base{ public void Test(){ System.out.println(子类的Test()......被调用); } } public class Test { public static void main(String[] args) { Derive derivenew Derive(); derive.Test(); } }注意事项如果我们通过子类创建的对象去访问父类和子类同名的成员方法时但是由于父类和子类同名的成员方法的参数列表不同重载会根据调用方法时的参数去子类和父类中去寻找合适的成员方法。class Base{ public void Test2(int a){ System.out.println(父类Test2(int a)被调用......); } public void Test1(){ System.out.println(父类的Test1()被调用......); } } class Derive extends Base{ public void Test2(){ System.out.println(子类的Test2()被调用......); } public void Test1(int a){ System.out.println(子类的Test1(int a)被调用......); } } public class Test { public static void main(String[] args) { Derive derivenew Derive(); int a10; derive.Test1(a); //调用子类的Test1(int a); derive.Test1(); //调用父类的Test1(); derive.Test2(a); //调用父类的Test2(int a); derive.Test2(); //调用子类的Test2(); } }运行代码3.super关键字如果我们要想在子类中直接去访问父类的去访问符类的成员变量和成员方法要如何操作呢答案就是super关键字。通过super关键字我们就能直接在子类中去访问父类的成员变量和成员方法。class Base{ int a10; public void Test2(int a){ System.out.println(父类Test2(int a)被调用......); } public void Test1(){ System.out.println(父类的Test1()被调用......); } } class Derive extends Base{ int a9; public void Test2(){ System.out.println(子类的Test2()被调用......); } public void Test1(int a){ System.out.println(子类的Test1(int a)被调用......); } public void Test(){ System.out.println(super.a);//调用父类的a super.Test2(a);//调用父类的Test2(int a) super.Test1();//调用父类的Test1() } } public class Test { public static void main(String[] args) { Derive derivenew Derive(); derive.Test(); } }注意事项super关键字只能在非静态的函数不被static修饰的函数中使用。4.子类构造方法常言道先有爸爸再有儿子所以在调用子类的构造方法时我们要在子类的构造方法中用super关键字去调用父类的构造方法否则编译器会报错。class Base{ public Base(){ System.out.println(调用了父类的构造方法); } } class Derive extends Base{ public Derive(){ super(); System.out.println(子类的构造方法); } } public class Test { public static void main(String[] args) { Derive derivenew Derive(); } }如果父类和子类的构造方法都构成重载我们会跟据创建对象时传的参数列表进入子类中对应的构造函数然后根据子类的构造函数中的super(......) 括号里的参数列表去调用父类中合适的构造方法。class Base{ public int a; public int b; public Base(){ System.out.println(调用了父类的构造方法); } public Base(int a,int b){ this.aa; this.bb; System.out.println(调用了父类中的有参构造方法); } } class Derive extends Base{ public Derive(){ super(); System.out.println(调用了子类的构造方法); } public Derive(int a,int b){ super(a,b); System.out.println(调用了子类的有参构造方法); } } public class Test { public static void main(String[] args) { Derive derivenew Derive(10,20); System.out.println(); Derive derive1new Derive(); } }运行代码注意事项1.如果我们没有在子类的构造方法中去调用父类的构造函数编译器会自动默认子类的构造方法中调用了super()。class Base{ public int a; public int b; public Base(){ System.out.println(调用了父类的构造方法); } } class Derive extends Base{ public Derive(){ //super(); 没有写但会默认有 System.out.println(调用了子类的构造方法); } } public class Test { public static void main(String[] args) { Derive derive1new Derive(); } }2.super(......)关键字必须位于子类的构造函数的第一行。3.super(......)只能在子类的构造函数中出现一次并且不能和this(......)同时出现。小总结----super与this的异同点相同点1.super和this都是Java中的关键字。2.都只能再非静态方法中使用只能用来访问非静态成员变量和成员方法。3.在构造方法中使用this和super关键字调用构造方法时只能位于第一行并且this(...)和super(...)不能同时存在。不同点1.this关键字当前对象的引用当前对象即本类实例化的对象super关键字是子类从父类继承的属性和方法的引用。如下图2.this关键字使用来调用本类的成员方法和成员变量super关键字是用来调用父类的成员变量和成员方法。3.在继承机制的构造方法中一定存在super调用的构造方法如果没写编译器也会默认有。但是如果this(...)没写那就没有。5.再谈初始化在Java中代码块运行的顺序为静态代码块到实例化代码块再到构造代码块。那父类和子类这3种代码块的运行先后是怎么样的呢我们直接来看代码class Father{ public int age; public Father(){ System.out.println(父类的构造代码块); } { System.out.println(父类实例化代码块); } static { System.out.println(父类的静态代码块); } } class Son extends Father{ public Son(){ super(); System.out.println(子类的构造代码块); } { System.out.println(子类的实例化代码块); } static { System.out.println(子类的静态代码块); } } public class Test { public static void main(String[] args) { Son son1new Son(); System.out.println(); Son Son2new Son(); } }运行代码得出结论1.先执行父类的静态代码块再执行子类的静态代码块并且只执行一次因为静态代码块是再类的加载成功时运行的而类的加载只进行一次。2.执行完静态代码块再先后执行父类的实例化代码块父类的构造代码块最后再分别先后执行子类的实例化代码块和构造代码块。6.继承方式再Java中我们支持单继承多层继承和不同的多个类继同时承一个类。但是不能一个类同时继承多个类。如图7.final关键字1.final修饰的成员变量无法被修改2.final修饰的类无法被继承3.final修饰的方法无法被重写

相关新闻

如何快速掌握OpenBoard:5个秘诀让课堂互动更高效

如何快速掌握OpenBoard:5个秘诀让课堂互动更高效

如何快速掌握OpenBoard:5个秘诀让课堂互动更高效 【免费下载链接】OpenBoard OpenBoard is a cross-platform interactive whiteboard application intended for use in a classroom setting. 项目地址: https://gitcode.com/gh_mirrors/ope/OpenBoard OpenB…

2026/7/6 21:17:23阅读更多 →
EhViewer安卓画廊浏览器终极指南:如何高效管理你的数字艺术收藏

EhViewer安卓画廊浏览器终极指南:如何高效管理你的数字艺术收藏

EhViewer安卓画廊浏览器终极指南:如何高效管理你的数字艺术收藏 EhViewer是一款专为Android设备设计的开源画廊浏览器应用,它让用户能够轻松访问、浏览和管理E-Hentai画廊内容。这款应用采用经典的Material Design 2界面风格,提供了流畅的阅…

2026/7/6 21:17:23阅读更多 →
如何在游戏本上运行MaralGPT-Mythos-9B-2606-GGUF?Ollama与Python完整教程

如何在游戏本上运行MaralGPT-Mythos-9B-2606-GGUF?Ollama与Python完整教程

如何在游戏本上运行MaralGPT-Mythos-9B-2606-GGUF?Ollama与Python完整教程 【免费下载链接】MaralGPT-Mythos-9B-2606-GGUF 项目地址: https://ai.gitcode.com/hf_mirrors/MaralGPT/MaralGPT-Mythos-9B-2606-GGUF MaralGPT-Mythos-9B-2606-GGUF是一款高效的…

2026/7/6 21:12:23阅读更多 →
2026年7月宁波小程序开发公司哪家好?定制开发推荐与排行参考

2026年7月宁波小程序开发公司哪家好?定制开发推荐与排行参考

宁波企业做小程序,常见的需求集中在贸易、供应链、仓储查询、经销商订货、客户管理和售后服务。不同客户的价格、区域权限、库存信息、发货状态和订单审核很容易让小程序变成“只能看不能管”的工具。。 小程序开发不是把电脑端内容缩到手机里。真正的难点是&#x…

2026/7/6 23:47:40阅读更多 →
Flowable 工作流镜像瘦身 3 步:从 500MB 到 150MB 的 Dockerfile 优化

Flowable 工作流镜像瘦身 3 步:从 500MB 到 150MB 的 Dockerfile 优化

Flowable 工作流镜像瘦身实战:从 500MB 到 150MB 的 Dockerfile 优化指南当企业级应用采用 SpringBoot 集成 Flowable 工作流引擎时,Docker 镜像体积往往成为影响部署效率的关键瓶颈。本文将揭示如何通过三阶段优化策略,将典型 500MB 的臃肿镜…

2026/7/6 23:47:40阅读更多 →
无常与耕耘-时间因果观的生命哲学阐释

无常与耕耘-时间因果观的生命哲学阐释

无常与耕耘:时间因果观下的生命修行 NO.49因为时间流逝,无常最是寻常;因为因果不虚,无常也最是公平。一切回报都藏在时间流逝中,没有哪一刹那的善念善行是不作数的。它们都将在未来某个时刻,开出安乐的花。…

2026/7/6 23:47:40阅读更多 →
5分钟掌握企业级SSO:用python-saml实现SAML 2.0单点登录

5分钟掌握企业级SSO:用python-saml实现SAML 2.0单点登录

1. 项目概述:为什么企业级SSO值得你花5分钟?如果你正在开发一个面向企业客户的应用,或者你的内部系统需要集成多个服务,那么“单点登录”这四个字你一定不陌生。想象一下,员工每天要登录邮箱、CRM、ERP、项目管理工具等…

2026/7/6 23:47:40阅读更多 →
TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

TPOT自动化机器学习:基于遗传编程的可解释pipeline优化

1. TPOT 是什么:一个会自己写代码的机器学习助手你有没有过这种体验:花一整天调参,把 Random Forest 的n_estimators从 100 试到 1000,把max_depth从 5 拉到 20,再换 SVM、XGBoost、LightGBM 轮流上阵,最后…

2026/7/6 23:47:40阅读更多 →
Unity Burst Compiler 1.8 性能剖析:3 种数学计算场景对比,加速比最高达 120 倍

Unity Burst Compiler 1.8 性能剖析:3 种数学计算场景对比,加速比最高达 120 倍

Unity Burst Compiler 1.8 性能剖析:3 种数学计算场景对比当我们需要在Unity中处理大规模数学运算时,Burst Compiler往往能带来惊人的性能提升。最新发布的1.8版本在数学计算优化方面有了显著改进,特别是在矩阵运算、噪声生成和物理模拟这三个…

2026/7/6 23:42:39阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行:官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南在数据分析和处理领域,去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时,不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

2026/7/6 0:03:39阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →