代码块
public class Person {
String name;
static int age;
public Person(){
this.name="张三";
System.out.println("执行的构造方法的代码块");
}
//非静态代码块
{
System.out.println("执行的是非静态代码块1");
}
{
System.out.println("执行的是非静态代码块2");
}
{
System.out.println("执行的是非静态代码块3");
}
{
System.out.println("执行的是非静态代码块4");
}
//静态代码块
//在实际开发中,静态代码块用的多一点,用在初始化类的静态属性(static类型属性)
static{
//这里只能使用静态static修饰的属性和方法
age=11;
showAge();
System.out.println("......这里执行的是静态代码块........");
}
public static void showAge(){
System.out.println(age);
}
public static void main(String[] args) {
new Person();
new Person();
}
}
11
......这里执行的是静态代码块........
执行的是非静态代码块1
执行的是非静态代码块2
执行的是非静态代码块3
执行的是非静态代码块4
执行的构造方法的代码块
执行的是非静态代码块1
执行的是非静态代码块2
执行的是非静态代码块3
执行的是非静态代码块4
执行的构造方法的代码块
简单属性不需要这么麻烦,例如直接static int age=1;不需要再搞个静态代码块给age=1;
如果是对象型属性呢????
public class TestPerson {
int age;
String name;
}
public class Person {
String name;
static int age;
static TestPerson tp=new TestPerson();
//静态代码块
static{
//这里只能使用静态static修饰的属性和方法
//给TestPerson里面东西重新设置
tp.name="zx";
tp.age=21;
}
那非静态代码块能干嘛
public class Person{
......
//加一个test方法
public void test(){
System.out.println("Person的test方法");
}
}
public class Test{
public static void main(String[] args) {
//匿名内部类
Person p=new Person(){//这是一个person的子类
//??问题??现在想名字改成李四,但是不想动Person 的代码
{
//在匿名内部类中,用代码块代替构造方法
super.name="李四";
}
@Override
public void test() {
System.out.println("--------");
}
};
System.out.println(p.name);
代码块在匿名内部类的使用是无可替代的,匿名类你没有类名,就不能用构造,没有构造,就不能用其他办法来初始化==>用代码块来初始化