本文主要是介绍[HeadFirst] Static Memeber Final Rules,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. Static Member
static kw标记出不需要类实例的方法。一个静态方法代表说“一种不依靠实例变量也就是不需要对象的行为”。
静态变量 - 静态方法
实例变量 - 实例方法(这里的实例指的是只能通过实例访问的非静态的变量和方法)
1.1 静态方法不能调用实例变量(非静态的变量)
静态的方法是不知道堆上有哪些实例的,因为静态方法没有维护一个对象的引用(即指向堆对象的指针)。
1.2 静态方法也不能调用实例方法(非静态的方法)
non-static method cannot be referenced from a static context.
1.3 静态变量可以被实例方法调用
因为,静态变量是全局变量,为所有实例共享(同一类所有的实例共享一份静态变量),对所有实例可见且值是相同的。
静态变量是在类被加载时初始化的。JVM load 通常是因为第一次有人尝试要创建该类的新实例,或是使用该类的静态方法或变量。
静态项目的初始化欧两项保证:
1. 会在该类的任何对象创建之前就完成了初始化。
2. 会在该类的任何静态方法执行之前就初始化。
如果没有给静态变量赋值(只有static kw,而不是static final的),它就被设定为默认值。
2. 静态的final变量是常数
静态变量的名字应该都是大写字母
2.1 static initializer(静态初始化程序),是一段在加载类时会执行的程序代码,它会在其他程序使用该类之前就执行,所以很适合放静态final变量的起始程序。
如:
public class Foo {final static int x;static {x = 42;}
}
上面的static {}就是 static initializer
因此,有两种方式可以初始化static final变量。
第一种就是上面的,第二种就是在声明的时候同时初始化。
注意:
static还可以用在import语句中,方便引用imported class的实例,例如:
<pre name="code" class="html">import static java.lang.System.*; // new kind of import statement
...
public static void testTry_catch_finally(){
try {
out.println("try block");
throw new IOException("Test: try-catch-finally");
// out.println("Exception occurs. Never invoked"); // Java compiler error: unreachable statment
} catch (IOException e){
err.println(e.toString());
// return;
System.exit(-1);
}finally {
out.println("finally block");
}
}
像上例中,如果频繁引用对象err,out那么就可以使用import static的语法,否着就没有必要了。
2.2. final 的用处
1. static final variable --- 声明常数(如上)
2. non-static final variable --- 表示其值不能被修改
3. final method --- 表示该方法不能被override, 但是可以被overwrite。
覆盖(Override) :若是在父类中调用的办法,在子类中覆盖了这个办法,那么在,在父类调用的办法,其实就是子类的办法。
覆盖(Overwrite):改写现存的文本,删除用新的文本替代现存的文本。
4. final class --- 表示该类不能被继承
如String
public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {
如果一个类被标记为final class,那么类的方法就没有必要再加上final了。
final public class Foo { // non-extendedfinal int x = 3; // 不能不修改,但每个实例都有属于自己的一个。所以更多倾向于将其声明为static final的变量final void testFinal(){ //non-override//...}final static int CONST; // static final的变量,因为不可变,所以可以被所有实例共享static {CONST = 42;}
}
这篇关于[HeadFirst] Static Memeber Final Rules的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!