静态块、非静态块(方发体)以及构造方法的执行顺序

/*类的成员变量会在类加载时先默认初始化,方法体和代码块局部变量必须指定初始值。否则不可访问
         *  方法局部变量  代码块局部变量  能用代码块局部变量就用代码块
         *  
         *  赋值优先级大于构造方法。
         *
         *
         * 运行的优先级是 静态块(从上到下按顺序执行,且在类加载的时候就会执行)
         * 父类静态块-》本类静态块-》父类非静态块-》父类构造-》父类非静态块(只有在new时才会执行,执行在构造方法之前,new时非静态块执行本在声明变量之前,
         * 如果非静态块中使用了该变量,会提前声明.    new 构造();的优先级相当于主动调用普通方法,调用的普通方法
         * 和非静态块级别相同)
         *
         * 静态块-》非静态块-》构造
         * -》构造方法

*/

public class TestStaticCode{
    private static TestStaticCode tsc=new TestStaticCode();
    static{
        System.out.println("4");
    }
    private Instance iv=new Instance();//private Instance iv; {iv=newinstanceVariable()};
    private TestStaticCode(){
        System.out.println("3");
    }
    public static void main(String[] args) {

}
}
class Instance{
    static{
        System.out.println("1");        
    }
    public Instance(){
        System.out.println("2");
    }
}

内存占用

讲解重写与重载 向上造型 多态

面向接口 类与类之间降低耦合度
面向切面(AOP) 动态代理(本质是利用了反射机制) 通常我们遇见很多方法同时存在相同代码时会封装成方法然后再调用,
当用了动态代理后 动态代理对象在调用原有方法时可以在之前或者之后加上相同的代码段但原对象不用调用。
动态代理对象的任何方法一调就会生成相同的代码。

泛型是为了更好的运用工厂方法,生产对象。
也可包装源码,固定泛型 例如数组的泛型<?>跟没加没区别

解耦 分层

//javac的时候(编译的时候),方法名是不包含参数类型的。除非设定 -parameters
//动态代理在编写框架或底层基础代码时,经常用到。

时间: 2024-10-12 21:27:21

静态块、非静态块(方发体)以及构造方法的执行顺序的相关文章

静态块、main方法、构造块、构造方法的执行顺序

在牛客网做题,遇到关于静态块.main方法.构造块.构造方法的执行顺序的问题,添加该随笔记之. 题目是写出如下java代码执行后所打印的顺序: 1 public class B 2 { 3 public static B t1 = new B(); 4 public static B t2 = new B(); 5 { 6 System.out.println("构造块"); 7 } 8 static 9 { 10 System.out.println("静态块")

Java静态代码块、构造代码块、构造方法的执行顺序

Java静态代码块.构造代码块.构造方法的执行顺序 静态代码优先于非静态的代码,是因为被static修饰的成员都是类成员,会随着JVM加载类的时候加载而执行,而没有被static修饰的成员也被称为实例成员,需要创建对象才会随之加载到堆内存.所以静态的会优先非静态的. 执行构造器(构造方法)的时候,在执行方法体之前存在隐式三步: 1,super语句,可能出现以下三种情况: 1)构造方法体的第一行是this语句,则不会执行隐式三步, 2)构造方法体的第一行是super语句,则调用相应的父类的构造方法

Java Object 构造方法的执行顺序

Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class对象 2)链接:验证字节码,为静态域(只是static修饰的域,不包含static final )分配存储空间,解析此类对其他类的所有引用 3)初始化:若该类有超类,对其初始化,执行静态初始化器(构造器算一个)和静态初始化块. 类初始化时构造方法执行顺序 对于某一个子类时: (1)初始化对象的存储空

Java构造方法的执行顺序

1.如果类里边没有定义任何构造方法,则系统将添加一个默认的无参构造方法.   Class ThisClass{ } 默认隐式添加无参的构造方法,相当于 Class ThisClass{ public ThisClass(){ } } 2.构造方法的执行顺序.     (1)如果构造方法中没有在第一条语句中显式调用父类的构造方法,也没有调用本类的重载构造方法,则系统会在执行该构造方法时默认添加调用父类无参构造方法. public ThisClass(){ } 默认隐式添加父类无参构造方法,相当于

关于静态块、静态属性、构造块、构造方法的执行顺序

总结: 1.类加载时,执行静态代码块和初始化静态变量.执行顺序跟代码顺序一致. 2.类实例化时,初始化变量.执行代码块.执行构造.其中初始化变量和代码块的顺序跟代码顺序一致.执行构造是在最后. 3.实例化子类时,会先调用父类的构造方法.调用构造方法之前,会先执行该类的代码块. 4.类只会加载一次. 5.静态变量或静态方法中如果调用构造,可以把构造当做一个普通方法来看.但会先执行一遍代码块. 下面是在网上找到的比较典型的例子,以此来说明 例一: class A { static { System.

静态代码块、非静态代码块、构造方法的执行顺序

java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的.结构如下: static { 静态语句代码块 } { 非静态语句代码块 } 异同点 相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋     值. 不同点:静态代码块在非静态代码块之前执行(静态代码块-->非静态代码块-->构造方法).     静态代码块只在第一次new执行一次,之后不在执行,而非静态

Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 也就是说非静态初始化块的执行顺序要在构造函数之前. class FatherStaticTest { static { System.out.println("执行父类的静态代码块."); } FatherStaticTest() { System.out.println(&qu

【Java基础】继承中的代码块和构造方法的执行顺序探索

本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题.首先来看一个例子 /** * Created by lili on 15/10/19. */ class Person{ static { System.out.println("执行Person静态代码块"); } { System.out.println("执行Person构造代码块"); } public Person(){ System.out.println("执行Person构

Java:初始化块、静态初始化块、构造方法的执行顺序

1. 静态初始化块 静态初始化块只在类首次加载时执行一次,同时静态初始化块只能给静态变量赋值,不能给普通成员变量赋值. 2. (非静态)初始化块 (非静态)初始化块在每次生成实例对象时都执行一次,可以给任意变量赋值. 3. 构造方法 构造方法在每次生成实例对象时都执行一次 4. 执行顺序:静态初始化块 --> 初始化块 --> 构造方法 测试代码如下: 1 public class Son extends Father { 2 static int sNum = 0; 3 int num =