——Thinking in Java 3th
■ 我们将问题空间的元素同它在解决空间的表述称为“对象”。
从理论上讲,你可以把所有待解决的问题中的概念组件都表示成程序里的对象。
任何对象都是某个类的实例(instance of a class),对象有状态,行为和标识。
所有属于同一类型的对象能接受相同的消息。
类同数据类型的区别在于,类是程序员为解决特定的问题而定做的,而数据类型是为了表示机器的存储单元而设计的,它是现成的。
■ 开发一个程序时,理解对象的最佳方式是把它们当作“服务的提供者”。能提高对象的内聚性(cohesion)。每个对象都应该只做一件事,并且作好一件事。从而设计出能复用的对象。
用已有的类来合成新的类,这一概念被称为合成(composition),如果这个对象是动态合成的,通常把它称为聚合(aggregation).在创建新类的时候,应该优先考虑使用合成。
■ abstract关键字 也可以用来表示这个方法还没有实现,就象一个声明“由这个类所派生出的所有的类都有这个方法,但是它的实现不在这里”的存根。abstract方法只能存在于abstract类里。如果有个类继承了这个个abstract类,那么它要么实现这个方法,要么也是一个abstract类。abstract方法能让你将方法放到接口而不必为它写一些无意义的代码。
■ interface关键字
是对abstract类的概念的深化,它不允许你实现任何的方法。能彻底地将接口和实现分离开来。此外如果你愿意,还可以继承多个接口,以为要继承多个类是不允许的。
■ 对象的创建
1.写代码的时候决定将它放到栈里或者静态存储区域。
2.在一个被称为堆的内存池里动态地创建对象。这时候,只有到了运行时,你才知道对象的数量,寿命以及其确切的类型。它们都是在程序运行的一刹那决定的。这种动态分配的方法是建立在这样一个假设的基础上:对象都比较复杂,与创建对象相比,分配释放空间这点开销对性能来说不足道。
■ collection和迭代器iterator?? weastsea注(1)
这种通常被称为容器的新对象可以根据需要扩容,以便让你放进所有的东西。你无需知道要向容器里边放多少东西。创建一个容器,它会自己照料一切。OOP语言有自己的容器类。
■ 单根继承体系 所有的类都继承于同一个根类:Object。
异常处理 垃圾回收 参数传递 优势。
■ 下传 摸板/泛型 参数化类型?
多线程的支持是在对象级别,因此线程被表示成对象。它能锁定任何对象的内存,确保同一时刻只有一个线程访问这些内存。由synchronized关键字来实现。
■ Persistence? 如果对象能够永生。在存储和提取的过程中,必须明确地进行调用。它既可以通过对象的序列化(object serialization)也可以通过Java Data Objects.?
Java中有三个特殊的变量:null,this和super,这三个变量是所有的类都可以使用的,用来指示一些特定的对象。
null相当于“空”,可以用来代指任何对象,但没有实例。如
Rectangle r=null;
封装性、多态性、继承性、动态链接
不再有函数、不再有指针、不再有多重继承
不再有#include 和#define 等于处理功能
不再有structure,union及typedef
不再有goto
不再有操作符重载(Operatior Overloading)
取消自动类型转换,要求强制转换
-char
-numeric
??? ?-integral
????????????? ?-byte?????????8
???????????????-short?????? ?16
????????????? ?-int?????????? ?32
????????????? ?-long?????????64
??? ?-floating-point
???????????? ?-float??????????32
??????????????-double?????? 16
-boolean
-reference
???? ?-class
???? ?-interface
???? ?-array
在Java中”引用“是指向一个对象在内存中的位置,在本质上是一种带有很强的完整性和安全性的限制的指针.?
当你声明某个类,接口或数组类型的一个变量时,那个变量的值总是某个对象的引用或者是null引用.?
能够动态取得的内存有两种,一种是对象实体,一种数组.?
数组变量实际上是一个引用变量,因此要实例化才能使用。?
例:int Array[]; Array=new int[8];
例1:将实型数转换成字符串? System.out.println(String.valueOf(Math.PI));
str1=str2;? 是指两个引用指向同一个地址.? str1.equals(str2) 是指两个字符串内容相等.
例:StringBuffer sb=new StringBuffer(“Drink Java!”);
??? ?sb.insert(6,”Hot ”);
??? ?System.out.println(sb.toString());
常犯的错误A有一个B吗? 例如让汽车轮子成为汽车的子类是错误的
何时选择继承性?
一个很好的经验: “B是一个A吗?” 有两种办法来区分派生类和基类。1,直接往派生类里加新的方法。也就是说加上基类不能完成的所有的工作。要仔细看看基类是不是也需要这些方法。2,复写(override),即用基类里的方法为新类做一些不同的事。
类的定义:public? abstract? final?? 方法和变量的定义:public private protected
abstract类不能直接产生属于这个类的对象
final类不能被其他任何类所继承(安全的考虑) final在方法之前,防止该方法被覆盖.final在类之前,标是该类不能被继承 final在变量之前,定义一个常量.
public类不但可以被同一程序包中的其它类使用,别的程序包中的类也可以使用.
friendly(缺省)类只能被本包中的其它类使用
如果一个类中变量或方法有修饰字protected,同一类,同一包可以使用。不同包的类要使用,必须是该类的子类可以存取变量或调用
■ 数组
int a[];
int []a; //JAVA中允许[]前置
int []a=new int[3]; //下标从0开始
■ 动态绑定(dynamic binding)
例 Man
┌────┼────┐
China ?? America??????? Japan
类Man中有方法speak。类China,America,Japan为类Man的子类,他们各自重写了继承自Man的方法speak。声明x为类
Man的一个对象,则在执行时将根据接收者x的实际类型是什么(China,America或Japan或Man)来决定x.speak的实际执行代码。
■ abstract
如果一个类被声明为abstract,那么它是一个抽象的类,不能被实例化生成自己的对象,通常只是定义了它的子类共有的一些变量和方法供继承使用。被声明为abstract的抽象类往往包含有被声明为abstract的抽象方法,这些方法由它的非抽象子类完成实现细节.被声明为abstract的方法不需要实际的方法体,只要提供方法原型接口,即给出方法的名称、返回值类型和参数表,格式如下:
abstract 返回值类型 方法名(参数表);
定义了abstract抽象方法的类必须被声明为abstract的抽象类。
■ final
如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为abstract的,又被声明为final的。如果不明显地写出继承的父类名,则缺省地认为所声明的类是Java的Object类的一个子类。Object类是Java中所有的类的祖先类。
■static
被声明为static的变量和方法是属于类而不是属于对象的。不管这个类产生了多少个对象,它们都共享这个类变量或类方法。我们可以在不创建类实例对象时直接使用类变量和类方法。一般来说,在Java中,引用一个特定的变量或方法的形式是:
对象名.变量名
对象名.方法名
例如:
int a=rectangle.length;
g.drawString(“Welcome to Java World!”);
即变量和方法是受限于对象的,但声明为static的变量或方法受限于类,使用形式是
类名.变量名
类名.方法名
例如:
?? ?String s=String.valueOf(123);
附录:Javac命令行选项
??????? Javac的命令格式如下:
javac [options] filename.java
-classpath path
指定javac用来寻找类的路径,它将置换隐含的和CLASSPATH环境变量中的设置,目录之间用分号隔开,路径的一般格式为:
.;
例如:
.;\user\avh\classes;\jdk\classes
-d directory
定义产生class层次的根目录,如下面命令;
javac -d
由MyProgram.java产生的.class文件将被放在目录my_dir下。
-g
产生调试表。调试表中包含有行号和局部变量的信息,这些信息由调试工具使用,默认情况下,当-O选项被置上时,仅产生行号信息。
-nowarn
关闭警告信息。如果使用此选项,编译器将不输出任何警告信息。
-O
通过嵌入static、final和private方法优化编译代码。将优化程序的执行速度,此时,生成的类文件可能大一些,这对要求传送速度较高的程序,如applet,是不利的。
-verbose
使编译器、装配器打印出源代码文件、字节代码类文件的有关信息。
-deprecation
当使用比现有JDK版本陈旧的API编程,如编程使用的类和方法属于JDK1.0版,而编译使用的JDK为1.1版,则选择该选项会给出对应的“过时”方法警告信息。
Javac支持通配符 如:
javac *.java
-bootclasspath <路径> 覆盖自举类文件的位置
-extdirs <目录(多个)> 覆盖安装的扩展类的位置
-encoding <编码> 指定源文件中所用的字符集编码
-target <版本> 生成指定虚拟机版本的类文件
?