編程語言根據如何操做內存中元素分爲兩種, 一種是C/C++之類: 經過特殊語法來操縱, 例如指針. 一種是Python,Java之類, 使用引用操縱對象.java
這就是爲何Python中存在id這個函數, 用來標識對象的惟一值, 而Java中到處有hashCode, 用來標識對象的哈希惟一值, 而哈希值一般爲對象的內存地址.python
In [1]: id("hello") Out[1]: 4350279376
String s = "hello"; // 99162322 System.out.println(s.hashCode());
在Java中, 對象由new來建立, 存儲在堆中, 由垃圾回收器對沒有用到的對象進行垃圾回收, 而不須要咱們手動銷燬對象.git
五個存儲區github
1. 寄存器: 處理器內部, 存儲速度最快.編程
2. 堆棧: 位於通用RAM中, 但經過堆棧指針能夠從處理器那裏得到直接支持. 堆棧指針若向下移動則分配新的內存, 向上移動則釋放內存.編程語言
C/C++支持對象在堆棧中分配, 而Java容許基本的類型(如char, int...)在堆棧中建立. 其他的對象在堆中建立.函數
3. 堆: 通用的內存池, 用於存放全部的Java對象.spa
4. 常量存儲: 常量值一般直接存放在程序代碼內部.指針
5. 非RAM存儲: 數據存活在程序以外.code
關於基本類型和字符串不可改變的解釋
堆棧一般用來存儲基本類型的變量和對象的引用, 而具體的對象存儲於堆中. 而若是咱們使用new String()建立一個對象, 則一般會建立一個或兩個對象: 在堆中建立對象, 其對象的引用存儲於堆棧中; 而若是常量存儲中無此字符串, 則會在常量存儲中新建此字符串.
做用域
在C/C++中, 可使用大括號造成一個做用域, 例以下例代碼在C/C++中是合法的:
{ int x = 12; { int x = 13; } }
可是在Java中倒是非法的.
若是咱們使用new建立對象, 則此對象會一直保留下去, 直到Java的垃圾回收器將其收回.
類的基本構造
若是咱們在類中定義基本成員, 則其擁有默認值:
class Data { int i; double d; }
這是Java的自己語言特性, 防止程序出錯(對C++來講, 基本成員並無默認值).
類有數據域, 操做數據域的方法, 訪問控制(private, public, protected), 和一些額外的語法糖(如static, abstract...)組成.
class Person { static double no = 1; private String name; Person(String aName) {} public void setName(String n){} }
import: 用於導入類庫.
static: 用於建立與類相關而與類對象無關的數據或方法.
https://github.com/leicj/books/tree/master/Java%E7%BC%96%E7%A8%8B%E6%80%9D%E6%83%B3