26.final 类型成员变量赋初值方式
a).在声明final类型的成员变量时赋初值
b).在声明final类型的成员变量时不赋初值,但在类的所有构造方法中都为其赋初值。
public class FinalTest4
{
final int a;//无法编译。未赋初值。
}
public class FinalTest4
{
final int a;//可编译。虽然声明final类型的成员变量时未赋值,但在类的构造方法中赋值。注意:需要在类的所有构造方法中为其赋初值。
public FinalTest4()
{
a = 0;
}
public FinalTest4(int a)
{
this.a = a;
}
}
27.static代码块:静态代码块,也是完成一些初始化工作。
首先执行静态代码块,再执行构造方法:静态代码块在类被加载时执行,而构造方法是在生成对象时执行。要想调用某个类来生成对象,首先需要将类加载到Java虚拟机上(JVM),然后由JVM加载这个类来生成对象。
28.类的静态代码块只会执行一次:在类被加载时执行,而每个类只会被加载一次。
而构造方法则不然:在每生成一个对象时都调用类的构造方法,所有new一次就会调用一次构造方法。
public class StaticTest4
{
public static void main(String[] args)
{
new S();//首先执行静态代码块,再执行构造方法。
new S();//类的静态代码块只会执行一次,而构造方法在每生成一个对象时都调用类的构造方法。
}
}
class P
{
public P()
{
System.out.println("P constructor");
}
static
{
System.out.println("P static block");
}
}
class Q extends P
{
public Q()
{
System.out.println("Q constructor");
}
static
{
System.out.println("Q static block");
}
}
class S extends Q
{
public S()
{
System.out.println("S constructor");
}
static
{
System.out.println("S static block");
}
}
29.不能在静态方法中访问非静态成员变量;可以在静态方法中访问静态的成员变量;可以在非静态方法中访问静态的成员变量。
总结:静态的可访问静态的,非静态的可访问一切。
不能在静态方法中访问this关键字。
public class StaticTest5
{
public static void main(String[] args)
{
W.change();
}
}
class W
{
int a = 10;
public static void change()
{
a++;
}
}
public class StaticTest5
{
public static void main(String[] args)
{
W w = new W();
W.change();
}
}
class W
{
static int a = 10;
public static void change()
{
this.a++;//不能在静态方法中使用this关键字。
}
}