Thinking in java学习笔记 第二章:一切都是对象

程序在运行时,对象是怎么进行放置安排的呢?特别是内存是怎样分配的呢?有五个不同的地方可以存储数据:

  • 寄存器:最快,因为存储在处理器内部,但数量有限,不能直接控制,也不能在程序中感觉到寄存器存在的任何迹象
  • 堆栈:速度仅次于寄存器,堆栈指针向下移动分配新内存,向上移动释放内存。创建程序时,Java系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针,这一约束限制了程序的灵活性。对象引用存储于堆栈中,但Java对象不存储于其中
  • 堆:在内存中,存放Java所有的对象。编译器不需要知道存储的数据在堆里存活多久。执行new的时候,自动在堆里进行存储分配。但用堆进行存储分配和清理可能比堆栈慢
  • 常量存储:常量值通常直接存放在程序代码内部,这样比较安全,因为他们永远不会被改变。在嵌入式系统中,常量本身会和其它部分隔离开,这种情况可以选择将其存放在ROM中
  • 非RAM存储:如果数据存活于程序之外,那么可以不受程序控制,不运行时也可以存在。例子就是流对象和持久化对象。把对象转化成可以存放在其他媒介上的事物,在需要时,可恢复成常规的、基于RAM的对象,Java提供了对轻量级持久化的支持

特例:基本类型
基本类型不用new创建变量,而是创建一个并非是引用的“自动”变量,这个变量直接存储“值”并置于堆栈中,因此更加高效。
基本数据类型所占存储空间的大小是不随机械硬件架构的变化而变化的,这也是Java程序具有可移植性的原因之一。
高精度计算的类:BigIntegerBigDecimal大体属于“包装器类”的范畴,但二者都没有对应的基本类型。可以通过方法调用操作类似于int和float的操作,但速度会慢一点,他们可以表达任意精度的整数或者定点数。

Java中的数组

当创建一个数组对象时,实际上就是创建了一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null,一旦Java看到null,就知道这个引用还没有指向某个对象。在使用任何引用之前,必须为其指定一个对象,否则就会报错,如果数组存放的是基本数据类型,编译器也会对其进行初始化,它会将这种数组所占的内存全部置0。

Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别那些不再被引用的对象。随后释放这些对象的内存空间。你只需要创建对象,一旦不需要,它们就会自行消失
当变量作为类的成员使用时,Java确保给定其默认值。但局部变量不会初始化,需要自己初始化。

初始化值:

1. boolean:false
2. char:null
3. byte:(byte)0
4. short:(short)0
5. int:0
6. long:0L
7. float:0.0f
8. double:0.0d

static关键字

只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少对象,例如

class StaticTest{
     static int i =47;
}
//现在,即使创建了两个StaticTest对象,StaticTest.i也只有一份存储空间,这两个对象共享同一个i,
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();

在这里,st1.ist2.i指向同一存储空间,因此它们具有相同的值47
对基本数据类型的赋值是很简单的,基本类型存储了实际的数值,而并非指向一个对象的引用。
但是在为对象“赋值”的时候,情况却发生了变化。对一个对象进行操作时,我们真正操作的是对对象的引用。所以倘若“将一个对象赋值给另一个对象”,实际是将“引用”从一个地方复制到另一个地方。这意味着假若对对象使用c=d,那么c和d都指向原本只有d指向的那个对象。下面这个例子将向大家阐示这一点。

class Tank{
     int level;
}

public class Assignment{
     public static void main(String[] args){
          Tank t1 = new Tank();
          Tank t2 = new Tank();
          t1.level = 9;
          t2.level = 47;
          print(t1.level+" "+t2.level);//输出9  47
          t1 = t2;
          print(t1.level+" "+t2.level);//输出47 47
          t1.level = 27;
          print(t1.level+" "+t2.level);//输出27 27
   }
}

整数除法会直接去掉结果的小数位

笔记主要是给我自己用来记忆和查阅用,写的比较乱,可能会给你带来困扰,不好意思


欢迎关注我的个人生活博客:小之的个人博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值