/*
代码块:
局部代码块: 放在方法中的代码块{}
构造代码块: 类中方法外的代码块{}
-----------在构造方法前执行构造代码块
静态代码块:类中方法外的代码块static{}
-----------静态代码块走一次,在类加载到内存后就执行
*/
public class Test1 {
public static void main(String[] args) {
//局部代码块,放在方法中的代码块
{
int a = 1 ;
}
//============================================
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person("aa");
/*
----输出
Person类的静态代码块
Person类的构造代码块
Person无参构造方法
Person类的构造代码块
Person无参构造方法
Person类的构造代码块
Person有参构造方法
*/
}
}
class Person{
static{
System.out.println("Person类的静态代码块");
}
//构造代码块,放在方法之外
//构造代码块(见以下反编译代码)
//构造代码块的本质,复杂到每个构造方法第一行,在super下面
{
System.out.println("Person类的构造代码块");
}
public Person(){
System.out.println("Person无参构造方法");
}
public Person(String name){
System.out.println("Person有参构造方法");
}
}
反编译Person.class
package com.itheima.demo09975960014EE378015757548C678490204EE378015757;
import java.io.PrintStream;
class Person
{
public Person()
{
System.out.println("我是 Person类的构造代码块");
System.out.println("Person 无参构造");
}
public Person(String str)
{
System.out.println("我是 Person类的构造代码块");
System.out.println("Person 有参构造");
}
static
{
System.out.println("我是Person类的静态代码块");
}
}
继承下代码块的执行顺序
public class Test1 {
public static void main(String[] args) {
Student s1 = new Student();
Student s2 = new Student();
/*
输出:
Person类的静态代码块
Student类的静态代码块
Person类的构造代码块
Person无参构造方法
Student类的构造代码块
Student无参构造方法
Person类的构造代码块
Person无参构造方法
Student类的构造代码块
Student无参构造方法
*/
}
}
class Person {
static {
System.out.println("Person类的静态代码块");
}
// 构造代码块,放在方法之外
{
System.out.println("Person类的构造代码块");
}
public Person() {
System.out.println("Person无参构造方法");
}
public Person(String name) {
System.out.println("Person有参构造方法");
}
}
class Student extends Person {
// 构造代码块,放在方法之外
{
System.out.println("Student类的构造代码块");
}
public Student() {
System.out.println("Student无参构造方法");
}
static {
System.out.println("Student类的静态代码块");
}
}
构造代码块默认放在构造方法下,super下一行