第二十四讲
- 对于final类型成员变量,一般来说有两种赋初值方式:
- 在声明final类型的成员变量时就赋上初值。
package exercise;
public class exercise009 {
final int a = 0;
}
2. 在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋上初值。
package exercise;
public class exercise009 {
final int a;
public exercise009(){
a = 0;
}
public exercise009(int a){
this.a = a;
}
}
- static 代码块:静态代码块。静态代码块的作用也是完成一些初始化工作。首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行;要想调用某个类来生成对象,首先需要将类加载到Java虚拟机上(JVM),然后由jvm加载这个类来生成对象。
package exercise;
public class exercise009 {
public static void main (String[] args){
P p = new P();
P p2 = new P();
}
}
class P{
static {
System.out.println("static block");
}
public P(){
System.out.println("P out");
}
}
package exercise;
public class exercise009 {
public static void main (String[] args){
new S();
}
}
class P{
static {
System.out.println("P static block");
}
public P(){
System.out.println("P out");
}
}
class Q extends P{
static {
System.out.println("Q static");
}
public Q(){
System.out.println("Q out");
}
}
class S extends Q{
static {
System.out.println("S static");
}
public S(){
System.out.println("S out");
}
}
3. 类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所有静态代码块也只会被执行一次;而构造方法则不然,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。
4. 如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层的类的静态代码块,一直执行到最底层类的静态代码块。注意:静态代码块只会执行一次 。
5. 不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量。可以在非静态方法中访问静态的成员变量。
package exercise;
public class exercise010 {
public static void main (String[] args){
W.change();
}
}
class W {
static int a = 10;
public static void change(){
a++;
}
}
- 总结:静态的只能访问静态的;非静态的可以访问一切
- 不能在静态方法中使用this关键字。