第二章 一切都是对象

向后兼容(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所有数值类型都是有符合数.

image.png

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.

你可能感兴趣的:(第二章 一切都是对象)