static 属性与 instance 属性,初始化的时机是不同的。 instance 属性在创建实例的时候初始化,static 属性在类加载,也就是第一次用到这个类 的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进 行详细讨论。
对于第二种变量,必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译 器会抗议。如果初始化的语句在 try 块中或 if 块
中,也必须要让它在第一次使用前一定能 够得到赋值。也就是说,把初始化语句放在只有 if 块的条件判断语句中编译器也会抗议, 因为执行的时候可能不符合 if 后面的判断条件,如此一来初始化语句就不会被执行了,这 就违反了局部变量使用前必须初始化的规定。但如果在 else 块中也有初始化语句,就可以 通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化 的事情。对于 try-catch 也是一样,如果只有在 try 块里才有初始化语句,编译部通过。如 果在 catch 或 finally 里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被 初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成 什么值好,就用上面的默认值吧! 其实第三种变量和第二种本质上是一样的,都是方法中的局部变量。只不过作为参数, 肯定是被初始化过的,传入的值就是初始值,所以不需要初始化。 问题六:instanceof 是什么东东? instanceof 是 Java 的一个二元操作符,和==,&;gt; , &;lt;是同一类东东。由于它 是由字母组成的,所以也是 Java 的保留关键字。它的作用是测试它左边的对象是否是它右 边的类的实例,返回 boolean 类型的数据。举个例子: String s = I AM an Object!; boolean isObject = s instanceof Object; 我们声明了一个 String 对象引用, 指向一个 String 对象, 然后用 instancof 来测试它 所指向的对象是否是 Object 类的一个实例, 显然, 这是真的, 所以返回 true, 也就是 isObject 的值为 True。 instanceof 有一些用处。比如我们写了一个处理账单的
系统,其中有这样三个类: public class Bill {//省略细节} public class PhoneBill extends Bill {//省略细节} public class GasBill extends Bill {//省略细节} 在处理
程序里有一个方法,接受一个 Bill 类型的对象,计算金额。假设两种账单计算 方法不同,而传入的 Bill 对象可能是两种中的任何一种,所以要用 instanceof 来判断: public double calculate(Bill bill) { if (bill instanceof PhoneBill) { //计算电话账单 } if (bill instanceof GasBill) { //计算燃气账单 } ... }
这样就可以用一个方法处理两种子类。 然而, 这种做法通常被认为是没有好好利用面 向对象中的多态性。 其实上面的功能要求用方法重载完全可以实现, 这是面向对象变成应有 的做法,避免回到结构化编程模式。只要提供两个名字和返回值都相同,接受参数类型不同 的方法就可以了: public double calculate(PhoneBill bill) //计算电话账单 } {
public double calculate(GasBill bill) { //计算燃气账单 } 所以,使用 instanceof 在绝大多数情况下并不是推荐的做法,应当
好好利用多态。
第一, 的区别。 第一,谈谈 final, finally, finalize 的区别。 final?修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生 出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的, 又被声明为 final 的。将变量或方法声明为 final,可以保证它们在使用中不被 改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读 取,不可修改。被声明为 final 的方法也同样只能使用,不能重载。 finally?再异常处理时提供 finally 块来执行任何清除操作。如果抛出一 个异常, 那么相匹配的 c