JavaSE-代码块

package com.btp.t2;
/*
 * 类的第四个成员:初始化块(代码块)
 * 1.代码块如果有修饰的话,那么只能使用static
 * 2.代码块分类:
 * ①静态代码块(static修饰):
 *   1.里面可以有输出语句
 *   2.随着类的加载而加载,而且只被加载一次
 *   3.多个静态代码块之间按照顺序结构执行
 *   4.静态代码块的执行要早于非静态代码块的执行
 *   5.静态的代码块中,只能执行静态的结构(类属性,类方法)
 *   6.静态代码块初始化和显式赋值也是按照顺序结构执行
 * ②非静态代码块(没有修饰):
 *   1.可以对属性(静态&非静态)进行初始化操作,同时也能调用方法(静态&非静态)
 *   2.可以写输出语句
 *   3.一个类中可以有多个非静态代码块,多个代码块之间按照顺序结构执行
 *   4.每创建一个类的对象,非静态代码块就加载一次
 *   5.非静态代码块的执行要早于构造器
 *   6.显式的初始化或静态代码块初始化按照顺序结构执行,下面的2和3
 *
 *
 * 关于属性赋值的操作顺序:1.默认的初始化 (2.显式的初始化 3.非静态代码块 )4.构造器中初始化
 *  5.通过方法对对象的属性进行修改
 */
public class TestOrder {
    public static void main(String[] args)
    {
        Order o1=new Order();
        System.out.println(o1);
        System.out.println();
        Order o2=new Order(1003,"BB");
        System.out.println(o2);

        System.out.println(Order.orderDesc);
    }
}

class Order{
    private int orderId=1001;
    private String orderName;

    //非静态初始化块
    {
        orderId=1002;
        orderName="AA";
        System.out.println("我是非静态代码块1!");
        //orderDesc="(非静态代码块中)我是static的属性orderDes!";
    }
    //private int orderId=1001;

    {
        System.out.println("我是非静态代码块2!");
    }

    public Order() {
        super();
        System.out.println("我是Order类的空参的构造器!");
    }
    //静态代码块
//    static{
//        System.out.println("我是静态代码块2!");
//    }
    static{
        orderDesc="(静态代码块中)我是static的属性orderDes!";
        System.out.println("我是静态代码块1!");
    }

    public static String orderDesc="(显式赋值)我是static的属性orderDes!";

    public Order(int orderId,String orderName) {
        super();
        this.orderId = orderId;
        this.orderName = orderName;
        System.out.println("我是Order类的不空参的构造器!");
    }
    public int getOrderId() {
        return orderId;
    }
    public void setOrderId(int orderId) {
        this.orderId = orderId;
    }
    public String getOrderName() {
        return orderName;
    }
    public void setOrderName(String orderName) {
        this.orderName = orderName;
    }
    @Override
    public String toString() {
        return "Order [orderId=" + orderId + ", orderName=" + orderName + "]";
    }

}

练习

package com.btp.t2;

public class TestLesf {

    public static void main(String[] args) {
        new Leaf();
        System.out.println();
        new Leaf();
    }

}

class Root
{
    static
    {
        System.out.println("Root的静态代码块!");
    }
    {
        System.out.println("Root的普通代码块!");
    }
    public Root() {
        System.out.println("Root的无参数构造器");
    }
}

class Mid extends Root
{
    static
    {
        System.out.println("Mid的静态代码块!");
    }
    {
        System.out.println("Mid的普通代码块!");
    }
    public Mid() {
        System.out.println("Mid的无参数构造器");
    }
    public Mid(String msg)
    {
        this();
        System.out.println("Mid的带参数构造器,其参数值:"+msg);

    }

}

class Leaf extends Mid
{
    static
    {
        System.out.println("Leaf的静态代码块!");
    }

    {
        System.out.println("Leaf的普通代码块!");
    }
    public Leaf()
    {
        super("石头人");
        System.out.println("执行Leaf的构造器!");
    }
}

/*答案
Root的静态代码块!
Mid的静态代码块!
Leaf的静态代码块!
Root的普通代码块!
Root的无参数构造器
Mid的普通代码块!
Mid的无参数构造器
Mid的带参数构造器,其参数值:石头人
Leaf的普通代码块!
执行Leaf的构造器!

Root的普通代码块!
Root的无参数构造器
Mid的普通代码块!
Mid的无参数构造器
Mid的带参数构造器,其参数值:石头人
Leaf的普通代码块!
执行Leaf的构造器!

 */

