深入理解Java类和对象的关系

如果要说清楚对象和类的关系,不可避免的要提到C++,因为Java从时间线上来说,是C和C++之后的一门语言,很多Java Coder 也是因为厌烦了C++的一些特性,进而从事于Java开发的,所以以下内容会利用C++的一部分知识来对比,但是所需知识很低,只要学习过一部分C语言就可以理解。

image-20240126115456039

概念层面:

类是构建对象的模板或蓝图【这个概念只需要有个印象即可,不需要多余的思考和研究】

理解层面:

1)静动角度

对于类和对象产生模糊或者概念不清楚的主要原因:就是因为对类和对象的静态和动态在不同情况下的区别不清楚。大家在学习Java 的时候绝大多数情况直接学习语法,在类中直接new 对象,这种就导致直接模糊了 类代码和类对象的概念。

学习过映射和类加载器的朋友们都知道,类在虚拟机中是以类对象的形式存在的,从理解的角度就可以这样说,类本身也是一个对象,这是在动态的情况下,什么是动态的情况,就是在程序运行的过程中。但是在静态的情况下,类是以文件或者说代码的形式被编写的,这是混淆的根源。

不去掺杂过多的东西,用一句话去说就是:类在编写时是静态的代码,在程序运行时在虚拟机中是动态的对象。

那么什么叫做动态的对象?

对象都是new 出来的,直接的感觉他像是一个盒子,盒子有名字,被装了数据,如果详细的去区分,对象动态的”体现形式“可以说成是三个角度:状态,行为,和标识。

在动态的情况下,状态这个词可以理解为:某一个时刻对象的情况,这个情况体现在对象此刻实例变量的数据是的多少。就是说这个瞬间,切片中对象中的数据是多少。

行为这个词很好理解,就是对象做了什么,说白了就是他的方法。

而标识则是说如何辨别有相同行为相同状态的不同对象。

这个三个角度在静态时如何体现??

就是类在定义时的实例变量,方法,和equals方法,但是这里因为没有对象,所以不能称为对象

将静动两态的对象和类连接起来靠一个概念:类其实是一个特殊的对象类型。

我们说了类在虚拟机中动态的存在形式也是以对象的形式,所以可以通过类名来调用静态的方法和变量,因为类本身作为一个对象就已经存在在了虚拟机中,所以可以直接调用。

而对象在没被创建前,并不存在,不具有动态的特性,而当new 的代码被调用时,就会根据它所基于类对象的状态和行为数据:具有什么变量?具有什么方法?来创建一个实例,从此对象就被创建出来,拥有了动态性。

2)抽象具体角度

换个角度去说,对象是类的实例,类没有状态,行为也不会被触发,但是一旦实例化,类就有了状态,方法就可以被调用

3)类类关系

类和类之间的关系可以直接用三个词描写,可在静态的思维下理解:

user-a:调用访问其他类

has-a:w2内含其他类,如作为变量

is-a:继承

在动态的情况下,对象也是这样的关系。

4)封装:

相对于OOP三大基本特性其他两个:继承和多态,封装其实我认识是最重要的概念。

对于封装初步在理解的时候就是privat 一个variable 然后设置get和set方法,为什么要这样做,有个大概的想法,就是不让其他的对象直接获取数据,修改数据,限制其他类的调用和使用,仅此而已,但这只是封装的体现形式,他有更深层次的含义。

我们考虑3个情况:

1)如果没有对实例变量进行private 修饰,那么多个线程在操作这个对象的时候,就会出现读后写或者写后读的矛盾问题。那么即使是要做线程安全的处理,就需要将整个类进行线程安全,但如果限制使用只能通过set和get方法,那么只需要方法进行线程安全的处理。

2)如果我们自己写出一个Util ,提供给其他程序员使用,创建Util 对象时,内部的两个变量被赋值,且在用户操作方法时需要调用,如果不设置成private,用户就会直接修改这个变量,导致方法调用与预期不同,进而导致调试困难。

3)如果我们自己写一个Util,提供给其他程序员使用,只给外部提供两个方法,但是内部需要若干变量和方法,比如一个算法必须分成三个方法,而我们不希望外界去调用到这些变量和方法就可以将他设置为private

也就是说,我们作为代码的设计者,代码多数情况不只是给我们用的,而是会提供给别人,为了让他们通过固定的方式调用,所以需要封装。

