编程语言根据如何操做内存中元素分为两种, 一种是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