第二章 一切都是对象
向后兼容(Backward Compatbility)和向前兼容(Forward Compability)区别:
向后兼容( Backwards compatibility ) windows10系统能兼容运行Windows 3.1开发的程序 ,win10具有向后兼容性
向前兼容( Forward compatibility ) Windows 3.1能兼容运行Windows 10开发的程序 ,Windows 3.1具有向前兼容性
2.1用引用操纵对象
String a;
这里仅仅是创建了一个引用,
String a=”abc”;
String a=new String(“abc”);的存储位置?以下代码验证下
/**
* Created by leon on 17-12-12.
*/
public class TestObject {
String a = "abc";
String b = new String("abc");
public void testAddress() {
System.out.println(a == b ? "true" : "false");
}
public static void main(String[] args) {
String a = "abc";
String b = "abc";
System.out.println(a == b ? "true" : "false");
TestObject testObject = new TestObject();
testObject.testAddress();
}
}
//output-------
true
false
2.2.1 存到什么地方
1.寄存器:
这是最快的存储区,因为他位于cpu内部,但是数量有限,通常是按需分配.java不允许直接控制,但是c/c++可以允许向编译器建议寄存器的分配方式.
2.栈
位于RAM中,通过栈指针从cpu那里获得直接支持.快速有效的存储方法,仅此于寄存器.java的对象引用存储于栈中.
3.堆
也处于RAM中.好处是非常灵活,可以往堆里面存储任何对象.但是缺点是:存储分配和清理需要比栈更耗时.
4.常量存储
通常直接存放在代码内部.在嵌入式系统中可以将常量和其他的部分分离开来,可以存储到ROM里面,因为是只读的(这里有个例子,字符串池,字面常量字符串和具有字符串值的常量表达式都是自动内存限定,存储到特殊的静态存储区).
5.非RAM存储
如果数据完全存活于程序之外,不受任何限制,在程序没有生成时也能存在.有例子(流对象 和 持久化对象)
2.2.2基本类型
用于处理基本类型的原因是,有些类型数据,因为特别小,特别简单需要特殊对待,因为如果把他们用new创建对象放在heap中,不是非常高效.基本类型,不用new创建对象,而是创建一个不是引用的”自动”变量,这些变量直接存储"值",存储与栈中.java所有数值类型都是有符合数.
boolean : 占存储空间的大小没有确定,仅定义字面量为 true 或false.
String: 不是基本类型,是引用类型.对于引用类型变量,仅仅是指向堆区中的某个实例的指针(引用).
java5以后可以进行对包装类型和基本类型之间的自动装包,解包.例如
Character cha=’c’;
char c=cha;
高精度数字: BigInteger 和 BigDecimal 基本属于包装器类型,但是没有基本类型.BigInteger 可以表示任何大小的整数值,BigDecimal可以表示任何精度的定
点数.区分下浮点数和定点数.定点数是指小数点的位置是固定不变的,通常分为定点小数和定点整数,用之前先规定好小数点的位置.浮点数的小数点位置是变化的,用阶码和尾数开表示,不用惧怕它的表示形式,它也是一串亲切0、1序列
2.3.2 对象的作用域
对象不具有基本类型的作用域生命周期,当new 一个对象的时候,他可以存活与作用域之外.
例如:虽然引用outOfScope在作用域的终点就消失,但是outOfScope指向的对象还会继续占用内存空间,他会等垃圾回收器回收的时候,进行回收.
private void objScope(){
String outOfScope=new String ("出了函数不会马上释放");
}
2.4 创建新的数据类型:类
2.4.1字段和方法:
成员变量的初始值是系统指定的,但是局部变量的初始值可能是任意的,而不会自动初始话.
例如:
private void objScope(){
int x;//这里系统不会进行初始0 ,有可能是任意值
}
接下来的代码如果需要对x进行引用,必须先赋值,否则编译会不通过
2.6.3 static 关键字
引入static关键字的原因:
1.只想为某特定区域分配单一的存储空间,而不去考虑他创建多少个对象,甚至压根就不需要创建对象.
2.希望某个方法不与包含他的任何对象关联在一起.也就是说,即使没有创建对象,也能调用这个方法.
public class StaticTest {
static String i = new String("474747");
public static void main(String[] args) {
StaticTest test1 = new StaticTest();
StaticTest test2 = new StaticTest();
System.out.print(test1.i == test2.i ? "同一个存储空间" : "不同存储空间");
}
}
//输出结果...
同一个存储空间
2.8注释和嵌入式文档
javadoc: 他是便于提取注释的工具,生成的文档是html格式.如果想对javadoc处理过的信息执行特殊操作,可以编写自己的”doclets”的javadoc处理器来实现.
2.8.2 语法
javadoc 有两种格式: 1.嵌入html 2. 使用”文档标签”.独立”文档标签”是由@开头,在注释行的最前端,”行内文档标签”可以出现注释行任何地方,以@开头,需要在花括号内{@xxx}
javadoc默认 只能为 public,protected成员进行文档注释,private 和 缺省修饰符的包间访问成员默认会忽略,但是可以采用 -private 标记,以便让 private 成员注释也包括在内.
2.8.3 嵌入式HTML
所有类型的注释文档,类,域,方法都支持嵌入式HTML.