프로그래밍 과정에서 다음 형식의 프로그램을 접할 수 있습니다.
public class Test { { //// } }
이러한 형태의 프로그램 세그먼트를 코드 블록이라고 부릅니다. 소위 코드 블록은 중괄호({})를 사용하여 여러 줄의 코드를 함께 캡슐화하여 구현하는 데 사용되는 독립적인 A 데이터 본문을 형성합니다. 특정 알고리즘. 일반적으로 코드 블록은 단독으로 실행될 수 없으며 실행 중인 본문이 있어야 합니다. Java에는 네 가지 주요 코드 블록 유형이 있습니다.
일반 코드 블록은 다음과 같습니다. 우리가 가장 많이 사용하고 가장 일반적인 것은 메서드 이름 뒤에 {}로 묶인 코드 세그먼트입니다. 일반 코드 블록은 단독으로 존재할 수 없으며 반드시 메소드 이름을 따라야 합니다. 또한 메서드 이름을 사용하여 호출해야 합니다.
public class Test { public void test(){ System.out.println("普通代码块"); } }
정적이라고 하면 정적을 생각하게 됩니다. 정적 코드 블록은 정적으로 수정된 {}로 둘러싸인 코드 세그먼트입니다.
public class Test { static{ System.out.println("静态代码块"); } }
동기화 키워드로 수정되고 "{}"으로 묶인 코드 조각은 동시에 하나의 스레드만 메서드 블록에 들어갈 수 있음을 나타냅니다. 이는 다중 스레드 보호 메커니즘입니다.
클래스에 수식자, 접두사, 접미사 없이 코드를 직접 정의합니다. 블록은 구성된 코드 블록입니다. 클래스에는 객체가 생성될 때 호출되는 생성자가 하나 이상 있어야 한다는 것을 알고 있습니다. 생성자와 마찬가지로 생성 코드 블록도 객체가 생성될 때 호출됩니다. 그러면 생성 코드는 언제 호출됩니까? 어떻게 부르나요? 다음 코드를 보세요:
public class Test { /** * 构造代码 */ { System.out.println("执行构造代码块..."); } /** * 无参构造函数 */ public Test(){ System.out.println("执行无参构造函数..."); } /** * 有参构造函数 * @param id id */ public Test(String id){ System.out.println("执行有参构造函数..."); } }
위는 매우 간단한 클래스인 이 클래스에는 매개변수가 없는 생성자, 매개변수가 있는 생성자 및 구성 코드 블록이 포함되어 있습니다. 동시에 위에서 언급한 것처럼 코드 블록에는 이를 전달할 수 있는 캐리어가 있어야 합니다. 컴파일러에 무슨 일이 일어나나요? 코드 블록을 구성하는 것은 어떻습니까? 컴파일러는 모든 생성자 앞에 코드 블록을 순서대로(여러 개의 코드 블록이 있는 경우) 삽입하므로 어떤 생성자가 호출되더라도 생성된 모든 코드 블록이 실행됩니다. 위 코드는 다음 형식과 같습니다.
public class Test { /** * 无参构造函数 */ public Test(){ System.out.println("执行构造代码块..."); System.out.println("执行无参构造函数..."); } /** * 有参构造函数 * @param id id */ public Test(String id){ System.out.println("执行构造代码块..."); System.out.println("执行有参构造函数..."); } } 运行结果 public static void main(String[] args) { new Test(); System.out.println("----------------"); new Test("1"); } ------------ Output: 执行构造代码块... 执行无参构造函数... ---------------- 执行构造代码块... 执行有参构造函数...
위에서 실행 결과를 보면 객체가 새로 생성되면 항상 생성 코드가 먼저 실행되고 생성자 함수가 실행되는 것을 볼 수 있습니다. 그러나 한 가지 주목할 점은 생성자보다 생성 코드가 먼저 실행되지 않는다는 것입니다. 생성자를 기반으로 실행됩니다. 구성된 코드 블록은 이러한 특성을 가지고 있기 때문에 다음과 같은 시나리오에서 자주 사용됩니다.
>
클래스에 여러 생성자가 있는 경우 이러한 생성자는 모두 인스턴스 변수를 초기화해야 합니다. 생성자에서 직접 인스턴스화하면 분명히 문제가 발생합니다. 중복된 코드가 많아 번거롭고 읽기 어렵습니다. 여기서는 이를 달성하기 위해 구성된 코드 블록을 최대한 활용할 수 있습니다. 이는 컴파일러가 각 생성자에 생성 코드 블록을 추가한다는 사실을 활용합니다.
2.인스턴스 환경 초기화 一个对象必须在适当的场景下才能存在,如果没有适当的场景,则就需要在创建对象时创建此场景。我们可以利用构造代码块来创建此场景,尤其是该场景的创建过程较为复杂。构造代码会在构造函数之前执行。 上面两个常用场景都充分利用构造代码块的特性,能够很好的解决在实例化对象时构造函数比较难解决的问题,利用构造代码不仅可以减少代码量,同时也是程序的可读性增强了。特别是当一个对象的创建过程比较复杂,需要实现一些复杂逻辑,这个时候如果在构造函数中实现逻辑,这是不推荐的,因为我们提倡构造函数要尽可能的简单易懂,所以我们可以使用构造代码封装这些逻辑实现部分。 从词面上我们就可以看出他们的区别。静态代码块,静态,其作用级别为类,构造代码块、构造函数,构造,其作用级别为对象。 1、 静态代码块,它是随着类的加载而被执行,只要类被加载了就会执行,而且只会加载一次,主要用于给类进行初始化。 2、 构造代码块,每创建一个对象时就会执行一次,且优先于构造函数,主要用于初始化不同对象共性的初始化内容和初始化实例环境。 3、 构造函数,每创建一个对象时就会执行一次。同时构造函数是给特定对象进行初始化,而构造代码是给所有对象进行初始化,作用区域不同。 通过上面的分析,他们三者的执行顺序应该为:静态代码块 > 构造代码块 > 构造函数。
以上就是java提高篇(十一)-----代码块的内容,更多相关内容请关注PHP中文网(m.sbmmt.com)! 五、 静态代码块、构造代码块、构造函数执行顺序
public class Test {
/**
* 静态代码块
*/
static{
System.out.println("执行静态代码块...");
}
/**
* 构造代码块
*/
{
System.out.println("执行构造代码块...");
}
/**
* 无参构造函数
*/
public Test(){
System.out.println("执行无参构造函数...");
}
/**
* 有参构造函数
* @param id
*/
public Test(String id){
System.out.println("执行有参构造函数...");
}
public static void main(String[] args) {
System.out.println("----------------------");
new Test();
System.out.println("----------------------");
new Test("1");
}
}
-----------
Output:
执行静态代码块...
----------------------
执行构造代码块...
执行无参构造函数...
----------------------
执行构造代码块...
执行有参构造函数...