于类,不属于任何对象,但对象可以获得它。
类的静态变量由(该类的)所有对象所共享。
静态方法通过类名调用,静态变量通过类名存取 。
如果类只有静态方法,则可以将构造函数标记为private的,以免被初始化
Java常量 = final static 的变量
final意味着不能被改变,static意味着是静态变量。
插一句字符串的格式化:
String.format(格式化说明)
格式化说明包括5部分,%和type是必要的
%[argument number] [flags] [width] [.precision] type
如: %,6.1f 为6位逗号分隔,1位小数的浮点数
谈谈异常吧,谁能保证自己的程序不出问题呢?与其系统运行的时候报一大堆乱七八糟的错误trace,早早地预见并处理一下,以自己的方式处理或者打印它,总要漂亮些吧?甚至可以在抓到异常后,给出“没关系,一个小错误,已经报告给开发者~”这样温和的语句,是不是显得b格很高?……
异常中要注意的点有:
可能会抛出异常的方法必须声明成throws Exception
catch捕获多个异常时,要从小排到大,因为大异常后面的小异常根本没有被catch的机会
在方法后加上throws xxException,没有try/catch块,表示可能会抛出异常,自己并不处理,需要调用方自己处理异常
所以>>>要么处理,要么声明(异常)
序列化对象:有时候需要保存一下对象,以便于恢复,被调用,而不用重新生成,因为生成过程可能很麻烦。
要序列化的话,对象必须可序列化,且对象中实例变量所引用的对象甚至对象引用的对象…都必须可以序列化,简而言之,整个对象版图都必须可以序列化
如果某实例变量不需要或者不能被序列化,那可以把它标记为transient(瞬时)的。
解序列化时,transient变量会恢复成null对象引用或者0,false等primitive默认值
静态变量不会被序列化,对象被还原时,静态变量会维持类中原本的样子。因为所有对象共用一份静态变量。
读取对象的顺序必须与写入的顺序相同
序列化对象:
FileOutputStream fileStream = new FileOutputStream("MySer.ser")
ObjectOutputStream os = new ObjectOutputStream(fileStream)
os.writeObject(obj)
os.close()
或者不序列化,而是将信息写入文本文件:
BufferedWriter writer = new BufferedWriter(new FileWriter(file)) // file is a File object
writer.write(...)
可以把File想象成文件的路径,代表磁盘上的某个文件,但并不是文件内容
BufferedWriter writer = new BufferedWriter(new FileWriter(file)) // file is a File object
这句代码形成如下链接:
字符串 --> BufferedWriter --> FileWriter --> File
对象序列化以后,类继续演进,这时会出现无法还原的情况。通过将serialVersionUID放在class中,让类在演化过程中维持同样的ID,可以保证还原的时候能够识别,从而正确还原出对象。但要注意有些修改会损害解序列化。
好吧,先说到这,其实还有一些内容,网络,集合与泛型,以及许多高级特性,反射,虚拟机的深入理解等等,后面再说吧。
Reference
*《Head First Java》