Java宣言的时候,JAVA面向对象-对象宣言
JAVA面向对象-对象声明
新建一个对象的,数据存储的位置可能不一样;JAVA存放数据的地方有:
程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:
(1)
寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
(2)
堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那
些内存。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动
指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。
(3)
堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,堆(Heap)中编译器不必知道要从堆里分配多少存储空间,也不必知
道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码
时,会在堆里自动进行数据的保存。在堆里分配存储空间时会花掉更长的时间!
(4)
静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
(5)
常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非RAM存储。 不研究;
其中,堆和栈是两个最常用的,每种语言都用到.而且不同语言对堆和栈的理解和数据结构里的定义可能不同.
实际上,变量也是一种对象,是语言的原始对象.我们也可以自定义自己的对象.当我们声明对象的时候,内在就会开辟一片空间来存储数据.如果声明的是长度已知的对象,则会在栈中存储,如果不可知,则在堆中.
boolean
1-bit
–
–
Boolean
char
16-bit
Unicode 0
Unicode 216
- 1
Character
byte
8-bit
-128
+127
Byte
short
16-bit
-215
+215
– 1
Short1
int
32-bit
-231
+231
– 1
Integer
long
64-bit
-263
+263
– 1
Long
float
32-bit
IEEE754
IEEE754
Float
double
64-bit
IEEE754
IEEE754
Double
void
–
–
–
Void
1
上面这些是可知的对象,第二列是在内在中占的位置.再后面两列是该对象值的边界.
上面这些类型的对象若用new声明,则程序会自动给它赋一个默认值:
Boolean abc = new Boolean();这时候程序会给abc默认为:false;
默认值为:
boolean
false;
char
'\u0000'(null)
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
假若在一个函数定义中写入下述代码:
int x;
那么x会得到一些随机值(这与C和C++是一样的),不会自动初始化成零。我们要在正式使用x前分配一个适当的值。如果忘记,就会得到一条编译期错误,告诉我们变量可能尚未初始化。
JAVA中String类未固定大小,所以声明的时候是放在堆中,但在JavaScript中,则是放在栈中的.
再就是:用 new()声明的对象,其数据都是放在堆中的,栈中存放的是指向该数据的"句柄".
声明的对象有自己的存在时间(Life Time);
对象声明后有自己的作用域
.例如:
{
int
x = 12;
{
int
q = 96;
}
}
在JAVA中,不能让同一个变量或者用同一个名称定义变量,在不同的范围.
{
int x = 12;
{
int x = 96;
}
}
句柄s会在作用域的终点处消失。然而,s指向的String对象依然占据着内存空间。在上面这段代码里,我们没有办法访问对象,
因为指向它的唯一一个句柄已超出了作用域的边界。这样造成的结果便是:对于用new创建的对象,只要我们愿意,它们就会一直保留下去。怎样才能防止它们大
量充斥内存,并最终造成程序的“凝固”呢。在C++里,这个问题最令程序员头痛。但Java以后,情况却发生了改观。Java有一个特别的“垃圾收集器”
,它会查找用new创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。这样就可以防止"内存溢出".
声明一个对象的时候实际上是在堆中开辟一块空间存放数据,然后在栈中放一个指向这块空间的"句柄".所以,若一个对象未被初始化,则句柄就不知道指向哪里,所以就会被默认赋个定值:null;若使用一个还是null的句柄,会出错.所以,声明变量的时候都要进行初始化.
特例是:原始类型(也叫基本类型)
声明的时候,是直接放在栈中的.而且编译器会自动赋初值.但这又分两种情况,一种是该类型的对象是在类中作为"属性"
存在,这时候编译器赋的初始值如下表:
boolean
false;
char
'\u0000'(null)
byte
(byte)0
short
(short)0
int
0
long
0L
float
0.0f
double
0.0d
另一种情况就是非对象的属性,这时候编译器赋的值可能出错;如下:
int x;这时候x的值可能是一个随机值;
Java允许我们把任何基本数据类型的变量转换成别的基本数据类型,但布尔值除外,布尔值不允许任何类型的转换."类"本身,是不允许转换的.一个对象可以在所属类族之间进行转换.如:桃树,可以转换成树.反之也可以,但不能转换成石头.
来源:http://blog.sina.com.cn/s/blog_5f54f0be0100d4qw.html
Java宣言的时候,JAVA面向对象-对象宣言相关推荐
- Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系
Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系,下列对象中不具备继承关系的是?() A:手机与小米手机 B:企业家与雷军 C:编程语言与Java D:中国与北京 类之间 ...
- 【JAVA学习】2、面向对象编程的核心——对象和类
[JAVA学习]面向对象编程的核心--对象和类 前言 面向过程VS面向对象 基础概念 优缺点比较 面向对象三大基础特性 封装 继承 多态 面向对象编程的五大基本原则 单一职责原则SRP(Single ...
- 【Java常识】6.0面向对象认知和Eclipse的实用使用、==号和equals方法的区别
1.曾经写过很多自以为很通俗易懂的面向对象的解释. 如下是目前最通俗的一种解释: 2.Eclipse的补充解释. 运行的快捷键:F11. 3.Eclipse快捷键大全 大全放本文最后,这里主要放常用的 ...
- java异常对象引用变量_Java面向对象编程-异常处理
第九章 异常处理 异常情况会改变正常的流程,导致恶劣的后果,为了减少损失,应该事先充分预料所有可能出现的异常,然后采取以下措施: 首先考虑避免异常,彻底杜绝异常的发生:如果不能完全避免,则尽可能地减少 ...
- Java第四次作业——面向对象高级特性(继承和多态)
Java第四次作业--面向对象高级特性(继承和多态) (一)学习总结 1.学习使用思维导图对Java面向对象编程的知识点(封装.继承和多态)进行总结. 2.阅读下面程序,分析是否能编译通过?如果不能, ...
- 【深入Java虚拟机JVM 05】HotSpot对象探秘
说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 介绍完Java虚拟机的运行时数据区之后,我们大致知道了虚拟机内存的概况,读者了解了内存中放了些什么后 ...
- 到底什么是面向对象,面试中怎么回答。面向过程和面向对象的区别是什么。java跨平台特性以及java和C++的区别。面向对象的三大特性——封装、继承和多态。面向对象的高拓展性以及低耦合度怎么体现?
Java语言具有的特点:面向对象.跨平台.多线程以及网络编程 1. 和C++的区别 1.1 Java隐蔽了C++的指针,避免指针直接操作,程序更加安全. 1.2 Java类继承只能单继承,避免了C++ ...
- Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?
Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?按理不应该只有一个类型-对象吗? 1.首先,Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Int ...
- java类描述_java笔记2:Java语言中的类和对象的描述
在Java 语言中,除8 个基本数据类型值之外, 一切都是对象,而对象就是面向对象程序设计的中心. 对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还 ...
- Java快速入门学习笔记7 | Java语言中的类与对象
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
最新文章
- 别人总结的批处理技巧
- 在ASP.NET MVC里对Web Page网页进行权限控制
- HDU 2157 How many ways?? 矩阵
- linux获得蓝牙外设mac,iOS获取蓝牙外设Mac地址
- GO tcp server demo
- Jquery基础知识
- 详解7类Python运算符及代码举例
- echo字符集 shell_Shell echo命令:输出字符串
- Springboot集成BeanValidation扩展二:加载jar中的资源文件
- 谷歌地球(Google Earth) 7.3.2.5776
- pycharm txt编辑器制表符与代码中\t不匹配
- ArcGIS API For Javascript 4.15 绘制地图:在地图上测距离、测面积和在不同图层上搜索
- 今日份安利:发票扫描识别软件推荐
- kafka windows环境搭建 SASL_PLAINTEXT/SCRAM
- JZOJ ???? Or
- 计算机信息技术对医院医疗服务工作的影响,计算机在医院信息管理工作中应用探究.doc...
- 通过面试谈谈自己的一点感悟(只是个人的一点拙见)
- oppo手机使用应用沙盒动态修改序列号信息
- mysql 恢复到新库_mysql恢复到一个新的mysql主和从数据库教程
- 转:德鲁克,激发我一生的七段经历
热门文章
- MYSQL服务器my.cnf配置文档详解
- Oracle数据库编程:PL/SQL编程基础
- VSA Cluster中小企业无SAN环境解决方案
- 终于把W32.Spybot.Worm给消灭了(这个标题不能用了)
- go home(2)-supprise
- redis LRU和LFU
- Red Hat Enterprise Linux 7.5安装盘内容做本地YUM源
- 【PHP基础】PHP接口调用与json数据处理
- 【iCore4 双核心板_uC/OS-II】例程八:消息邮箱
- mycat启动服务,后台日志报错Bit Server VM warning: ignoring option MaxPermSize