相比于其他语言面向对象程序设计语言, Java是一种更纯粹的面向对象程序设计语言
2.1 用引用操作对象
一切都被视为对象,可以采用单一固定的语法。类比于遥控器(引用)操纵电视机(对象);
拥有一个引用,并不一定需要一个对象与之关联。类比于即使没有电视机,遥控器也可以独立存在。
为了安全起见,创建一个引用的同时便进行初始化;可以这样:String s="asdf";但更通用的做法是:String s=new String("asdf");
2.2必须由你创建所有对象
通过new关键字创建所需对象:String s=new String("asdf");
2.2.1 存储在什么地方:程序运行时对象时怎样放置安排的?内存是怎样分配的?
1)寄存器:最快的存储区
2)堆栈:位于通用RAM(随机访问存储器)中,通过堆栈指针可以从处理器哪里获得支持,这是一种快速有效的分配存储方式,仅次于寄存器。创建程序时,Java系统必须知道存储在堆栈内的所有项的生命周期,以便上下移动堆栈指针,这一约束限制了程序的灵活性,所以虽然某些数据存储在堆栈中——特别是对象引用,但是对象并不存储其中。
3)堆:一种通用的内存池(也位于RAM中),存储所有对象。
4)常量存储:常量值通常直接存储在程序代码内部。
5)非RAM存储:存储完全存活于程序之外的数据。流对象和持久化对象。
2.2.2特例:基本类型——不用new来创建,直接向C++语言那样使用基本类型,Java SE 的自动包装功能将自动地将基本类型转化为包装器类型。
程序举例:(Java编程思想第二章练习9)编写一个程序,展示自动包装功能对所有的基本类型和包装器类型都起作用。、
public class AutoboxTest {运行结果:
public static void main(String[] args) {
//自动包装功能对所有的基本类型都起作用
boolean b = false;
char c = 'x';
byte t = 8;
short s = 16;
int i = 32;
long l = 64;
float f = 0.32f;
double d = 0.64;
//自动包装功能对所有的包装器类型都起作用
Boolean B = b;
Character C = c;
Byte T = t;
Short S = s;
Integer I = i;
Long L = l;
Float F = f;
Double D = d;
System.out.println("boolean b = " + b);
System.out.println("Boolean B = " + B);
System.out.println("char c = " + c);
System.out.println("Character C = " + C);
System.out.println("byte t = " +t);
System.out.println("Byte T = " +T);
System.out.println("short s = " + s);
System.out.println("Short S = " + S);
System.out.println("int i = " + i);
System.out.println("Integer I = " + I);
System.out.println("long l = " + l);
System.out.println("Long L = " + L);
System.out.println("float f = " + f);
System.out.println("Float F = " + F);
System.out.println("double d = " + d);
System.out.println("Double D = " + D);
}
}
高精度数字:Java提供了两个用于高精度计算的类:BigInteger、BigDecimal
2 2.3 Java中的数组
Java确保数组会被初始化(null),而且不能在他的范围之外被访问。以安全和效率来换取少量数组下标检查和内存开销,是值得的。
2.3永远不需要销毁对象
2.3.1作用域:和c++中的作用域类似。
{这在Java中是不允许的。
int x=12;
{
int x=36;
}
}
2.3.2对象的作用域
Java对象不具备和基本类型一样的生命周期,当用new创建一个对象时,他可以存活于作用域之外。
Java有一个垃圾回收器,用来监视用new创建的所有对象,并辨别哪些不会再被引用的对象,随后释放这些内存空间,以便供其他对象使用。
2.4创建新的数据类型:类
创建类:class ATypeName {/* class body*/}
创建该类的对象: ATypeName a= new ATypeName();
2.4.1 字段和方法
字段:数据成员(可以是基本类型,也可以是其他类型的引用:必须初始化该引用,以便使其与一个基本对象相关联)。
方法:成员函数
基本成员默认值:
程序举例:(Java编程思想第二章练习1)创建一个类,检验java执行所有的基本类型的默认初始化。
public class DataOnlyTest {运行结果:
public static void main(String[] args) {
class DataOnly {
boolean b;
char c ;
byte t;
short s;
int i ;
long l ;
float f;
double d;
void show() {
System.out.println(b);
System.out.println(c);
System.out.println(t);
System.out.println(s);
System.out.println(i);
System.out.println(l);
System.out.println(f);
System.out.println(d);
}
}
DataOnly data = new DataOnly();
data.show();
}
}<strong>
</strong>
2.5方法、参数和返回值:类似与c++.
2.6 构建一个java程序
2.6.1 名字可见性
2.6.2 运用其他构件:用关键字import来准确地表示你想要的类是什么;该关键字指示编译器导入一个包,也就是类库。
使用规则: import java.unti.ArrayList; 告诉编译器你想要Java的ArrayList类,该类包含在类库unti中,但是有时你需要用到unti中的好几个类,这样就显得麻烦好多,所以可以这样: import java.unti.*;
2.6.3 static关键字
通常来说,当创建类时,就是在描述那个类的对象的外观和行为,除非用new创建那个类的对象,否则,实际上并未获得任何对象。执行new来创建对象时,数据存储空间才被分配,其方法才供外接使用。
有两种情形上述方法无法解决:1)指向卫某特定域分配单一存储空间,而不去考虑究竟要创建多少个对象,甚至根本就不许创建任何对象。
2希望某个方法不会与包含他的类的任何对象关联在一起。也就是说,即使没有创建对象,也能使用该方法。
通过static关键字可以满足这两方面的要求。
引用static变量的两种方法:1)可以通过一个对象去定位他; 2)通过类名直接引用。类似逻辑可以应用与静态变量。
程序举例:(Java编程思想第二章练习8)编写一个程序,展示无论你创建了某个特定类的多少个对象,这个类中的某个特定的static域只有一个实例。
class StaticTest {
static int i = 47; //静态字段
Incrementable {static void increment() { StaticTest.i++; } //静态方法
public class ITest {public static void main(String[] args) {System.out.println("StaticTest.i= " + StaticTest.i);StaticTest st1 = new StaticTest();StaticTest st2 = new StaticTest();System.out.println("st1.i= " + st1.i);System.out.println("st2.i= " + st2.i);//通过对象调用increment();Incrementable sf = new Incrementable();sf.increment();System.out.println("After sf.increment() called: ");System.out.println("st1.i = " + st1.i);System.out.println("st2.i = " + st2.i);//因为increment()是一个静态方法,所以可以通过类直接调用Incrementable.increment();System.out.println("After Incrementable.increment called: ");System.out.println("st1.i = " + st1.i);System.out.println("st2.i = " + st2.i);}}运行结果:
2.7你的第一Java程序:该程序显示现在的时间。用到了Data类。
//: object/HelloDate.java
import java.util.*;
/** The first Thinking in Java example program.
* Displays a string and today's date.
* @author RobortZhao
* @version 4.0
*/
public class HelloDate {
/** Entry point to class & application.
* @param args array of string arguments
* @throws exceptions No exceptions thrown
*/
public static void main(String[] args) {
System.out.println("Hello, it's: ");
System.out.println(new Date());
}
} /* Output: (55% match)
Hello, it's:
Wed Oct 05 14:39:36 MDT 2005
*///:~
2.8 注释和嵌入式文档
2.8.1 注释文档 :javadoc用于提取注释,输出一个HTML文件,可以用web浏览器查看。
2.8.2 语法
2.8.3 嵌入式HTML
2.8.4 一些标签示例
2.8.5 文档示例:第一个java程序中已用到。