一、构造方法
1 public class Text { 2 public static void main(String[] args) { 3 Foo obj1= new Foo(5); 4 System.out.println(obj1.value); 5 } 6 } 7 class Foo{ 8 int value; 9 Foo(int initValue){ 10 value = initValue; 11 } 12 }
运行结果:
若主函数中改为:Foo obj1=new Foo();则程序会报错。因为,如果类提供了一个自定义的构造方法,将导致系统不再提供默认的构造方法。
并且,一个类中可以有多个构造函数,构造函数之间可以互相调用。
二、Java字段初始化
1 public class Text { 2 public static void main(String[] args) { 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 class InitializeBlockClass{ 11 { 12 field=200; 13 } 14 public int field=100; 15 public InitializeBlockClass(int value){ 16 this.field=value; 17 } 18 public InitializeBlockClass(){} 19 }
运行结果:
Java字段初始化规律系统会按顺序对Java字段进行初始化,如果有好几个方法都对同一个变量进行了初始化。Java会将最后一次的初始化结果赋给该变量。
三、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
1 public class Text{ 2 int a = 2;//实例变量 3 static int b = 3;//类的静态变量 4 public static void variable(){ 5 System.out.println("实例变量a = " + new Text().a); 6 //在静态方法中访问类的实例变量需首先进行类的实例化 7 8 System.out.println("静态变量b = " + b); 9 //在静态方法中可直接访问类的静态变量 10 } 11 public static void main(String[] args) { 12 Text.variable(); 13 Text test = new Text(); 14 System.out.println("结果是 :实例变量 = " + test.a);//访问实例成员 15 } 16 }
运行结果:
static修饰的在加载时是先于非静态的加载,也就是如果在static中如果调用了非静态的方法或变量会报错,因为此时非静态的方法和变量还不存在(可以这样理解) 。
在静态方法中访问类的实例变量需首先进行类的实例化,除了加static修饰,还可以先new创建一个对象,通过对象去调用成员方法和变量,如new A().test()。
四、请写一个类,在任何时候都可以向它查询“你已经创建了多少个对象。
1、创建一个类T;
2、定义一个静态整型变量number,使其记录创建对象个数;
3、定义构造函数,每当创建一个对象时,令number++;
4、在程序中定义一个函数showNum(),令其输出计量值number,即对象创建个数。
1 public class Text{ 2 public static void main(String[] args){ 3 T obj=new T(); 4 obj.showNum(); 5 obj=new T(); 6 obj.showNum(); 7 obj=new T(); 8 obj.showNum(); 9 } 10 } 11 class T{ 12 public static int number=0; 13 public T(){ 14 number++; 15 } 16 public void showNum(){ 17 System.out.println("第"+number+"个实例化对象!"); 18 } 19 }
运行结果: