动手动脑Ⅰ
程序为什么出错:因为构造函数仅有有参构造。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
试验
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;
}
}
标签:初始化,Java,动脑,System,Mid,动手,println,public,out From: https://www.cnblogs.com/litianyu1969/p/17733385.html