Java中的对象是什么?

2023-11-10

Java是一种面向对象的编程语言,它将世界视为具有属性行为的对象的集合。 Java的面向对象版本非常简单,它是该语言几乎所有内容的基础。 因为它对Java非常重要,所以我将对幕后内容进行一些解释,以帮助任何不熟悉Java的人。

遗产

通常,所有笛卡尔几何对象 (例如圆形,正方形,三角形,直线和点)都具有基本属性,例如位置和延伸。 具有零扩展的对象(例如点)通常没有其他东西。 像线这样的对象具有更多的对象,例如,线段的起点和终点,或沿线的两个点(如果是“真线”)。 诸如正方形或三角形之类的对象还有更多的东西(例如,拐角点),而圆形可能具有中心和半径。

我们可以看到这里有一个简单的层次结构:通用几何对象可以扩展为特定的几何对象,例如点,线,正方形等。每个特定的几何对象都继承了位置和扩展的基本几何属性,并添加了自己的属性属性。

这是单继承的示例。 Java最初的面向对象模型仅允许单一继承,其中对象不能属于多个继承层次。 该设计决策来自于程序员在复杂的多重继承场景中面临的种种歧义,通常是在“有趣的设计决策”导致在定义(和重新定义)函数foo()的几种可能实现的情况下层次结构。

从Java 8开始,就已经存在有限的多重继承结构,该结构要求代表程序员采取特定的措施以确保不存在歧义。

强而静态的打字

Java是类型和静态类型。 这是什么意思?

静态类型语言是一种在编译时就知道变量类型的语言。 在这种情况下,不可能将B类型的值分配给声明类型为A的变量,除非存在一种将B类型的值转换为A类型的值的转换机制。转换将整数值(例如1、2或42)转换为浮点值(例如1.0、2.0或42.0)。

类型语言是一种自动应用很少(或可能没有)类型转换的语言。 例如,强类型语言可能允许将整数自动转换为实数 ,但绝不会允许将 自动转换为 数,因为在一般情况下,该转换需要舍入或截断。

基本类型,类和对象

Java提供了许多原始类型: 字节 (八位带符号整数); (16位有符号整数); int (32位有符号整数); long (64位有符号整数); float (单精度32位IEEE浮点数); double (双精度64位IEEE浮点数); 布尔值 (对或错); 和char (16位Unicode字符)。

除了这些原始类型,Java还允许程序员使用类声明创建新类型。 类声明用于定义对象模板,包括其属性和行为。 声明一个类后,通常可以使用new关键字创建该类的实例 。 这些实例直接对应于我们一直在讨论的“对象”。 Java附带了一个有用的类定义库,其中包括一些简单的基本类,例如String ,它用于保存诸如“ Hello,world”之类的字符序列。

让我们定义一个简单的消息类,其中包含发件人的名称以及消息文本:


   
   
class Message {
        String sender ;
        String text ;
        public Message ( String sender, String text ) {
                this . sender = sender ;
                this . text = text ;
        }
}

该类声明中有几件重要的事情要注意:

  1. 按照惯例,该类始终以大写大写字母声明。
  2. Message类包含两个属性(或字段):
    –一个名为sender的String字段
    –一个名为text的字符串字段
    属性或字段(按惯例)始终以小写前导字母声明。
  3. 公共消息开始就有某种东西。
    –这是一种方法 (方法定义对象的行为)。
    –用于构造 Message类的实例。
    –构造方法始终与类具有相同的名称,并应理解为构造后便返回该类的实例。
    –其他方法(按照惯例)始终以小写字母开头。
    –此构造函数是“公共的”,表示任何调用者都可以访问它。
  4. 作为构建过程的一部分,一些行从此开始。
    是指该类的当前实例。
    –因此, this.sender引用对象的sender属性。
    –而普通发件人是指消息构造函数方法的参数。
    –因此,这两行将对构造函数的调用中提供的值复制到对象本身的字段中。

因此,我们有了Method类的定义。 我们如何使用它? 以下代码摘录显示了一种可能的方法:

 Message message = new Message ( "system" , "I/O error" ) ; 

