下面是Java靜態代碼塊和非靜態代碼塊的一些作用和用法:
public class Person {
//第一執行 類的默認初始化和顯示初始化
String name;
static int age ;
//複雜屬性
static TestPerson tp = new TestPerson();
//第三執行 構造器的代碼塊
public Person() {
this.name = "張三";
System.out.println("執行的是構造方法!");
}
//第二執行 非靜態的代碼塊
{
System.out.println("執行的是非靜態代碼塊");
}
{
System.out.println("執行的是非靜態代碼塊2");
}
{
System.out.println("執行的是非靜態代碼塊3");
}
//靜態代碼塊裏只能寫靜態修飾的代碼
static {
// name = "xxx"; 報錯
age = 11;
showAge();
System.out.println("這個是靜態代碼塊0-0 -=-");
tp.naem = "xx";
tp.age = 123;
}
public static void showAge(){
System.out.println(age);
}
public void test(){
System.out.println("Person的測試方法");
}
}
public class TestPerson {
String naem ;
int age;
}
這是運行的結果:
11
這個是靜態代碼塊0-0 -=-
執行的是非靜態代碼塊
執行的是非靜態代碼塊2
執行的是非靜態代碼塊3
執行的是構造方法!
下面是測試類,匿名内部類的使用:
class T{
public static void main(String[] args) {
//非靜態代碼塊每次new對象都會執行,靜態代碼塊只執行一次
/*
new Person();
new Person();
*/
//匿名内部類 構建了一個沒有類名的Person的子類,也就是匿名的Person子類
Person p = new Person(){
//用匿名内部類代碼塊代替構造方法
{
super.name = "李四";
}
@Override
public void test() {
System.out.println("--------");
}
};
//想把name改成李四,但是不想動Person的代碼
System.out.println(p.name);
p.test();
}
}
這是測試類運行結果:
11
這個是靜態代碼塊0-0 -=-
執行的是非靜態代碼塊
執行的是非靜態代碼塊2
執行的是非靜態代碼塊3
執行的是構造方法!
李四
Person的測試方法
如果把重寫的test()注釋,那執行的就是父類的test()方法!