当你创建一个类时,你创建了一种新的数据类型。你可以使用这种类型来声明该种类型的对象。然而,要获得一个类的对象需要两步。第一步,你必须声明该类类型的一个变量,这个变量没有定义一个对象。实际上,它只是一个能够引用对象的简单变量。第二步,该声明要创建一个对象的实际的物理拷贝,并把对于该对象的引用赋给该变量。这是通过使用new 运算符实现的。new运算符为对象动态分配(即在运行时分配)内存空间,并返回对它的一个引用。这个引用或多或少的是new分配给对象的内存地址。然后这个引用被存储在该变量中。这样,在Java 中,所有的类对象都必须动态分配。让我们详细看一下该过程。

在前面的例子中,用下面的语句来声明一个Box类型的对象:

Box mybox = new Box(); 本例将上面讲到的两步组合到了一起,可以将该语句改写为下面的形式,以便将每一步讲的更清楚:

Box mybox; // declare reference to object  mybox = new Box(); // allocate a Box object

第一行声明了mybox ,把它作为对于Box类型的对象的引用。当本句执行后,mybox 包含的值为null ,表示它没有引用对象。这时任何引用mybox 的尝试都将导致一个编译错误。第二行创建了一个实际的对象,并把对于它的引用赋给mybox 。现在,你可以把mybox 作为Box的对象来使用。但实际上,mybox 仅仅保存实际的Box 对象的内存地址。这两行语句的效果如图6-1 所示。

图6-1 声明Box 类型的对象  注意:那些熟悉C/C++ 语言的读者,可能已经注意到了对象的引用看起来和指针类似。这种怀疑实质上是正确的。一个对象引用和内存指针类似。主要的差别(也就是Java安全的关键)是你不能像实际的指针那样来操作它。这样,对于对象引用,你就不能像指针那样任意分配内存地址,或像整数一样操作它。

6.2.1 深入研究new 运算符

刚才已经解释过,new运算符动态地为一个对象分配地址。它的通用格式如下:

class-var = new classname( );

其中,class-var 是所创建类类型的变量。classname 是被实例化的类的名字。类的后面跟的圆括号指定了类的构造函数。构造函数定义当创建一个类的对象时将发生什么。构造函数是所有类的重要组成部分,并有许多重要的属性。大多数类在他们自己的内部显式地定义构造函数。如果一个类没有显式的定义它自己的构造函数,那么Java 将自动地提供一个默认的构造函数。对类Box 的定义就是这种情况。现在,我们将使用默认的构造函数。不久,你将看到如何定义自己的构造函数。

这时,你可能想知道为什么对整数或字符这样的简单变量不使用new 运算符。答案是Java 的简单类型不是作为对象实现的。出于效率的考虑,它们是作为“常规”变量实现的。你将看到,对象有许多特性和属性,使Java 对对象的处理不同于简单类型。由于对处理对象和处理简单类型的开销不同,Java 能更高效地实现简单类型。后面,你将看见,对于那些需要完全对象类型的情况下,简单类型的对象版本也是可用的。

理解new运算符是在运行期间为对象分配内存的是很重要的。这样做的好处是你的程序在运行期间可以创建它所需要的内存。但是,内存是有限的,因此new有可能由于内存不足而无法给一个对象分配内存。如果出现这种情况,就会发生运行时异常(你将在第10 章学习如何处理这种异常以及其他异常情况)。对于本书中的示例程序,你不必担心内存不足的情况,但是在实际的编程中你必须考虑这种可能性。

让我们再次复习类和对象之间的区别。类创建一种新的数据类型,该种类型能被用来创建对象。也就是,类创建了一个逻辑的框架,该框架定义了它的成员之间的关系。当你声明类的对象时,你正在创造该类的实例。因此,类是一个逻辑构造,对象有物理的真实性(也就是对象占用内存空间)。弄清楚这个区别是很重要的。

免责声明:本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