在这里我们看到:

  1. 类型信息的可变信息的声明
  2. 创建消息类的新实例,并将发送者设置为“系统”,并将文本设置为“ I / O错误”
  3. Message的新实例分配给可变message
  4. 如果在代码的后面部分,为变量message分配了一个不同的值( Message的另一个实例),并且没有创建任何其他引用此Message实例的变量,则该实例将不再被任何人使用,并且可以被垃圾回收。

这里发生的关键是我们正在创建Message类型的对象,并在变量message中保留对该对象的引用。

我们现在可以使用该消息; 例如,我们可以在sendertext属性中打印值,如下所示:


   
   
System . out . println ( "message sender = " + message. sender ) ;
System . out . println ( "message text = " + message. text ) ;

这是一个非常简单且不复杂的类定义。 我们可以通过多种方式修改此类的定义:

  1. 通过在声明前使用关键字private ,可以使调用者看不到属性的实现细节,从而使我们可以在不影响调用者的情况下更改实现。
  2. 如果我们选择隐藏类中的属性,则通常将定义获取设置这些属性的过程。 按照Java中的约定,这些定义为:
    公共字符串getSender()
    公共字符串getText()
    公共无效setSender(字符串发送方)
    公共无效setText(字符串文本)
  3. 在某些情况下,我们可能希望具有“只读”属性; 在这种情况下,我们不会为此类属性定义setter。
  4. 通过使用private关键字而不是public,可以使调用者看不到该类的构造函数。 当我们有另一个类负责创建和管理消息池(可能在另一个进程甚至在另一个系统中执行)时,我们可能希望这样做。

现在,假设我们想要一种消息,该消息记录何时生成。 我们可以这样声明:


   
   
class TimedMessage extends Message {
        long creationTime ;
        public TimedMessage ( String sender, String text ) {
                super ( sender, text ) ;
                this . creationTime = System . currentTimeMillis ( ) ;
        }
}

在这里,我们看到了一些新东西:

  1. TimedMessage 扩展Message类-也就是说, TimedMessage正在继承Message的属性和行为。
  2. 构造函数在其父或父类中调用构造函数,并将sendertext的值作为super(sender,text)传入,以确保正确继承其继承的属性。
  3. TimedMessage添加了一个新属性creationTime ,并且构造函数将其设置为当前系统时间(以毫秒为单位)。
  4. 在Java中,以毫秒为单位的时间保持为一个长(64位)值(0为1970年1月1日00:00:00 UTC)。
  5. 顺便说一句,名称creationTime暗示它应该是一个只读属性,这也暗示其他属性是只读的。 也就是说, TimedMessage实例可能不应重用,也不应更改其属性。

对象类

从术语上讲,“对象类”听起来像是一种矛盾,不是吗? 但是请注意,我们定义的第一个类Message 似乎并没有扩展任何东西,但实际上可以扩展。 所有没有专门扩展另一个类的类都将Object类作为其直接父类和唯一父类。 因此,所有类都将Object类作为其最终超类。

您可以在Java文档中了解有关Object类的更多信息 。 让我们(简要地)回顾一些有趣的细节:

  1. Object具有构造函数Object() ,即没有参数。
  2. 对象为其所有子类提供了一些有用的方法,包括:
    clone() ,它创建并返回当前实例的副本
    equals(Object anotherObject) ,它确定anotherObject是否等于当前的Object实例。
    finalize() ,用于在不再使用实例时对其进行垃圾回收(请参见上文)
    getClass() ,该类返回用于声明手头实例的类
    —由此返回的值是Class的实例, 该类允许在运行时学习声明类(称为introspection的过程)。
  3. hashCode()是一个整数值,它为当前实例提供了几乎唯一的值。
    –如果两个不同实例的哈希码相等,则它们可以相等; 为了确定完全相等,必须对属性(可能还有方法)进行详细比较;
    –如果哈希码不相等,则实例也不相等。
    –因此,哈希码可以加快相等性测试的速度。
    –哈希码也可以用于创建HashMap (映射是使用哈希码加快查找速度的关联数组或字典)和HashSet (集合是对象的集合;程序员可以测试实例是否是否在集合中;使用哈希码来加快测试速度)。
  4. notify()notifyAll()wait()wait(long timeout)wait(long timeout,int nanos)在单独线程上执行的协作实例之间进行通信。
  5. toString()生成实例的可打印版本。