其次封装还代表着我们可以限制给固定的人调用:通过访问修饰符的形式,将方法限制在固定范围内,范围之外人不可调用方法,进一步保证了安全性。

同时作为代码的设计者,我们在向外提供代码让别人使用时,实际开发过程中别人只需要知道,传入什么参数,获得什么结果即可,具体的实现过程可以向外隐藏,如:

在Service 层向外提供服务接口的时候,具体Service实现类中使用的是JDBC还是Mybatis都与调用者无关,换个角度在持久层向上提供服务的时候,我的持久层使用的是什么类型的数据库,调用者也不需要知道。

即:通过封装隐藏实现细节,实现黑盒模型。

其实这本身也是低耦合和高内聚的实现要求即:仅暴露少量的接口给外部和数据操作细节自己完成,不允许外部干涉

综上封装的作用就体现在了:

  1. 安全性

  2. 隐藏实现细节

  3. 统一接口

  4. 便于修改代码

5)变量和对象

初学者在学习Java的时候经常会混淆这个概念,但是学C语言的时候却不会混淆这个概念,因为C语言中有一个特殊的东西:指针,进而就会产生疑问:Java是通过什么方式进行参数传递的?

常见的传递方式是两种:按值传递和按引用传递

而Java总是采用按值传递,获得的是参数的拷贝【这句话总是容易引起歧义】具体要看两个角度:

  1. 1.在传递类型是基本类型:int,double时,方法定义的是局部变量,所以无法修改传入参数的值,只能以返回值的方式修改参数。

    private int increase(int x){
    	x =x+1;
        ruturn x;
    }
    private void test(){
        int x = 1;
        this.increase(x); 
        //x 为1
        x = this.increase(x);
        //x 为2
    }
    
  2. 2.在传递的参数为对象类型,如Student 的实例s1,传入时在方法中修改对象却可以修改数值,这因为在传入的参数中,传入的是对象的引用,这里并不是说拷贝创建了一个新的对象,而是将对象的引用赋值给了局部变量,所以操作的还是原对象:

    public void increase(Student s1){
        int temp = s1.getX();
        temp++;
        s1.setX(temp);
    }
    //x = 2
    

    这段代码在C++中其实应是传入一个对象的引用指针

    public void increase(Student& s1)
    

这里回到主题,Student student 这里的student不是对象,只是一个变量,只有当student 变量真正引用到一个student类型的对象时,它才能代表这个对象,这样就能理解空指针异常。

本篇关键词:静动关系,状态和行为,封装限制,变量不等于对象

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Mac+Android Studio配置 Flutter环境

Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…

【C/C++】C/C++编程——第一个 C++ 程序:HelloWorld

第一个 C 程序:HelloWorld 大家好,我是 shopeeai,也可以叫我虾皮,中科大菜鸟研究生。昨天我们成功搭建好了 C 的开发环境,今天我们来介绍一下第一个 C 程序,打印一个"hello world"。首先我们先贴一下示例代…

Linux(linux版本 centos 7) 下安装 oracle 19c详细教程(新手小白易上手)

一、安装前准备 1、下载预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm预安装包下载成功 2、下载oracle安装包 下载地址如下 https://www.oracle.com/cn/database/technologies…

Python 正则分割字符串并提取匹配的记号和关键词

需求是:原字符串内含有特殊记号,比如"V_{CC} V_{DD}",其中_{CC} 是latex 的下标语法,实际显示出来是下面这样: V C C V D D V_{CC} V_{DD} VCC​VDD​ 现在要把下标部分提取出来,并把原字符串…

Python之数据可视化基础

目录 一 JSON数据格式转换 二 pyecharts模块 三 Pyecharts入门 四 数据可视化之疫情折线图 一 JSON数据格式转换 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它以易于阅读和编写的方式来表示结构化数据。JSO…

构建未来学堂:在线教育系统开发技术实践

在当今数字化时代,在线教育系统的开发越发显得至关重要。本文将带你深入了解在线教育系统的开发,涉及到关键的技术实践和代码示例。我们将采用现代化技术栈,为未来学堂的搭建提供实用的指南。 技术栈选择 在开始实际的开发之前&#xff0c…

在IDEA中创建SpringBoot项目

概述 SpringBoot是由Pivotal团队提供的全新的框架,其设计的目的是用来简化Spring应用的初始搭建以及开发过程。 传统方式构建Spring应用程序 导入依赖繁琐 依赖冲突 项目配置繁琐 SpringBoot特性 1、起步依赖 本质上就行一个Maven坐标,整合了完成一…

