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 }

输出结果:

静态方法只能调用静态变量,而实例变量想要被调用,必须确定是哪一对象的实例变量,调用方法如第九行。

posted @ 2018-10-21 17:37  枫黎  阅读(170)  评论(0编辑  收藏  举报