结论性思想

我们已经谈到了Java风格的面向对象编程的一些重要方面。 在以后的文章中将涉及六个重要的相关主题:

  • 命名空间和包
  • 子类中的重写方法-例如,String类具有自己的特定hashCode()方法,该方法将其含义识别为字符数组; 这是通过重写从Object继承的hashCode()方法来完成的
  • 接口,允许描述必须由实现该接口的类提供的行为; 当唯一感兴趣的是特定行为时,可以通过该接口引用实现给定接口的类的实例
  • 原语或类的数组以及类的集合(例如列表,映射和集合)
  • 方法的重载-具有相同名称和相似行为的几种方法具有不同的参数
  • 使用Java发行版随附的库

接下来您想阅读什么吗? 让我们在评论中知道并继续关注!

翻译自: https://opensource.com/article/19/8/what-object-java

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的对象是什么? 的相关文章

  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 如何使用Python创建历史时间线

    So I ve seen a few answers on here that helped a bit but my dataset is larger than the ones that have been answered prev
  • Pygame:有没有简单的方法可以找到按下的任何字母数字的字母/数字?

    我目前正在开发的游戏需要让人们以自己的名义在高分板上计时 我对如何处理按键有点熟悉 但我只处理过寻找特定的按键 有没有一种简单的方法可以按下任意键的字母 而不必执行以下操作 for event in pygame event get if
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在Python中对类别进行加权随机抽样

    给定一个元组列表 其中每个元组都包含一个概率和一个项目 我想根据其概率对项目进行采样 例如 给出列表 3 a 4 b 3 c 我想在 40 的时间内对 b 进行采样 在 python 中执行此操作的规范方法是什么 我查看了 random 模
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 向 Altair 图表添加背景实心填充

    I like Altair a lot for making graphs in Python As a tribute I wanted to regenerate the Economist graph s in Mistakes we
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 如何从泛型类调用静态方法?

    我有一个包含静态创建方法的类 public class TestClass public static
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • java中JDBC当中请给出一个DataSource的HelloWorld例子

    马克 to win 在前面 的jdbc的Helloworld程序当中 我们用DriverManager来获取数据库连接 事实上通过这种方法获取数据库连接 是比较耗费计算机资 源的 当然了 这也是没有办法的事儿 就像我们买贵书必须花大价钱一样
  • 【Android】App开发-布局篇

    UI的开发离不开各个组件的精准布局 在我们学习了控件之后 控件篇 我们就需要对这些控件进一一排布 让它们在各个指定的位置 目录 LinearLayout线性布局 RelativeLayout布局 FrameLayout布局 TableLay
  • 【Python爬虫】将爬下来的数据保存到redis数据库里面

    redis库中的Redis类对Hash数据类型操作的常用方法 方法名 具体说明 hset name key value 哈希中添加一个键值对 hmset name mapping 设置哈希中的多个键值对 hmget name keys ar
  • 逻辑架构和物理架构

    逻辑架构和物理架构 理论上划分了5种架构视图 分别是 逻辑架构 开发架构 运行架构 物理架构 数据架构 逻辑架构 逻辑架构关注的是功能 包含用户直接可见的功能 还有系统中隐含的功能 或者更加通俗来描述 逻辑架构更偏向我们日常所理解的 分层
  • HTML学习(二)HTML基础

    以这个为例 h1 我的第一个标题 h1 p 我的第一个段落 p DOCTYPE 前用来申明这是一个html 这里的html不区分大小写 HTML标题 HTML 标题 Heading 是通过 h1 h6 标签来定义的 h1 1级标题 h1 H
  • R语言优雅地修改列名称

    R语言优雅地修改列名称 在R语言中 修改数据框 DataFrame 或矩阵 Matrix 的列名称是一项常见的任务 通过优雅地修改列名称 可以提高代码的可读性和可维护性 在本文中 我将介绍几种优雅的方法来修改列名称 并提供相应的源代码示例
  • GPU计算

    文章目录 GPU计算 1 GPU和CPU的区别 2 GPU的主要参数解读 3 如何在pytorch中使用GPU 4 市面上主流GPU的选择 GPU计算 1 GPU和CPU的区别 设计目标不同 CPU基于低延时 GPU基于高吞吐 CPU 处理
  • 95-34-025-Context-AbstractChannelHandlerContext

    文章目录 1 概述 2 继承体系 3 类签名 4 关键字段 5 构造方法 6 ChannelRead事件 6 1 findContextInbound 7 invokeHandler 1 概述 2 继承体系
  • tensorrt转换模型进行了哪些操作

    对于网络layer graph进行的操作 消除输出未使用的层 消除相当于无操作的操作 卷积 偏置和ReLU运算的融合 具有足够相似参数和相同源张量的运算聚合 例如 GoogleNet v5的初始模块中的1x1卷积 inception结构中同
  • DW9718AF.c

    Copyright C 2015 MediaTek Inc This program is free software you can redistribute it and or modify it under the terms of
  • ERP系统总体解决方案 附下载地址

    企业资源计划即 ERP Enterprise Resource Planning 由美国 Gartner Group 公司于1990年提出 企业资源计划是 MRP II 企业制造资源计划 下一代的制造业系统和资源计划软件 除了MRP II
  • 大数据学习框架及指南

    Hadoop生态圈 一 采集 数据从哪里来 主要包括flume等 一 存储 海量的数据怎样有效的存储 主要包括hdfs Kafka 二 计算 海量的数据怎样快速计算 主要包括MapReduce Spark storm等 三 查询 海量数据怎
  • 数据结构与算法笔记2(线性表)

    1 线性表 1 1线性表是一种逻辑关系 见绪论 1 2定义 是具有相同类型的n个元素的有限序列 其中n为表长 n 0时为空表 关键词 相同类型 一般处理的数据元素都是相同类型 比如一个人那么都是人 而不会把人与车放在一起 关键词 有限序列
  • Java泛型知识点整理

    Java泛型知识点整理 Java泛型 泛型提供了编译时类型安全检测机制 该机制允许程序员在编译时检测到非法的类型 泛型的本质是参数化类型 也就是说所操作的数据类型被指定为一个参数 比如我们要写一个排序方法 能够对整型数组 字符串数组甚至其他
  • ConcurrentHashMap为什么是线程安全的?

    1 ConcurrentHashMap的原理和结构 我们都知道Hash表的结构是数组加链表 就是一个数组中 每一个元素都是一个链表 有时候也把会形象的把数组中的每个元素称为一个 桶 在插入元素的时候 首先通过对传入的键 key 进行一个哈希
  • MapReduce的Job提交流程

    编写一个简单的WordCount程序 Mapper import org apache hadoop io LongWritable import org apache hadoop io Text import org apache ha
  • Tip of the Week #49: Argument-Dependent Lookup

    Tip of the Week 49 Argument Dependent Lookup Originally posted as totw 49 on 2013 07 14 whatever disappearing trail of i
  • 深度学习技术在自动驾驶中的应用与挑战

    导读 深度学习技术经过近几年井喷式的发展 在很多领域都得到了广泛的应用 在自动驾驶系统中 深度学习技术也起到了至关重要的作用 同时也面临着非常多的挑战 我们一直在探索 在一个安全 稳定的自动驾驶产品中 深度学习技术应该有着怎样的作用边界 又
  • Unable to load configuration的解决方法

    最近在学Struts2 5 5 因为喜欢用最新的 并且之前没有学习过的经验 就按照一个网上的博客跟着做一个小实例 里面说直接用 Struts2 5 5中自带例子的struts xml文件 结果我就用了 然后写了一个小程序就一直报 Unabl
  • Java中的对象是什么?

    Java是一种面向对象的编程语言 它将世界视为具有属性和行为的对象的集合 Java的面向对象版本非常简单 它是该语言几乎所有内容的基础 因为它对Java非常重要 所以我将对幕后内容进行一些解释 以帮助任何不熟悉Java的人 遗产 通常 所有