虚幻UE 插件-像素流送实现和优化

本笔记记录了像素流送插件的实现和优化过程。 UE version:5.3 文章目录 一、像素流送二、实现步骤1、开启像素流送插件2、设置参数3、打包程序4、打包后的程序进行像素流参数设置5、下载NodeJS6、下载信令服务器7、对信令服务器进行设置8、启动像素流送 三、优化1、…

机电制造ERP软件有哪些品牌?哪家的机电制造ERP系统比较好

机电制造过程比较复杂,涵盖零配件、采购、图纸设计、工艺派工、生产计划、物料需求计划、委外加工等诸多环节。而供应链涉及供应商的选择、材料采购价格波动分析、材料交货、品质检验等过程,其中某个环节出现问题都可能会影响产品交期和经营效益。 近些…

设计模式_组合模式_Composite

案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 【传统方式】 将学院看做是学校的子类,系是学院的子类,小的组织继承大…

第2章 信息技术发展——2.1 信息技术及其发展

文章目录 2.1 信息技术及其发展2.1.1 计算机软硬件2.1.2 计算机网络1.网络标准协议1)OSI2)IEEE802协议族3)TCP/IP 2.软件定义网络3.第五代移动通信技术 2.1.3 存储和数据库1.存储技术2.数据结构模型1)层次模型2)网状模型3)关系模型 3.常用数据库类型1)关系型数据库2)非关系型数…

Docker镜像的创建

基于现有镜像创建 先用现有镜像创建启动容器 docker run 再进入容器进行内容更新 docker exec -it 最后提交成新的镜像 docker commit 然后将修改后的容器提交为新的镜像,需要使用该容器的 ID 号创建新镜像 进入容器可查看相关性能 基于本地模板创…

【软考上岸-备考系统集成项目管理工程师1】

文章目录 今日座右铭:最好的偷懒方式,就是一次做好。 文章目录 文章目录前言一、系统集成项目管理工程师作用二、系统集成项目管理工程师报名要求三、软考报名流程四、教材参考说明总结 前言 计算机信息系统集成项目管理师对应资格考试名称:…

FPGA高端项目:Xilinx Zynq7020系列FPGA多路视频拼接 工程解决方案 提供6套工程源码和技术支持

目录 1、前言版本更新说明给读者的一封信FPGA就业高端项目培训计划免责声明 2、相关方案推荐我已有的FPGA视频拼接叠加融合方案本方案在Xilinx Kintex7 系列FPGA上的应用本方案在Xilinx Artix7 系列FPGA上的应用 3、设计思路框架视频源选择ov5640 i2c配置及采集动态彩条多路视频…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式,以相关技术概念为起点,实际环境搭建,程序部署为终点,从0到1的实操演示的学习方式,一步一步,保姆级的方式学习k8…

语音生成、写作增强、论文辅助、英文学习,AI原生应用精彩推荐一箩筐!

崭新的2024年已然降临,飞桨星河社区再次涌现出诸多精彩纷呈的AI原生应用,快来一同探索,发现这些应用带来的无限惊喜与可能吧! 语音生成:10音色自由选择 应用介绍 本应用基于ERNIE SDK和语音合成工具,可以输…

“情暖寒冬 温暖相伴”关爱慰问

岁末寒冬,春节将至,为持续巩固脱贫攻坚成果,扎实助力乡村振兴,市融媒体中心开展“情暖寒冬 温暖相伴”慰问活动。 1月25市融媒体中心联合我市志愿者协会在南村镇忽树庄村开展“情暖寒冬 温暖相伴”慰问活动,为脱贫户送…

爬虫js逆向分析——x平台(实现)

爬虫js逆向分析——x平台(实现) (仅供学习,本案例只是分析流程没有账号)网址:https://xuexi.chinabett.com/ 1.分析请求包格式 打开控制台,并勾选保存日志,然后点击登录看发送了什…

【自然语言处理的发展】

自然语言处理的发展 自然语言处理(NLP)作为人工智能领域的一个分支,旨在让计算机理解和生成人类语言。随着深度学习和大数据技术的不断进步,NLP在近年来取得了显著的突破。本文将探讨NLP技术的发展历程、最新技术进展以及未来展望…

Debezium发布历史89

原文地址: https://debezium.io/blog/2020/03/31/debezium-newsletter-01-2020/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Debezium 时事通讯 01/2020 2020 年 3 月 31 日 作者: 克…