java声明一个对象_Java声明对象相关推荐

  1. java复制一个对象_Java中对象的复制

    假如说你想复制一个简单变量.很简单: 1 int n = 5;2 int m = n; 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte,short,float,doubl ...

  2. java 释放一个对象_JAVA中销毁一个对象的方法

    方法一:垃圾回收器 垃圾回收器是Java平台中用的最频繁的一种对象销毁方法.垃圾回收器会全程侦测Java应用程序的运行情况.当反先有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的 ...

  3. java什么叫声明异常_java – 声明异常而不是处理它的重点是什么

    据我所知,如果您只声明一个已检查的异常,它将通过您的所有方法传播到main方法,并仍然中断您的正常程序流程,您的程序仍将停止工作.那么,为什么不总是使用try / catch处理已检查的异常-这样你的 ...

  4. java 克隆一个对象_Java对象克隆

    Java对象克隆 1 什么是Java对象克隆 对象克隆是创建一个对象的副本的方式.Object类的clone() 方法用于克隆对象. java.lang.Cloneable接口必须由我们要建立其对象克 ...

  5. java输出一个对象_java里面直接输出一个类的对象

    Java直接输出一个类的对象的时候,会自动调用这个类的toString方法.这个方法在object类中,而所有的类都继承object类,所以所有的类都有toString方法.当我们不重写该方法时,该方 ...

  6. java 初始化顺序_Java中对象初始化顺序的详细介绍

    前言 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛.看一下这三个类: package com ...

  7. java 复制一个对象_Java如何完全复制一个对象

    Java里的clone分为: ** A:浅复制(浅克隆): **浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. B:深复制(深克隆):深复制把要复制的对象所引用的对象都复制了一遍. Java中对 ...

  8. java常见业务对象_Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分...

    PO:持久对象 (persistent object),po(persistent object)就是在Object/Relation Mapping框架中的Entity,po的每个属性基本上都对应数 ...

  9. java字符串深克隆_Java中对象的深复制(深克隆)和浅复制(浅克隆)之序列化...

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. 举 ...

最新文章

  1. 3306 端口 要不要修改_zabbix 自动发现并监控所有端口
  2. 临近春招,Kafka是不是忘完了,给你一文概括Kafka
  3. 光棍节程序员闯关秀过关全攻略
  4. 淄博神爱计算机官网,【最美教师】张萍:大爱无言 育人无声
  5. 7模型集成:细粒度用户评论情感分析冠军思路及源码
  6. 基于隐马尔可夫模型的有监督词性标注
  7. 生日快乐编程代码_「世界上最好的编程语言」,刚刚度过了25周岁生日
  8. MIT算法圣经书《算法导论》第四版
  9. oracle exadata中国保有量,怎样购买Exadata?
  10. 简单spring cloud服务升级实现
  11. 用python画简单的图形
  12. [人生故事] -- 花朵静悄悄地开放
  13. 半胱氨酸蛋白酶Caspase-8 Inhibitor I, 886462-83-5
  14. day03_《谷粒商城》的完整流程(详细版二)
  15. 宠物行业新锐宠胖胖APP联手麻花特开心正式出道
  16. unity捕鱼达人3----UI界面的制作以及相关功能的实现
  17. 读取手机或SD卡的音频
  18. linux 运行中磁盘故障,Linux 检查磁盘损坏情况命令 -必会
  19. 微信支付获取prepay_id以及回调地址
  20. 学术期刊划分(SCI、EI、SSCI、IEEE、CSSCI等)

热门文章

  1. mysql--Galera集群
  2. 如何登录GItHub
  3. 一周精彩内容分享(第 2 期):年味去了哪里?
  4. 如何更换程控交换机的人工铃声
  5. RS编码译码误码率性能matlab仿真
  6. emacs阅读linux代码,Emacs - 代码编辑神器之一
  7. 星际看录像工具bwlauncher v1.81 汉化版(增强版) 绿色
  8. 沃趣科技与「DaoCloud 道客」达成生态合作,共同助推数字化新发展
  9. QML 阴影边框实现
  10. redis——缓存雪崩、缓存穿透、缓存击穿