1, Stack, heap, contructor
Stack: method invocations, local variables
所以在eclipse里查看stack trace,最上面的是当前调用的方法,当结束当前方法,其就会被移出stack.
variable: primitive, or non-primitive:Object
注意local variable如果是reference to object, stack只会存放reference,真正的object还是会在heap里面。
Heap: ALL objects[including instance variable]
instance variable不同于local var, 它是定义在class里,method外的变量。Default value of instance var: primitive 0/0.0/false, Reference null.
例如:在cellphone class里定义有instance variable Ant, 在cellphone object自己所占的堆空间中并不会存有Antenna object的,只会寸它的ref ant.
class Cellphone{ private Antenna ant = new Antenna(); //将object同ref连接起来
Constructor:
当自己不定义任何constructor时,compiler才会帮忙提供一个无参数的constructor。自己可以定义多个,有参+无参,overloaded constructor之间可用this(...)调用。
constructor和method的区别是没有return type. constructor不可以继承,一定要明确调用父类的constructor。
constructor chaining: 子类在实例化的时候一定要一层层往上调用父类的constructor. 例如stack最上面是Object(), Animal(), 最下面是Hippo()。
在一个constructor里面不可以同时call super()和this(...).
Variable life:
instance variable:跟object一样长。
local variable: 跟其所在的method在stack中待的时间一样长。
Reference var的life是只要Ref alive, object就alive in heap. Otherwise, abandoned by heap, reachable by GC.
Life z = new Life(); //这个z引用被赋予新值,或是被设为null,那原本的object就可以被GC了。
2, Java webservice:
实现方法JAX-WS
Webservice处理数据的方式是用Schema将XML定义成标准(即wsdl), WSDL(web service discription language)规范是一个描述接口,语义及web服务为了响应请求需要经常处理的工作的文档。
UUDI利用soap消息机制(XML/HTTP):用XML格式来封装各种数据,发送到注册中心,或由注册中心返回数据。
Steps: Request XML(SOAP) -> JAXB -> JAVA object -> JAXB ->Response XML(SOAP)
JDK中的wsimport是个工具,用来根据wsdl生成客户端代码。
小结:用java写好webservice以后,EndPoint.publish()可以将自己的webservice发布。在客户端,用wsimport生成webservice的客户端代码(生成的启动需要指明webservice的URL),然后就可以调用了。
JAXB: Java architecture for XML binding.
JAXB包括"xjc"工具:XML->JAVA, "schemagen"工具: JAVA->XML[JAXBContent:Marshaller].
3, Java advantage
Java的优点: friendly syntax, object-oriented features, memory management, portability.
Portability是指:Javac compile过的byte code是platform-independent的,只要平台上有VM就可以读取bytecode运行。
Java的起点:public static void main(String[] args)
4, Serialization
序列化可以将object保存起来,之后可以被java program读取。
Object ---> OjbectOutputStream(Chain stream) ---is chained to---> 0110001010(FileOutputStream, ConnectionStream) ---> file
FileOutputStream fileStream = new FileOutputStream("M.ser");
ObjectOutputStream os = new ObjectOutputStream(fielStream);
os.writeObject(01);
os.close();
保存object的意思是:保存了所有member的value, 如果instance variable指向其它object,它们也会被序列化。保存object的前提是这个object要implement Serializable Interface。保存object的时候可以选择只保存一部分变量: 用transient keyword,可令变量被skip。
Deserialization process: File->FileInputStream->ObjectInputStream->Object.
对于读写text file,可用FileWriter:
FileWriter writer = new FileWriter("Foo.txt"); writer.write("hello!"); writer.close();
要提高efficiency,可用BufferWriter,因为FileWriter每次写个String都会放到Disk的File里。用BufferedWriter,可以将String放入Buffer,Buffer满了再入File.
Object的class implements Serializable,有用到SerialVersionUID,这个UID是根据当前class算出来的,当Object被Desirialized时,这个ID会与JVM用的class的ID比较,相等才可以。
5,Java Numbers & Statics
Math.round()这些Math的methods都是static方法,所以不用Math类的Object即可使用。
使类不能实例化: Abstract class/private constructor.
final的作用:variable不能改值,method不能被override,class不能被继承。
primitive type:例如int, double,不是Object, 当需要Object时,可以将其wrap为Integer, Double, Character...这样就可以有null value,或作为Generic type。
两者可以自动转换,这些Integer/Double class的好处是提供了String和int, double...之间的转换方式:
int x = Integer.parseInt("2"); //Can throw NumberFormatException, runtime的
String y = Integer.toString(x);
6, Generic method:
public class ArrayList<E> extends AbstractList<E> ...{
public boolean add(E o);
public <T extends Animal> boolean add(ArrayList<T> list)
7, Same object
得是.hashcode()相同,或是.equals()成立。
HashCode是Java给Object基于Object‘s memory address on the heap. 所以没有两个object是相同的hashcode,但你可以override它。最好是当你的class是value object的时候,(即值相等,物体即可相等),才有需要override .equals()方法。
I1: Static factory methods:
除了用constructor构建object外,就是用static factory method了。优点:method name可以设计的更易懂, 不必每次call都生成新的object,Return type可以不必是当前class本身而是其subclass(例如Collections全都是static methods返回其它Collection class).
a, valueOf(param) 返回与param相同值的class instance.
b, getInstance 包括Singleton
c, newInstance 保证返回的instance与其它的都不同
I2: 针对太多constructor params的Builder方法
当一个class有太多params给constructor/static factory的时候,选择Builder pattern是好的。
public class A{
private final int a1, a2...
public static class Builder{
private final int a1, a2...
public Builder(int a1, int a2) {this.a1 = a1; this.a2= a2;}
可选的 public Builder a3(int a3) {this.a3=a3;return this;}
...
}
private A(Builder builder) {a1 = Builder.a1; a2 = Builder.a2;...}
}
I3: Singletong:
1, public class A{
public static final A INSTANCE = new A();
private A() {...}
}
用public static final field A.INSTANCE.
2,用static factory method.
public class A{
private static final A INSTANCE = new A();
private A() {...}
public static A getInstance() { return INSTANCE;}
}
I4:有时你会需要设计class只包含一堆static methods, static fields, 这种class不是被instantiated的,有instance不合理,所以可以用private constructor.
I5:
An Object can always be reused if it is immutable. 例如String s = "stringette";每次执行时,不会重新建立新的,但是String s = new String("stringette");会建立新的
By using factory methods on immutable classes: 例如Boolean.valueOf(String)就不会建新的,而Boolean(String) constructor会建立新的。
Reuse mutable objects if you know they won‘t be modified.例如一个class A里的isBabyBoomer()方法里有建立新的Calendar Date objects, 它们也不会被改变,每次call时都一样,就可以把它们拿出来放在class A里Static{ }里面。
Prefer primitives to boxed primitives, and watch out for un-intentional autoboxing.