Java动手动脑

发布时间 2023-09-27 18:19:24作者: 临江柔

动手动脑Ⅰ

程序为什么出错:因为构造函数仅有有参构造。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。

 试验

public class Main {
    public static void main(String[] args) {
        d n=new d();
        System.out.println(n.t);
        n=new d(600);
        System.out.println(n.t);
    }
}
class d{
    public int t=50;
    {
        t=-1;
    }
    public d(int k){
        t=k;
    }
    public d(){}
}

输出结果为-1  600.

初始化是在类被创建的时候被初始化的。而调用构造函数是类被创建好以后执行的。

动手动脑Ⅱ

 1 package org.example;
 2 
 3 
 4 
 5 class Root
 6 {
 7     static
 8     {
 9         System.out.println("Root的静态初始化块");
10     }
11     {
12         System.out.println("Root的普通初始化块");
13     }
14     public Root()
15     {
16         System.out.println("Root的无参数的构造器");
17     }
18 }
19 class Mid extends Root
20 {
21     static
22     {
23         System.out.println("Mid的静态初始化块");
24     }
25     {
26         System.out.println("Mid的普通初始化块");
27     }
28     public Mid()
29     {
30         System.out.println("Mid的无参数的构造器");
31     }
32     public Mid(String msg)
33     {
34         //通过this调用同一类中重载的构造器
35         this();
36         System.out.println("Mid的带参数构造器,其参数值:" + msg);
37     }
38 }
39 class Leaf extends Mid
40 {
41     static
42     {
43         System.out.println("Leaf的静态初始化块");
44     }
45     {
46         System.out.println("Leaf的普通初始化块");
47     }
48     public Leaf()
49     {
50         //通过super调用父类中有一个字符串参数的构造器
51         super("Java初始化顺序演示");
52         System.out.println("执行Leaf的构造器");
53     }
54 
55 }
56 
57 class TestStaticInitializeBlock
58 {
59     public static void main(String[] args)
60     {
61         new Leaf();
62     }
63 }

/*
执行结果

Root的静态初始化块
Mid的静态初始化块
Leaf的静态初始化块
Root的普通初始化块
Root的无参数的构造器
Mid的普通初始化块
Mid的无参数的构造器
Mid的带参数构造器,其参数值:Java初始化顺序演示
Leaf的普通初始化块
执行Leaf的构造器

*/

静态初始化块只执行一次。

创建子类型的对象时,也会导致父类型的静态初始化块的执行。

一个有趣的问题

静态方法中只允许访问静态数据,那么,如何在静态方法中访问类的实例成员(即没有附加static的字段或方法)?

静态方法只能访问静态成员,这是因为静态方法不属于任何特定的类实例。它们被设计为不依赖于类的任何特定实例,因此它们不能直接访问实例成员。这是因为实例成员需要具体的实例才能被访问。

但是,如果你需要在静态方法中访问实例成员,你可以通过传递一个类的实例作为参数来实现。例如:
package org.example;

public class Main {
public static void main(String[] args) {
d n=new d(600);
d r=new d(500);
int ans=ma(n,r);
}
public static int ma(d t,d k){
return Math.max(t.t,k.t);
}
}
class d{
public int t;
public d(int k){
t=k;
}
}