Java对象的一些琐碎的知识点

1.c++和 Java都是混合/雜合型語言

2.關於對象的存儲問題

  • 寄存器 :速度最快,位于處理器内部,不能直接控制(c 和 c++ 允許像編譯器建議存儲器的分配方式)
  • 堆栈 :位于通用RAM(随机访问存储器)通过堆栈指针可以从处理器哪里直接获得支持,堆栈指针向下移动 分配内存,向上移动释放内存。Java对象引用存放于堆栈中,但是对象并不存放与堆栈中。Java必须知道存于其中项的生命周期
  • 堆 :一种通用的内存池(也位于RAM中)用于存放所有Java对象,与堆栈不同的是,编译器并不需要知道存在其中的数据,在堆中存活多长时间。
  • 常量存储 :通常直接存放在程序代码内部,这样做是安全的
  • 非RAM存储 :数据完全存活于程序之外,两个基本例子:流对象,持久化对象

3.基本类型

常用的一系列类型,如果用new将对象存储在堆里由于他们也别小太简单,这样做不是很高效,因此将其创建成一个并非引用的“自动变量”置于堆栈中

在Java中基本类型的大小不变

4.对象的作用域

Java对象不具备和基本类型一样的生命周期。当new创建一个Java对象时,它可以存活于作用域之外。

{
    String s = new String("a String");
}

例如此例:s在作用域的终点就会失去作用,而 s 指向的对象仍存在

Java有垃圾回收器,用来监视new创建的所有对象,他会对一些不被引用的对象进行回收。

基本类型默认值问题:

在类中,若类某个成员是基本类型,即使不进行初始化,Java也会给予其默认值,但当其为局部变量时不会对其进行初始化(需要手动初始化,不然会报错)

5.static关键字

通常来说,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类对象,否则实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才被外界调用。

两种特殊情形上诉方法无法解决:
  • 只想为某特定于分配单一存储空间,而不去考虑究竟要创建多少对象,甚至根本就不去创建任何对象
  • 希望某个方法不与包含它的那个类的任何对象实例关联在一起,也就是说即使没有创建对象也可以调用这个方法。例如:system类要是选择属性out,就会发现他是一个静态PrintStream对象,因为是静态的,所以不需要创建任何东西,out对象便已经存在了。

通过static关键字可以结局上述问题,当声明事务是一个static时,就意味着这个域或方法不会与它的那个类的任何对象实例关联在一起

class StaticTest{
    static int i = 1;
}

StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();

现在即使创建了两个StaticTest对象,对于StaticTest.i来说也只有一份存储空间,这两个对象共享一个i 。非静态的则是每new一个就睡创建一个新的空间

static方法就是没有this的方法。在static方法内部是不能调用非静态的方法的,反过来则可以。