Java 三大特性之继承

目录

一、为什么需要继承?

二、继承概念

三、继承的语法

四、子类访问父类成员

五、super关键字

六、继承关系下的构造方法

七、继承关系下的初始化

八、protected关键字

 九、继承的三种方式

十、final关键字 

十一、继承和组合


一、为什么需要继承?

比如狗和猫,他们都是一个动物,吃饭睡觉是他们的共性,如果你单独写狗类和猫类,会有大量的代码重复

//Cat.java
public class Cat{public String name;public void eat(){System.out.println(name + "正在吃饭"); }public void sleep(){System.out.println(name + "正在睡觉");}void say(){System.out.println(name + "喵喵~");}
}//Dog.java
public class Dog{public String name;public void eat(){System.out.println(name + "正在吃饭");}public void sleep(){System.out.println(name + "正在睡觉");}void say(){System.out.println(name + "汪汪~");}
}

那能否将这些共性抽取呢?

面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用


二、继承概念

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加新功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构, 体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用

上述图示中,Cat和Dog都继承了Animal类,其中:Animal类称为 父类/基类或超类,Cat和Dog可以称为Animal的 子类/派生类,继承之后,子类可以复用父类中成员,子类在实现时只需关心自己新增加的成员即可。 


三、继承的语法

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

重写上面那个例子 

//Animal.java
public class Animal {public String name;public void eat(){System.out.println(name + "正在吃饭");}public void sleep() {System.out.println(name + "正在睡觉");}
}//Cat.java
public class Cat extends Animal{void say(){System.out.println(name + "喵喵~");}
}//Dog.java
public class Dog extends Animal{void say(){System.out.println(name + "汪汪~");}
}//Test.java 
public class Test {public static void main(String[] args) {Dog dog = new Dog();dog.name = "小狗";//Dog类从Animal类继承下的成员变量System.out.println(dog.name);//Dog类从Animal类继承下的方法dog.eat();dog.sleep();//这是个性的方法dog.say();}
}

【注意】

  1. 子类会将父类中的成员变量或者成员方法继承到子类中了
  2. 子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了

四、子类访问父类成员

子类中访问父类的成员变量或者成员方法

(1)子类和父类 不存在 同名成员

先访问子类再访问父类,没有就报错!

(2)子类和父类 存在 同名成员

访问子类自己;

【注意】

  • 成员方法重名,但是参数列表不同(方法重载),根据调用方法时传递的参数选择合适的方法访问,如果没有则报错;

可以看到,如果子类和父类存在同名,怎么才能在子类中访问父类相同名称的成员呢?


五、super关键字

该关键字主要作用:在子类方法中访问父类的成员。

【注意】

  1. 只能在非静态方法中使用
  2. 在子类方法中,访问父类的成员变量和方法。
//A.java
public class A{int a ;void methodA(){//...}void methodB(int a){//...}
}//B.java
public class B extends A{int a ;//与父类中methodA()构成重写void methodA(){//...}//与父类中methodB()构成重载(参数列表不同)void methodB(){//...}void methodC(){ //在子类方法中访问父类成员//通过super关键字访问父类成员super.a = 111;super.methodA();//直接可以通过参数列表区分清访问父类还是子类方法methodB();    //子类methodB(20);    //父类}
}

六、继承关系下的构造方法

子类对象构造时,需要先调用父类构造方法,然后执行子类的构造方法

//A.java
public class A{public A(){System.out.println("父类构造方法");}
}//B.java
public class B extends A{public B(){System.out.println("子类构造方法");}
}//Test.java
public class Test{public static void main(String[] args) {B b = new B();    //实例化对象,调用构造方法}
}//输出
//父类构造方法
//子类构造方法

 【注意】

  1. 若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法
  2. 如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的 父类构造方法调用,否则编译失败。
  3. 在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。
  4. super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

七、继承关系下的初始化

没继承关系下的执行顺序:静态代码块 > 实例代码块 > 构造方法 

有继承关系下的执行顺序:

//A.java
public class A{public A(){System.out.println("父类构造方法");}{System.out.println("父类实例代码块");}static{System.out.println("父类静态代码块");}}//B.java
public class B extends A{public B(){System.out.println("子类构造方法");}{System.out.println("子类实例代码块");}static{System.out.println("子类静态代码块");}
}//Test.java
public class Test{public static void main(String[] args) {B b1 = new B();    //实例化第一个对象System.out.println("===========");B b2 = new B();    //实例化第二个对象}
}

【结论】

  1. 父类静态代码块优先于子类静态代码块执行,且是最早执行
  2. 父类实例代码块和父类构造方法紧接着执行
  3. 子类的实例代码块和子类构造方法紧接着再执行
  4. 第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

八、protected关键字

//A.java
package demo1;
public class A {public int x;protected int y;
}//C.java
package demo2;
import demo1.A;
public class C extends A{public static void main(String[] args) {C c = new C();c.x = 20;c.y = 10;}
}//B.java
package demo2;
public class B {public static void main(String[] args) {//因为B和A不是父子关系,得通过C这个A的子类来访问父类成员,建立关系//B的意义就是代表 不同包中的类C c = new C();    System.out.println(c.x);//protected 不能在不同包中的非子类直接访问//c.y = 100;}
}

 九、继承的三种方式


十、final关键字 

final关键可以用来修饰变量、成员方法以及类。

(1)修饰变量或字段,表示常量(即不能修改)

(2)修饰类:表示此类不能被继承

//A.java
public final class A{    //final 修饰//...
}//B.java
public class B extends A{  //报错//...
}

 (3)修饰方法:表示该方法不能被重写(后序介绍)


十一、继承和组合

组合可以实现类似多继承的效果,但是和多继承是不一样的喔!

继承表示对象之间是 is-a 的关系,比如:狗是动物,猫是动物

组合表示对象之间是 has-a 的关系,比如:汽车

汽车和其轮胎、发动机、方向盘、车载系统等的关系就应该是组合,因为汽车是有这些部件组成的。

class Tire{ //轮胎//...
}
class Engine{   //发动机//...
}
//方向盘类...
class Car{  //将上面的类组合到一起private Tire tire;  //可以复用轮胎的成员private Engine engine;  //可以复用发动机的成员//...
}//比亚迪是汽车
class BYD extends Car{//将汽车中包含的:轮胎、发送机等都继承下来
}

组合和继承都可以实现代码复用,应该使用继承还是组合,需要根据应用场景来选择,一般建议:能用组合尽量用组合。


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

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

相关文章

C语言——rand函数

一、rand函数 这是一个在 C 标准库 <stdlib.h> 中定义的函数&#xff0c;用于生成伪随机数&#xff0c;默认情况下&#xff0c;它生成从 0 到 RAND_MAX 的伪随机数&#xff0c;其中 RAND_MAX 是一个常数&#xff0c;通常是 32767。 1、函数原型&#xff1a; 2、函数返回…

k8s Dashboard 运维维护记录

k8s Dashboard 运维维护记录 k8s Dashboard 运维维护记录 Q1&#xff1a;需要使用firefox浏览器访问 提示了证书错误NET::ERR_CERT_INVALID&#xff0c;原因是由于物理机的浏览器证书不可用 需要注意的是&#xff0c;若提示“连接不安全”的警告时&#xff0c;点击“高级”…

SAP保税区业务方案

1. 保税区背景&#xff1a; 是经国务院批准设立的、海关实施特殊监管的经济区域&#xff0c;是我国目前开放度和自由度最大的经济区域。其功能定位为“保税仓储、出口加工、转口贸易”三大功能。根据现行有关政策&#xff0c;海关对保税区实行封闭管理&#xff0c;境外货物进入…

05 - 步骤 JSON output

简介 JSON Output 步骤用于将 Kettle 中的行流数据写出到 JSON 格式的文件或流中。它允许用户将 Kettle 中处理过的数据以 JSON 格式进行输出&#xff0c;适用于各种数据处理和交换场景。 什么是行流数据&#xff1f; preview data 中的每一个字段都是一个行流数据 使用 场…

www.fastssh.com SSH over WebSockets with CDNs

https://www.fastssh.com/page/create-ssh-cdn-websocket/server/这其实不是标准的websocket报文(服务器响应报文无Sec-Websocket-Accept字段)&#xff0c;所以无法使用github.com/gorilla/websocket包&#xff1a;GET / HTTP/1.1 Host: hostname:8080 User-Agent: Go-http-cli…

ubuntu20配置深度学习环境

目录 系统环境安装anaconda文件的安装anaconda环境配置anaconda换中科大源常用的anaconda命令 安装显卡驱动安装CUDA下载cudnn安装pytorch更换conda源选择对应的pytorch版本进行安装 系统环境 ubuntu20&#xff0c;安装了ros noetic。 参考博客主要有&#xff1a; https://g…

javascript 练习 写一个简单 另类录入 电脑组装报价表 可打印

数据格式 &#xff08;1代表cpu、2代表主板、3代表内存、。。。&#xff09; 1i3 12100 630 2H610 480 3DDR4 3200 16G 220 4500G M.2 299 5300W电源 150 6小机箱 85 7GT 730G 4G 350 8WD 2T 399 9飞利浦 24Led 580 主代码 Html JS <!DOCTYPE html> <html lang&qu…

Python学习笔记------pycharts模块

pyecharts模块简介 Echarts是个由百度开源的数据可视化&#xff0c;凭借着良好的交互性&#xff0c;精巧的图表设计&#xff0c;得到众多开发者的认可&#xff0c;而python是门富有表达力的语言&#xff0c;很适合用于数据处理&#xff0c;当数据分析遇上数据可视化时pyechart…

EPAI手绘建模APP演示板、材质编辑器、样式编辑器

(11) 更多 图 74 更多工具栏 ① 演示板&#xff1a;打开关闭演示板。演示板用来显示从设备导入的模型图纸图片或者打开模型建模教程网页&#xff0c;是建模过程中一个辅助功能。有些设备有小窗口功能有些没有&#xff0c;对于没有小窗口功能的设备&#xff0c;通过演示板能够在…

Boosting算法揭秘:从原理到scikit-learn实战

Boosting算法揭秘&#xff1a;从原理到scikit-learn实战 在机器学习的江湖中&#xff0c;Boosting算法以其强大的预测能力和独特的训练方式占据了一席之地。与Bagging算法并行训练的理念不同&#xff0c;Boosting算法更注重模型的串行迭代和错误修正。本文将从Boosting算法的基…

一键自动化博客发布工具,chrome和firfox详细配置

blog-auto-publishing-tools博客自动发布工具现在已经可以同时支持chrome和firefox了。 很多小伙伴可能对于如何进行配置和启动不是很了解&#xff0c;今天带给大家一个详细的保姆教程&#xff0c;只需要跟着我的步骤一步来就可以无障碍启动了。 前提条件 前提条件当然是先下…

ios app 之 中国大陆 ICP备案问题

从2024年3月份起&#xff0c;上传到苹果商店&#xff08;app store connect&#xff09;中的app, 若使用地区中选择了 亚太地区 - 中国大陆&#xff0c; 则需要上传 中国大陆 app 的ICP备案&#xff0c;下面是对本人对备案的实操及理解&#xff1a; 1) ICP备案与 app store co…

设计模式——行为型模式——策略模式

策略模式 定义 策略模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。 策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开来&a…

uniapp+vue基于移动端的药品进销存系统r275i

最后我们通过需求分析、测试调整&#xff0c;与药品进销存管理系统管理系统的实际需求相结合&#xff0c;设计实现了药品进销存管理系统管理系统。 系统功能需求包含业务需求、功能需求用户需求&#xff0c;系统功能需求分析是在了解用户习惯、开发人员技术和实力等各个因素的前…

【Conda】解决无名虚拟环境问题

文章目录 问题描述&#xff1a;无名虚拟环境解决步骤1 添加虚拟环境目录到envs步骤2 成功命名 问题描述&#xff1a;无名虚拟环境 如果不指定创建目录&#xff0c;默认创建在C盘用户目录下&#xff0c;这应该是很多人不愿意的吧。 指定目录创建虚拟环境命令如下&#xff1a; …

【微服务】——Docker 基础知识

这里写自定义目录标题 1.1 了解Docker1.1.1应用部署的环境问题1.1.2.Docker解决依赖兼容问题1.1.3.Docker解决操作系统环境差异1.1.4.小结 1.2.Docker和虚拟机的区别1.3.Docker架构1.3.1.镜像和容器1.3.2.DockerHub1.3.3.Docker架构1.3.4.小结 1.4.安装Docker——未实践 2.Dock…

使用Python和Pygame创建一个简单的飞机大战游戏 [附源码]

在这个数字化时代&#xff0c;游戏已经成为我们生活中不可或缺的一部分。从经典的街机游戏到现代的3D游戏&#xff0c;游戏行业经历了巨大的变革。然而&#xff0c;有时候&#xff0c;简单的游戏反而能够带来更多的乐趣和满足感。在本篇文章中&#xff0c;我们将使用Python和Py…

Vue 组件间的数据绑定

在Vue组件中&#xff0c;v-model指令可以用来实现双向数据绑定。它用于将组件的属性和父组件中的数据进行双向绑定&#xff0c;使得当属性的值改变时&#xff0c;父组件中的数据也会相应地改变&#xff0c;并且当父组件中的数据改变时&#xff0c;属性的值也会相应地改变。 目…

多级留言/评论的功能实现——SpringBoot3后端篇

目录 功能描述数据库表设计后端接口设计实体类entity 完整实体类dto 封装请求数据dto 封装分页请求数据vo 请求返回数据 Controller控制层Service层接口实现类 Mapper层Mybatis 操作数据库 补充&#xff1a;返回的数据结构自动创建实体类 最近毕设做完了&#xff0c;开始来梳理…

WPF应用程序XAML

当WPF应用程序创建好后&#xff0c;系统会自动添加一个Grid控件到窗体上&#xff0c;通过Grid控件能够方便地对界面进行布局.下面代码中为Grid控件添加了两行两列&#xff0c;分别用RowDefinitions属性ColumnDefinitions属性表示行的集合和列的集合&#xff0c;集合中有RowDefi…