总结:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。

注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。

Static 静态:这里主要记录的是静态程序块和静态方法

如果有些代码必须在项目启动的时候就执行,就需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化但是不执行,在不创建对象的情况下,可以供其他程序调用,而在调用的时候才执行,这需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用。

静态代码块和静态方法的区别是:

静态代码块是自动执行的;

静态方法是被调用的时候才执行的.

静态方法:如果我们在程序编写的时候需要一个不实例化对象就可以调用的方法,我们就可以使用静态方法。

时间: 2024-08-04 23:43:05

JavaSE-代码块的相关文章

[javase学习笔记]-7.15 构造代码块

这一节我们再看一个特殊的代码块,那就是构造代码块. 这里我们简单的通过例子来说明一下: class Person { private String name; { System.out.println("Person类的第一个代码块被执行"); } Person() { System.out.println("无参数构造函数被执行"); this.name = "小宝宝"; } Person(String name) { System.out.p

[javase学习笔记]-8.8 构造代码块

这一节我们再看一个特殊的代码块.那就是构造代码块. 这里我们简单的通过样例来说明一下: class Person { private String name; { System.out.println("Person类的第一个代码块被运行"); } Person() { System.out.println("无參数构造函数被运行"); this.name = "小宝宝"; } Person(String name) { System.out.p

[javase学习笔记]-8.7 静态代码块

这一节我们看一个比較特殊的概念,那就是静态代码块. 前面我们也提到过代码块,就是一段独立的代码空间.那么什么是静态代码块呢?说白了,就是用statickeyword修饰的代码块. 我们来看一个样例: class StaticBlock { static { System.out.println("静态代码块被运行"); } void myPrint() { System.out.println("myPrint方法运行"); } } class StaticBloc

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

iOS学习之代码块(Block)

代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: 1 int local = 1;//注意:全局变量 2 void (^block0)(void) = ^(void){ 3 local ++; 4 NSLog(@"local = %d",local); 5 }; 6 block0(); 7 NSLog(@"外部 local = %d",lo

[Java基础]代码块

1. 2.构造代码块 public class CBlock { public CBlock()//构造函数 { i=300;//构造函数中初始化 } public int i=100;//显示初始化变量 {//构造代码块 i=200;//构造代码块中初始化变量 } } 从以下几点理解以上代码: java编译器编译一个java源文件的时候,会把成员变量的声明语句提前至一个类的最前端. 成员变量的初始化工作其实都在在构造函数中执行的. 一旦经过java编译器编译后,那么构造代码块的代码块就会被移动

Java(静态)变量和(静态)代码块的执行顺序

本文讨论Java中(静态)变量.(静态)代码块的执行顺序 首先创建3个类: 1.Foo类,用于打印变量 public class Foo { public Foo(String word) { System.out.println(word); } } 2.Parent类 public class Parent { static Foo FOO = new Foo("Parent's static parameter"); Foo foo = new Foo("Parent'

Java中的4种代码块

一.普通代码块 直接在一个方法中出现的{}就称为普通代码块,例子程序如下: public class CodeDemo01{ public static void main(String[] args){ //普通代码块 { int x = 10; System.out.println("x=" + x); } int x = 100; System.out.println("x=" + x); } } 二.构造代码块 直接在类中定义的没有加static关键字的代码

java学习教程之代码块

学编程吧java学习教程之代码块发布了,欢迎通过xuebiancheng8.com来访问 java中的代码块包括下面几种: 1.普通代码块 2.构造代码块 3.静态代码块 1.普通代码块很简单看下面这个例子: public class Test{ public static void main(String args[]){ { //此处就是普通代码块,普通代码块中的代码按顺序执行 System.out.println("hello"); } } } 2.构造代码块 public cl

vscode自定义代码块

vscode中设置自定义代码块打开首选项,选择用户代码片段,打开后选择编程语言选中后打开文件,按照格式编辑内容 "Print to console log": { "prefix": "csl", "body": [ "console.log('$1')" ], "description": "log output to console" },