02_类与对象——动手动脑
1、下列代码为何编译不通过
1 public class test { 2 3 public static void main(String[] args) { 4 // TODO Auto-generated method stub 5 6 Foo obj1 = new Foo(); 7 } 8 9 class Foo 10 { 11 int value; 12 public Foo(int initValue) 13 { 14 value = initValue; 15 } 16 } 17 }
出现不能编译的主要为第六行,原因是在类中定义了同名的构造函数,但是参数不一样,默认构造函数在有自定义的构造函数后取消作用所致。
2、
输出结果为:
100
300
Java进行初始化总共有两个地方,一个是初始化块,另一个则为构造函数,如果在主函数中创建对象时没有形参时,如果在类中定义了公共的变量并给与了赋值,那么就会把值赋给主函数中的变量,再调用类中的默认构造函数,如果在主函数中创建对象时有形参,则调用类中对应的构造函数。
3、运行程序
1 class Root 2 { 3 static{ 4 System.out.println("Root的静态初始化块"); 5 } 6 { 7 System.out.println("Root的普通初始化块"); 8 } 9 public Root() 10 { 11 System.out.println("Root的无参数的构造器"); 12 } 13 } 14 class Mid extends Root 15 { 16 static{ 17 System.out.println("Mid的静态初始化块"); 18 } 19 { 20 System.out.println("Mid的普通初始化块"); 21 } 22 public Mid() 23 { 24 System.out.println("Mid的无参数的构造器"); 25 } 26 public Mid(String msg) 27 { 28 //通过this调用同一类中重载的构造器 29 this(); 30 System.out.println("Mid的带参数构造器,其参数值:" + msg); 31 } 32 } 33 class Leaf extends Mid 34 { 35 static{ 36 System.out.println("Leaf的静态初始化块"); 37 } 38 { 39 System.out.println("Leaf的普通初始化块"); 40 } 41 public Leaf() 42 { 43 //通过super调用父类中有一个字符串参数的构造器 44 super("Java初始化顺序演示"); 45 System.out.println("执行Leaf的构造器"); 46 } 47 48 } 49 50 public class TestStaticInitializeBlock 51 { 52 public static void main(String[] args) 53 { 54 new Leaf(); 55 56 57 } 58 }
运行结果:
执行顺序:先执行静态初始化块,然后时初始化块,最后是构造函数
4、静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static关键字的字段或方法)?
1 public class test_static { 2 3 static int a = 10; 4 int b = 20; 5 6 static void display_1() 7 { 8 System.out.println("静态变量a:" + a); 9 System.out.println("实例变量b:" + new test_static().b); 10 } 11 12 13 public static void main(String[] args) { 14 // TODO Auto-generated method stub 15 16 test_static test = new test_static(); 17 test.display_1(); 18 } 19 20 }
输出结果:
静态方法只能调用静态变量,而实例变量想要被调用,必须确定是哪一对象的实例变量,调用方法如第九行。