java基础之组合和继承

news2024/12/28 20:14:56

为了避免重复代码太多,导致代码不好维护,大家需要学会如何复用代码,代码复用的两种方式,组合和继承

组合:在新类中创建现有类的对象 has-a 继承:创建现有类的新类 is-a 依赖:uses-a

UML关系
UML关系

继承

继承使用的关键字是extends,Object是所有类的父类,在Java中每个类都是由Object扩展来的,如果没有明确地指出父类,Object就被认为是这个类的父类

继承中的构造方法调用

子类在自己的构造方法调用父类构造方法时可以使用super(参数列表)来调用,注意在调用时要写在构造方法的第一行

super的作用
  • 调用父类的方法
  • 调用父类的构造器

多态

存在多态的必要条件

  • 继承
  • 方法重写
  • 父类引用指向子类对象
向上转型
class Instrument {
    public void play() {
  System.out.println("Instrument.play()");
    } 
}

public class Wind extends Instrument {
 public void play() {
  System.out.println("Wind.play()");
    }
}

public class Music {
 
 public static void tune(Instrument i){
  i.play();
 }
 public static void main(String[] args) {
        Wind flute = new Wind();
        Music.tune(flute); // 向上转型
    }
}

从一个更具体的类型转化为更一般的类型,所以向上转型用法是安全的。子类可能会比父类包含更多的方法,必须至少具有和父类一样的方法。

instanceof

可以在进行类型转换时使用instanceof来判断该对象是否属于该类或者该类的子类,以此来进行强转,调用该类所特有的方法

// 获取父类的泛型
if(superType instanceof ParameterizedType){ // 如果存在泛型
    Type[] actualTypeArguments = ((ParameterizedType) superType).getActualTypeArguments();
}
方法绑定

对于上述向上转型的例子,编译器如何知道该调用哪个方法,方法的入参只是一个Instrument引用?
java采用后期绑定,在运行时根据对象的类型进行绑定,在运行时判断对象的类型,从而调用方法,在编译时编译器不知道对象的类型,java对于static和final方法无法采用后期绑定(private方法也是隐式的final)

调用的过程
  • 编译器查看对象的声明类型和方法,此时会一一列举出该类以及父类中名称为方法名的方法(父类的私有方法不可访问)
  • 编译器查看调用方法时提供的参数类型
  • 如果是private方法、static方法、final方法或者构造器,那么编译器可以准确地知道应该调用哪个方法,这种调用方式称为静态绑定;如果调用的方法依赖于隐式参数的实际类型,并且在运行时实现动态绑定
  • 当程序运行,并且采用动态绑定调用方法时,虚拟机一定调用所引用对象的实际类型最适合的那个类的方法

由于每次调用方法都要进行搜索,时间开销较大,所以虚拟机预先为每个类创建了一个方法表,其中列出了所有方法的签名和实际调用的方法

多态的陷阱

注:多态只是针对于普通方法,对于实例变量和静态方法不会存在多态
实例变量在编译时就会被解析

public class Parent {
    public int field = 0;

    public int getField(){
        return field;
    }
}

public class Child extends Parent {
    public int field = 1;

    @Override
    public int getField(){
        return field;
    }
}

public class TestField {
    public static void main(String[] args) {
        Parent parent = new Child();

      // 0
      System.out.println("parent.field= "+parent.field);
// 1
      System.out.println("parent.getField= "+parent.getField());
        Child child = new Child();
      // 1
      System.out.println("child.field= "+child.field);
// 1
      System.out.println("child.getField= "+child.getField());
    }
}

执行结果

parent.field= 0
parent.getField= 1
child.field= 1
child.getField= 1

Parent.field和Child。field被分配了不同的存储空间,Child其实是存在两个filed属性的:本身的以及父类的,但是在引用Child的field的时候,默认的field属性是来自于本身的,如果要获取父类的该实例变量,需要使用super.field来显示地指定获取父类实例变量

对象的实例变量的值取决于声明该变量所用的类型

但是这种情况一般不会发生,首先实例变量一般来说都是私有private的,其次子类和父类一般也不会起相同的实例变量名字

对于静态方法的话,静态方法只与类关联,与对象无关

https://zhhll.icu/2020/java基础/面向对象/5.java基础之继承/

本文由 mdnice 多平台发布

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

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

相关文章

Tailwind CSS浅析与实操

Tailwind CSS 一、Tailwind CSS简介 What is Tailwind CSS Tailwind CSS| TailwindCSS中文文档 | TailwindCSS中文网官方解释:只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。本质上是一个工具集,包含了大量类似 fle…

nginx动态分离(四)

概述 动静分离把静态文件放入nginx或者说服务器的某个文件夹,这里把文件放入服务器的根目录下/data ,创建一个test目录,这样就直接访问到test目录下的静态文件 [121.4.170.108/test/b.html] demo #user nobody; worker_processes 1;#error_log log…

没有苹果本也可以构建ios版本+生成不同设备效果图——香蕉云编

三年前,我曾经写过uniapp的程序,时隔三年,又遇到了uniapp的需求,之前没有自行申请ios证书,现在终于要自己生成证书了。。。 是福不是祸,是祸躲不过。 uniapp生成ios证书的详细步骤 uniapp对接unipush的操作…

一文搞懂Transformer的边角料知识:位置编码

目录 一、为什么需要位置编码 二、位置编码分类 1.表格型 2.函数型 三、Transformer的位置编码 1.位置编码应有的特点 2.Transformer的位置编码公式 3.三角函数 4.线性相关 5.相对位置关系 四、总结 一、为什么需要位置编码 在Transformer出现以前,NLP任…

白话教你认识 Kafka,秒懂原理

一、Kafka 基础 消息系统的作用 应该大部份小伙伴都清楚,用机油装箱举个例子 所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。 引入一个场景,我们知道中国移动,中国联通&#x…

谷歌浏览器从c盘剪切到d盘书签消失的找回方式

目录 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 2.我们只需要将上述的两个文件Bookmarks和Bookmarks.bak先备份到一个地方,替换文件: 3.重启谷歌浏览器 1.在以下路径找到这两个文件(Bookmarks和Bookmarks.bak) 移动后的新路径\Google\C…

vue自行封装错误提示信息——$message——技能提升

在使用vue的过程中,我们经常用到的是这一种的提示信息: 该组件提供的属性有以下几个: 但是,如果想要自定义提示信息,则可以使用下面的方式来处理: 1.自定义提示信息组件 import Vue from vue export fu…

Linux基本指令二

Linux基本指令二 一、more指令1、语法2、功能3、常用操作 二、less指令1、语法2、功能3、常用选项4、常用操作 三、head指令1、语法2、功能3、常用选项4、示例 四、tail指令1、语法2、功能3、常用选项4、示例 五、date指令1、语法2、功能3、常用的标记4、设置时间5、时间戳6、示…

VxeTable 表格组件推荐

VxeTable 表格组件推荐 https://vxetable.cn 在前端开发中,表格组件是不可或缺的一部分,它们用于展示和管理数据,为用户提供了重要的数据交互功能。VxeTable 是一个优秀的 Vue 表格组件,它提供了丰富的功能和灵活的配置选项&…

linux上negix部署静态页面

1.看配置文件 进入cndf.d 这里的是配置部署项目中的文件 进入一个查看下 上面的是服务的域名,服务是http://test.fun-med.cn/#/,后面加服务名(你的前端) 2.看下页面位置 和上面的路径要匹配

IDEA工具的 CTRL + Shift + F 全局搜索失效

失效原因:快捷键冲突,与输入法默认的简繁体切换快捷键冲突了。 解决方式: 1、微软输入法 1.1 、任务栏 – 微软任务 – 语言首选项 1.2、微软拼音 – 选项 1.3、按键 – 热键(简体/繁体中文输入切换)关闭或修改 …

华为云CodeArts Check代码检查插件(VSCode IDE版本)使用指南

CodeArts Check VSCode IDE代码检查插件 本插件致力于守护开发人员代码质量,成为开发人员的助手和利器。秉承极简、极速、即时看护的理念,提供业界规范(含华为云)的检查、代码风格一键格式化及代码自动修复功能。 感兴趣的小伙伴…

并网型虚拟同步发电机控制仿真(Matlabsimulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间

【Python_PyQtGraph 学习笔记(八)】基于PyQtGraph将X轴坐标设置为系统时间 前言正文1、获取plotItem的bottom轴对象2、设置刻度值,即获取时间3、刻度值与显示数值绑定4、设置bottom轴的刻度数值显示前言 基于PySide2、PyQtGraph和PySide2动态绘图,将X轴坐标设置为系统事件…

Linux 实践项目之论坛搭建

目录 一、思路 1、环境搭建(lamp--Linux apache mysql php ) 2、关闭防火墙SELinux启动服务 3、将论坛源代码上传至/var/www/html路径下 4、设置MySQL数据库名称和密码 5、浏览器上搭建Discuz论坛 二、实操 1、安装 2、关闭防火墙SELinux启动服务…

Activiti工作流引擎详解与应用

一、简介 Activiti是一个开源的工作流引擎,基于BPMN2.0标准进行流程定义。它可以将业务系统中复杂的业务流程抽取出来,使用专门的建模语言BPMN2.0进行定义,业务流程按照预先定义的流程进行执行,实现了系统的流程由Activiti进行管…

第三节:AntDisgn安装与导入

AntDisgn官网 1.安装:npm install -g vue/cli或者 yarn global add vue/cli 2.导入(我这进行的是全局使用在main.js里边进行配置) import { createApp } from vue import ./style.css import App from /App.vue import router from /router/index 导入路由 import …

18369-2022 玻璃纤维无捻粗纱 课堂随笔

声明 本文是学习GB-T 18369-2022 玻璃纤维无捻粗纱.pdf而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了玻璃纤维无捻粗纱(以下简称"无捻粗纱")的分类和标记、技术要求、试验方法、检验 规则、标志、包装、运输和储存。…

unity脚本_MonoBehaviour c#

在MonoBehaviour里可以获取: 自己物体身上的属性 和 位置 及 其他类物体身上的属性 和 位置 this.gameObject.属性 this.transform.position this.transform.eulerAngles this.transform.lossyScale 如果是其他类 需要创建一个类对象 然后用类对象去 点 另外…

DRM全解析 —— encoder详解(1)

本文参考以下博文: Linux内核4.14版本——drm框架分析(3)——encoder分析 特此致谢! 1. 简介 encoder是编码器/输出转换器,负责将CRTC输出的timing时序转换成外部设备所需要的信号,如HDMI转换器或DSI Controller。 具体来讲&a…