一.请依据代码的输出结果,自行总结Java字段初始化的规律
1 public static void main(String[] args) { 2 3 InitializeBlockClass obj=new InitializeBlockClass(); 4 System.out.println(obj.field); 5 6 obj=new InitializeBlockClass(300); 7 System.out.println(obj.field); 8 } 9 10 } 11 12 class InitializeBlockClass{ 13 //下面这句在初始化块之前与之后,会影响到field字段的初始值 14 //public int field=100; 15 16 { 17 field=200; 18 } 19 public int field=100; 20 public InitializeBlockClass(int value){ 21 this.field=value; 22 } 23 public InitializeBlockClass(){ 24 25 } 26 }
运行结果:
结论:初始化第一次是用了类的初始化块,第二次用了public的int初始化,所以第二次覆盖了第一次,输出了100;
在main函数中给类InitializeBlockClass赋初值300,所以覆盖100,输出300;
所以类的初始化有类的初始化块,还可以直接在类中赋值,还可以用一个函数为类的属性赋值,还可以构造函数。
二.当多个类之间有继承关系时,创建子类对象会导致父类初始化块的执行。
public class Inherit extends Father{ public static void main(String[] args) { // TODO Auto-generated method stub Inherit x; x = new Inherit(); } } class Father{ { int i = 100; System.out.println(i); } }
运行结果:可知创建主类对象的时候,也把主类的父类初始化块执行了。
三.静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员。
方法(1):
public class Employee { static int n = 200; //静态变量 public static void main(String[] args) { New e = new New(); n = e.Shi(); //将实例变量赋值给静态变量 New.Jing(n); // } } class New{ int m = 100; //实例变量 int Shi(){ int x; x = m; return x;//实例函数,返回一个实例值 } static void Jing(int x){ System.out.println(x); //输出静态变量 } }
结果截图:
方法(2):
public static void main(String[] args) { New e = new New(); /*n = e.Shi(); //将实例变量赋值给静态变量*/ e.Shi(); New.Jing(); } } class New{ int m = 100; //实例变量 static int n = 200; void Shi(){ n = m; //实例函数,返回一个实例值 } static void Jing(){ System.out.println(n); //输出静态变量 } }
结果截图:
四.使用类的静态字段和构造函数,我们可以跟踪某个类所创建对象的个数。请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象?“
public class Employee { public static void main(String[] args) { New x = new New(); New y = new New(); New z = new New();//三个对象 New.Count();//输出数量 } } class New{ static int n ; New(){ n+=1; //每定义一个对象,n+1 } static void Count(){ System.out.println(n); //输出静态变量 } }
结果截图: