1.源代码:
public class InitializeBlockDemo {
/**
* @param args
*/
public static void main(String[] args) {
InitializeBlockClass obj=new InitializeBlockClass();
System.out.println(obj.field);
obj=new InitializeBlockClass(300);
System.out.println(obj.field);
}
}
class InitializeBlockClass{
//下面这句在初始化块之前与之后,会影响到field字段的初始值
//public int field=100;
{
field=200;
}
public int field=100;
public InitializeBlockClass(int value){
this.field=value;
}
public InitializeBlockClass(){
}
}
输出结果:
请依据代码的输出结果,自行总结Java字段初始化的规律:
静态字段/实例字段可以在声明时同时赋初值,也可以在静态/实例代码块中初始化,或者在构造方法中赋初值。
Java类初始化时,首先初始化静态字段,故在给实例字段赋初始值时,可以引用类中定义的静态字段(包括从父类继承的静态字段)。反之不成立。
字段的初始化按位置顺序执行,故后续位置的字段的初始化,可以使用之前初始化的字段。但如果在字段初始化中使用后续的字段,则会产生编译错误。
常量字段只能被赋值一次,否则会产生编译错误。
在创建第一个实例或引用任何静态成员之前,将自动调用静态初始化代码块,执行静态初始化;在创建第一个实例时,将自动调用实例初始化代码块,执行实例初始化。类的静态初始化在给定的程序中至多执行一次,对象的实例初始化则每次创建对象都要执行。
2.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。请自行编写示例代码验证以上结论。
public class Jicheng {
public static void main(String[] args){
Stu s = new Stu();
s.print();
}
}
class Student{
String name;
int age;
{
name="huangyi";
age=19;
}
}
class Stu extends Student{
int grade=100;
void print()
{
System.out.println("name:"+name+"\nage:"+age+"\ngrade:"+grade);
}
}
结果截图:
3.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
静态方法中不能直接访问同一类中的非静态成员,而必须先创建对象,再通过对象访问成员。
using
System;
class
App
{
static
int
i;
private
static
void
Main()
{
App t =
new
App();
t.test();
Console.ReadKey();
}
private
void
test()
{
i = 10;
Console.WriteLine(i);
}
}
public class Test3 {
private static int i = 0;
public Test3()
{
i++;
}
public static int getNumber()
{
return i;
}
public static void main(String[] args) {
Test3 t1 = new Test3();
Test3 t2 = new Test3();
Test3 t3 = new Test3();
Test3 t4 = new Test3();
System.out.println("一共创建了" + Test3.getNumber() + "个对象");
}
}
结果截图:
原文:http://www.cnblogs.com/hyluckydog/p/4885907.html