新闻详情

新闻详情

首页 / 资讯中心 / 详情

大白话!Java中的继承和多态的理解

发布时间:2026/10/2 2:21:57来源:尧图网络
大白话!Java中的继承和多态的理解
目录什么是继承什么是父类什么是子类继承有什么好处Java中的代码演示构造方法在类继承中的作用构造方法在继承关系中的使用什么是多态方法的重载重载代码演示方法的覆盖覆盖代码演示向上转型和向下转型向上转型向上转型的代码演示向上转型的优缺点向下转型向下转型的代码演示多态的优点什么是继承继承是面向对象编程中两个类之间的一种关系。被继承的类称为父类或超类而继承父类的类则称为子类。什么是父类什么是子类父类实际上使所有子类公共域和公共方法的集合而每个子类则是父类的特殊化使对公共域和方法在功能、内涵方面的扩展和衍生。继承有什么好处继承可以使代码结构更加清晰降低编码和维护的成本。Java中的代码演示定义类的时候通过关键字extends指明要继承的直接父类。子类对象除了可以访问子类中直接定义的成员外也可以访问父类的所有非私有成员。class Animal { public String name; public int age; public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public void bark(){ System.out.println(name正在汪汪汪叫); } } public class Test { public static void main(String[] args) { Dog d new Dog(); d.eat(); //Dog类中并没有eat方法eat方法是从Animal中继承而来的 d.bark(); System.out.println(d.name); } }构造方法在类继承中的作用首先构造方法不能被继承因为子类对象要对继承的父类的成员进行初始化所以在创建子类对象时除了执行子类自己的构造方法还需要执行父类的构造方法。子类可以在自己构造方法使用关键字super来调用父类的构造方法但是super调用的语句必须时子类构造方法第一条可执行语句如果在子类定义构造方法中没有使用super来明确调用父类的构造方法则在创建对象时首先自动执行父类的无参构造方法然后再执行自己定义的构造函数会报错的情况class Animal1{ public String name; //有一个参数的构造方法 public Animal1(String name){ this.namename; } } class Cat extends Animal1{ //因为在子类的对象中没有使用super调用父类的有参构造方法所以会报错 }不会报错的情况class Animal1{ public String name; //有一个参数的构造方法 public Animal1(String name){ this.namename; } } class Cat extends Animal1{ public Cat(String name) { super(name); //利用super 调用父类一个参数的构造方法 } }构造方法在继承关系中的使用import java.awt.*; class Point { int x; int y; //有参构造方法 Point(int x,int y){ this.xx; this.yy; } //无参构造方法 复习前一节知识点可以用this Point(){ this(0,0);//可以利用this调用上面一种构造方法 } Override public String toString() { return Point{ x x , y y }; } } class Pixel extends Point { //子类中自己的成员变量 Color c; Pixel(int x,int y,Color c){ super(x,y); //一定要把super写在子类自己构造方法的内部 this.cc; } Override public String toString() { return super.toString() 颜色 c; } } public class Test3 { public static void main(String[] args) { Pixel pnew Pixel(3,24,Color.blue); System.out.println(p); } }输出结果Point{x3, y24} 颜色 java.awt.Color[r0,g0,b255]【说明】上面的代码中使用了俩次出现super的情况一种是在构造方法中另外一种在toString方法中super可以表示当前对象的直接父类对象引用通过super还以引用访问父类的属性和方法。什么是toStringhttps://baike.baidu.com/item/toString/9871895https://baike.baidu.com/item/toString/9871895【注意】使用this查找时首先在本类查找在找不到时再到父类和祖先类中去寻找使用super查找匹配方法时首先到直接父类去寻找如果在直接父类中找不到则继续到其祖先类逐级往高层查找。什么是祖先类Java中的祖先类是 ‌Object类‌。它是所有类的根无论是否显式继承最终都会追溯到它什么是多态多态性主要体现在以下两个方面。方法的重载overload。也称参数多态是指在同一个类中定义多个方法名相同但是参数形态有所不同的方法【参数的个数不同参数的位置不同参数的类型不同】。一个类中可以有多个构造方法也叫做构造方法的多态性。子类对父类方法的覆盖override。是因为继承带来的多态子类中对父类的定义的方法重新定义这样在子类中将覆盖来自父类的同形态方法。方法名、形参列表必须和父类保持一致实现子类自己的逻辑方法的重载方法的重载就是在同一个类中存在多个方法名相同但是参数不同的方法。方法调用的匹配处理的原则首先就是按照“精确分配”原则去查找匹配方法如果找不到则按“自动类型转换匹配”原则去查找能匹配的方法。所谓“精确匹配”就是实参和形参类型完全一致。所谓“自动类型转换匹配”是指虽然实参和形参不同但是能将实参的数据按照自动原则赋值给形参。重载代码演示class A{ void test(int x){ System.out.println(test(int):x); } void test(long x){ System.out.println(test(long):x); } void test(double x){ System.out.println(test(double):x); } } public class Test4 { public static void main(String[] args) { A a1new A(); a1.test(5); a1.test(10.0); } }输出结果显示【说明】因为实参5默认是int型的数据因此有test(int x)方法存在时按照“精确匹配”原则处理但如果无该方法存在将按“转换匹配”原则处理原则优先考虑匹配test(long x)方法。【思考】如果将test(long x)和test (int)方法都注释掉那么情况会怎么样答会输出test(double)5.0和test (double) 10.0方法的覆盖子类将继承父类的非私有方法在子类中也可以对父类定义的方法重新定义。这时将产生方法的覆盖。也就是通过子类对象访问的方法就是子类自己重新定义的方法。【注意】子类在重新定义父类己有的方法时应保持与父类完全相同的方法头部声明也就是说应该要与父类具有完全相同的方法名参数列表返回类型一般也要相同。class B extends A{ //将覆盖父类的方法 void test(int x){ System.out.println(B:test(int):x); } //不会覆盖父类的方法 void test(int x,String y){ System.out.println(B:test(int,String):x,y); } }【注意】方法名、参数列表完全相同时才会产生方法的覆盖。返回值类型通常也要一致。方法的覆盖不能改变方法的静态与非静态属性。子类中不能将父类的实例方法定义为静态方法也不允许将父类的静态方法定义为实例方法。不允许子类中方法的访问修饰符比父类的有更多的限制。覆盖代码演示class animal{ private int age; private String name; //生成构造函数 public animal(int age, String name) { this.age age; this.name name; } public int getAge() { return age; } public void setAge(int age) { this.age age; } public String getName() { return name; } public void setName(String name) { this.name name; } public void eat(){ System.out.println(this.getName()正在吃东西); } } class dog extends animal{ public dog(int age, String name) { super(age, name); } Override //对父类animal中的eat方法进行覆盖 public void eat() { System.out.println(this.getName()正在吃狗粮); } } class cat extends animal{ public cat(int age, String name) { super(age, name); } Override public void eat() { System.out.println(this.getName()正在吃猫粮); } }向上转型和向下转型向上转型向上转型实际上就是创建一个子类对象将其当成父类的对象来使用语法格式父类类型 对象名 new 子类类型()向上转型有三种方法直接赋值的向上转型方法传参的向上转型返回值向上转型向上转型的代码演示//父类 动物 class Animal { public String name; public int age; public Animal(String name, int age) { this.name name; this.age age; } public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public Dog(String name, int age) { super(name, age); } public void bark(){ System.out.println(name正在汪汪汪叫); } public void eat(){ System.out.println(this.name正在吃狗粮); } } public class Test { public static void feed(Animal animal){ animal.eat(); } public static Animal getAnimal(){ return new Dog(旺财, 1); } public static void main(String[] args) { //1.直接赋值的向上转型 Animal animal new Dog(旺财, 1); animal.eat(); //2.方法传参的向上转型 Dog dognew Dog(旺财, 1); feed(dog); //3.返回值向上转型 Animal agetAnimal(); a.eat(); } }输出三个旺财正在吃狗粮向上转型的优缺点向上转型的优点让代码实现更简单灵活。向上转型的缺陷不能调⽤到⼦类特有的⽅法。因为编译器之人父类中声明过的方法子类独有的方法父类中没有定义编译器直接报错。向下转型向下转型将父类引用再还原为子类对象。【注意】向下转型⽤的⽐较少⽽且不安全万⼀转换失败运⾏时就会抛异常。Java中为了提⾼向下转型的 安全性引⼊了 instanceof如果该表达式为true则可以安全转换。向下转型的代码演示class Animal { public String name; public int age; public Animal(String name, int age) { this.name name; this.age age; } public void eat(){ System.out.println(name正在吃饭); } } //子类 狗 class Dog extends Animal{ public Dog(String name, int age) { super(name, age); } public void bark(){ System.out.println(name正在汪汪汪叫); } public void eat(){ System.out.println(this.name正在吃狗粮); } } public class Test { public static void main(String[] args) { Animal anew Dog(旺财,1); if(a instanceof Dog){ //如果a时Dog才会强转 Dog d(Dog)a; d.bark(); } else{ System.out.println(不是Dog类型不能被强转); } }什么是Java在的instanceof多态的优点优点能够降低代码的 圈复杂度, 避免使⽤⼤量的 if - else可扩展能⼒更强
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

superpowers使用指南:从安装配置到Java项目实战的完整教程 2026/10/2 8:14:43

superpowers使用指南:从安装配置到Java项目实战的完整教程

1. 从“superpowers”这个热词说起:它到底是什么第一次看到“superpowers”这个词,很多人会下意识地以为是某个超级英雄题材的游戏或者影视作品。但如果你最近在开发者社区、技术群或者代码托管平台上频繁刷到它,那基本可以确定,你…

阅读更多 →
Codex 安装配置与排错全指南:从 CLI 到代理接入的实战经验 2026/10/2 8:14:43

Codex 安装配置与排错全指南:从 CLI 到代理接入的实战经验

1. 从重度使用者的视角重新认识 Codex1.1 为什么我最终把 Codex 留在了主力工具链里我大概是从 Codex 刚开放 CLI 那阵子就开始折腾的,中间换过不少同类工具,也踩过一堆坑,最后能长期留在主力工作流里的,Codex 算一个。原因不复杂…

阅读更多 →
Hermes v0.10.0工具网关全解:架构拆解与实战配置 2026/10/2 8:14:43

Hermes v0.10.0工具网关全解:架构拆解与实战配置

1. 工具网关整体设计思路拆解1.1 为什么v0.10.0突然需要“网关”Hermes走到v0.10.0,重点已经不是“能不能调用工具”,而是“调用多少工具、多少种工具、怎么编排工具”。早期版本里,每个工具都是直连式调用——脚本里写死工具名、参数结构、返…

阅读更多 →
VC++6.0 MFC从入门到实战:消息映射、控件与避坑指南 2026/10/2 8:14:43

VC++6.0 MFC从入门到实战:消息映射、控件与避坑指南

简介:VC6.0 MFC入门学习资料面向已有C/C基础、准备踏入Windows界面开发的初学者,围绕学习路径和核心机制两条线展开。文档首先给出如何学好VC的实用建议,强调字符界面程序练习、使用Help Online、阅读他人代码以及参考书选择原则;…

阅读更多 →
GitHub Trending榜单一览:热点项目点评与必备实操指南 2026/10/2 8:14:36

GitHub Trending榜单一览:热点项目点评与必备实操指南

每天早上打开GitHub Trending看一眼日榜,已经成了我这几年的例行功课。2026年9月29日这一期的热度分布很有意思:机器人遥操作、量化交易MCP协议、3D高斯泼溅、AI技能市场、生活方式知识库……各条赛道都有代表性项目在冒头。这篇文章我不打算简单罗列&qu…

阅读更多 →
ESXi 7.0手动注入LSI 9260-8i驱动实战指南 2026/10/2 8:14:36

ESXi 7.0手动注入LSI 9260-8i驱动实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