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中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的人 遗产 通常 所有