本文最后更新于 2024-10-13,文章内容可能已经过时。

Java——main方法的理解【课程笔记】

P382 深入理解main方法:

解释mian方法的形式:public static void main(String[] args) {}

  1. main()方法是Java虚拟机调用的

  2. Java虚拟机需要调用main()方法,所以该方法的访问权限必须是public

  3. Java虚拟机在执行main()方法时不必创建对象,所以该方法必须是static

  4. 该该方法接受String类型的数组参数,该数组中保存执行Java命令时传递给所运行的类的参数

  5. Java执行的程序 参数1 参数2 参数3

public class Main {
    public static void main(String[] args) {
        for (int i  = 0;i<args.length;i++){
            System.out.println("第"+(i+1)+"参数是:"+args[i]);
        }
    }
}
image-20231010225241063 image-20231010225311948

P383 理解main方法的语法

  1. 在main()方法中,我们可以直接调用main方法所在类的静态方法或静态属性
  2. 但是,不能直接去访问该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类中的非静态成员
package com.main;

public class Main01 {
    private static String name = "ljj";
    private int n1 = 1000;
    public static void main(String[] args) {
        //可以直接使用name参数
        //1. 静态方法main 可以访问本类的静态成员九
        System.out.println(name);
        //2. 静态方法main 不可以访问本类的非静态成员
        System.out.println(n1);
        //3.  静态方法main 要访问本类的非静态成员,需要创建对象
        int n11 = new Main01().n1;
    }
}
image-20231010230637850

P385 代码块

初始块,属于类中的成员【是类的一部分】类似于方法,讲逻辑语句封装在方法中,通过{}包围起来,但是和方法不同,没有方法名,没有返回,没有参数,只有方法体,而且不用通过对象或类显式调用,而是类加载的时,或创建对象时隐式调用

基本语法:

[修饰符] {
    代码体
}

注意:

  1. 修饰符可选,但是仅仅可选static
  2. 代码块分为两类,使用static修饰的叫静态代码块,没有static修饰的,较普通代码块/非静态代码块
  3. 逻辑语句可以为任意逻辑语句(输出,输入,方法调用,循环,判断等)
  4. 号可以写,也可以省略

应用场景:

  1. 下面的三个构造器都有相同的语句;
  2. 不使用代码块这样代码看起来比较冗余
  3. 不管那个构造器先调用,都会先执行代码块的内容
  4. 结论:代码块优先于构造器
package codeblock;

public class CodeBlock01 {
    public static void main(String[] args) {
        new Movie("铜锁");
    }
}
class  Movie{
    public Movie(String name) {
        this.name = name;
    }

    private   String  name;
    private int price;
    private String director;
    {
        System.out.println("电影开始了。。。。");
        System.out.println("广告还剩N秒......");
    }

    public Movie(String name, int price, String director) {
        this.name = name;
        this.price = price;
        this.director = director;
    }
}

静态代码块

1)static代码块也叫静态代码块,作用就是对类进行初始化,而且它随着类的加载而执行,并且
只会执行一次。如果是普通代码块,每创建一个对象,就执行

2)类什么时候被加载[重要!]

  • 创建对象实例时(new)

  • 创建子类对象实例,父类也会被加载

  • 使用类的静态成员时(静态属性,静态方法)案例演示: A类extends B类 的静态块

3)普通的代码块,在创建对象实例时,会被隐式的调用被创建一次,就会调用一次。如果只是使用类的静态成员时,普通代码块并不会执行

package codeblock;

public class CodeBlockDetail01 {
    public static void main(String[] args) {
//        AA aa = new BB();
        AA.Test();
    }
}
class AA{
    static {
        System.out.println("AA正在加载中....");
    }
    //在创建对象时,被调用,创建一次调用一次
    {
        System.out.println("AA 普通代码块");
    }
    public static void Test(){
        System.out.println("静态方法调用");
    }
}
class BB extends AA{
    static {
        System.out.println("BB正在加载中......");
    }
}

小结:

1.static代码块是类加载时,执行,只会执行一次

2.普通代码块是在创建对象时调用的,创建一次,调用一次

3.类加载的3种情况,需要记住

  1. 创建一个对象时,在一个类 调用顺序是:(重点,难点)
  1. 调用静态代码块和静态属性初始化(注意: 静态代码块和静态属性初始化调用的优先级一样,如果有多个静态代码块和多个静态变量初始化,则按他们定义的顺序调用)
  2. 调用普通代码块和普通属性的初始化(注意: 普通代码块和普通属性初始化调用的优先级一样,如果有多个普通代码块和多个普通属性初始化,则按定义顺序调用)
  3. 调用构造方法