目录
代码块的执行顺序
class Test {
public String name;
static{
String name = "静态代码块的名字";
System.out.println(name);
}
//这是一个含有两个参数的构造方法
public Test(String name) {
this.name = name;
System.out.println("这是一个构造代码块");
}
public Test(){//这是一个不含参数的构造方法
}
//这是一个普通代码块
{
name = "普通代码块1号";
System.out.println("这是一个普通代码块");
}
{
name = "普通代码块2号";
System.out.println("这是另一个普通代码块");
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.name);
System.out.println("-------我是分割线-------");
Test test1 = new Test("构造代码块的名字");
System.out.println(test1.name);
}
}
代码块的执行顺序:静态代码块-->普通代码块(按排列的先后顺序执行)-->构造代码块
同理,继承中的代码块执行顺序:父类中的静态代码块-->子类中的静态代码块-->父类中的普通代码块-->父类中的构造代码块-->子类中的普通代码块-->子类中的构造代码块
知道了代码块的执行顺序,我们就可以根据他们的执行顺序来重新定义变量的值
同一代码块中出现两个同名变量的情况
接下来我想说一说大部分博客中都没有提到的关于一个代码块中出现两个同名变量的问题
package outtt.outt.out;
public class CodePart {
static String name = "静态成员变量的名字";
//将其定义为静态成员变量后,可以在静态代码块中访问了
static{
name = "静态代码块的名字";//这个”name“是上面”static String name“中的name
String name = "123";//这个”name“是静态代码块中的name,和上面的那个name两者不一样
System.out.println("这是一个静态代码块"+" "+name);
System.out.println(CodePart.name);
}
{
name = "普通代码块的名字";
String name = "???";
System.out.println("这是一个普通代码块"+ " " + name);
}
//成员变量随着代码块的生命周期结束而结束
public CodePart(String name){
this.name = name;
System.out.println("这是一个构造代码块");
}
public CodePart(){
}
//构造代码块后于普通代码块执行,所以构造代码块能够改变前者的数据
public static void main(String[] args) {
// CodePart codePart = new CodePart("构造代码块的名字");
CodePart codePart = new CodePart();
System.out.println(codePart.name);
}
}