动手动脑
public class Test { public static void main (String[] args) { Foo obj1 = new Foo(); } } class Foo{ int value; public Foo(int initvalue) { value=initvalue; } }
1.此代码的问题主要是函数初始化的时候没有参数,而构造函数有参数,所以程序不能执行。
package 动手动脑; public class InitializeBlockClass { { field=200; } public int field=100; public InitializeBlockClass(int value) { this.field=value; } public InitializeBlockClass() { } public static void main(String[] args) { InitializeBlockClass obj=new InitializeBlockClass(); System.out.println(obj.field); obj=new InitializeBlockClass(300); System.out.println(obj.field); } }
2.(1)构造函数,当创建一个对象时,它的构造方法会被自动调用。构造方法与类名相同,没有返回值。
(2)如果类没有定义构造函数,Java编译器在编译时会自动给它提供一个没有参数的“默认构造方法”。如果类提供了一个自定义的构造方法,将导致系统不再提供默认构造方法。
package 动手动脑; class Root { static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通初始化块"); } public Root() { System.out.println("Root的无参数的构造器"); } } class Mid extends Root { static{ System.out.println("Mid的静态初始化块"); } { System.out.println("Mid的普通初始化块"); } public Mid() { System.out.println("Mid的无参数的构造器"); } public Mid(String msg) { //通过this调用同一类中重载的构造器 this(); System.out.println("Mid的带参数构造器,其参数值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的静态初始化块"); } { System.out.println("Leaf的普通初始化块"); } public Leaf() { //通过super调用父类中有一个字符串参数的构造器 super("Java初始化顺序演示"); System.out.println("执行Leaf的构造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
3.静态代码块随着类加载而加载
有多个静态代码块的,按代码块前后顺序加载
一个代码块,只执行一次。
package 动手动脑; public class Jingtai { static int n = 200; //静态变量 public static void main(String[] args) { New e = new New(); n = e.Shi(); //将实例变量赋值给静态变量 New.Jing(n); // } } class New{ int m = 100; //实例变量 int Shi(){ int x; x = m; return x;//实例函数,返回一个实例值 } static void Jing(int x){ System.out.println(x); //输出静态变量 } }
4.将一个实例变量赋给静态变量,然后返回实例值,最后输出静态变量。