new过程背后的事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了new过程背后的事相关的知识,希望对你有一定的参考价值。

代码示例:

技术分享
 1 public class Test {
 2 
 3     public Test(){
 4         System.out.println("构造函数");
 5     }
 6     {
 7         System.out.println("非静态代码块");
 8     }
 9     static{
10         System.out.println("静态代码块");
11     }
12     /**
13      * @param args
14      */
15     public static void main(String[] args) {
16         new Test();
17     }
18 }
创建对象代码示例

静态代码块:

  static修饰的代码块为静态代码块,在类加载的时候被执行,也就是说即使不创建类的实例对象,该类在被加载的时候也会执行,示例:

技术分享
 1 public class Test {
 2 
 3     public Test(){
 4         System.out.println("构造函数");
 5     }
 6     {
 7         System.out.println("非静态代码块");
 8     }
 9     static{
10         System.out.println("静态代码块");
11     }
12     /**
13      * @param args
14      */
15     public static void main(String[] args) {
16         
17     }
18 }
静态代码块实例

  该段代码在运行的时候边会执行静态代码块的内容:

非静态代码块:

  无static修饰的代码块修饰的非静态代码块,在类创建实例对象的时候被加载,常用来做对象属性的初始化

技术分享
 1 public class Test {
 2     {
 3         System.out.println("非静态代码块");
 4     }
 5     /**
 6      * @param args
 7      */
 8     public static void main(String[] args) {
 9         new Test();
10     }
11 
12 }
非静态代码块

  在创建Test类的实例对象的时候,在执行Test无参构造函数之前便会执行非静态代码块的内容

构造函数:

  无返回值的特殊方法,用于创建类的实例对象。如类不显式声明构造器,系统会默认生成一个无参的构造器;如类中显式的声明了构造器(不管是无参还是带参的),系统都不会再隐式生成一个无参的构造器。

技术分享
 1 public class Test {
 2 
 3     public Test(){
 4         System.out.println("构造函数");
 5     }
 6 
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         new Test();
12     }
13 
14 }
构造器示例

new操作之前:

  类的加载:

    1. 类中的静态字段被加载
    2. 类中的静态方法被加载(包括静态代码块)

  对象的创建:

    1. 分配内存
    2. 将对象的实例变量自动初始化为其变量类型的默认值
    3. 类中的非静态代码块被执行(如果有非静态代码块将执行,常用语属性的初始化)
    4. 调用构造函数,成功创建对象

以上是关于new过程背后的事的主要内容,如果未能解决你的问题,请参考以下文章

(转) Java 静态代码块和非静态代码块

Java静态块学习

Java静态块学习

static{}(静态代码块)与{}(非静态代码块)的异同点(转自 べ袽猓柯苡づ)

java中静态代码块之我的理解

(转)面试题--JAVA中静态块静态变量加载顺序详解