Java面向对象之代码块、Package、Import


一、代码块

1、概念:使用"{}" 括起来的一段代码

2、分类:

  • ? 根据位置分类
    • 普通代码块:直接在方法或语句中定义的代码块
    • 构造代码块:直接写在类中的代码块,即 定义在类中的使用{} 括起来的代码块叫做构造函代码块。
    • 静态代码块:使用static 声明的代码块
    • 同步代码块:多线程的时候会学到

3、具体分析:

3.1、普通代码块
package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();
        {
            System.out.println("main");
        }
    }
}


// test
// 我应该是什么分类
// main
/**反编译的结果*/
package com.study.Java;

public class CodeBlockDemo {
  public void test() {
    System.out.println("test");
    System.out.println(");
  }
  
  public static void main(String[] args) {
    CodeBlockDemo codeBlockDemo = new CodeBlockDemo();
    codeBlockDemo.test();
    System.out.println("main");
  }
}
3.2、构造代码块
package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    {
        System.out.println("构造代码块");
    }

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();

        {
            System.out.println("main");
        }
    }
}

反编译的代码如下:

image-20211115194745208

package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块 : 
 *  构造代码块---> 定义在类中的使用{} 括起来的代码叫做构造代码块
 *          ---> 注意: 每次代码运行的时候都会将构造代码中的代码添加到构造方法的前面。
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    {
        System.out.println("构造代码块");
    }

    /**无参构造*/
    public  CodeBlockDemo(){
        System.out.println("构造方法");
    }

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();

        {
            System.out.println("main");
        }
    }
}

// 构造代码块
// 构造方法
// test
// 我应该是什么分类
// main

package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    int a;
    char b;

    {
        System.out.println("构造代码块");
    }

    /**无参构造*/
    public  CodeBlockDemo(){
        System.out.println(a);
        System.out.println(b);
        System.out.println("构造方法");
    }

    /**有参构造*/
    public CodeBlockDemo(int a) {
        this.a = a;
        System.out.println(this.a);
    }
	
  	/**无参构造*/
    public CodeBlockDemo(int a,char b){
        this(a);
        this.b = b;
    }

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();

        {
            System.out.println("main");
        }
    }
}

反编译结果

image-20211115200916544

package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    int a;
    char b;

    {
        System.out.println("构造代码块");
    }

    /**无参构造*/
    public  CodeBlockDemo(){
        System.out.println(a);
        System.out.println(b);
        System.out.println("构造方法");
    }

    /**有参构造*/
    public CodeBlockDemo(int a) {
        this.a = a;
        System.out.println(this.a);
    }

    public CodeBlockDemo(int a,char b){
        this.a = a;
        this.b = b;
    }

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();

        {
            System.out.println("main");
        }
    }
}

反编译结果

image-20211115201112044

总结:构造代码块中的代码会添加到每一个构造方法中, 当使用this()调用的时候, 不会添加

3.3、静态代码块:

使用static声明的, 即 static{} 括起来的代码叫做静态代码块,在程序载入的时候先执行。

tips:

  • 数据库连接等其他提前需要准备好的代码。
  • 如果希望加载后, 对整个类进行偶写初始化操作, 可以使用static初始化块。
  • 类第一次被载入时 先执行static代码块;
  • 类多次载入时, static代码块只执行一次;
  • static经常来进行static变量的初始化
  • 这里注意 static代码块是在类初始化的时候执行, 不是再创建对象的时候执行。
  • 静态初始化块中不能访问非static成员。
package com.study.Java面向对象;

import java.security.CodeSource;

/**
 * 代码块
 * @Author:qzk
 * @Date: 2021/11/15 7:33 下午
 */
public class CodeBlockDemo {

    int a;
    char b;

    {
        System.out.println("构造代码块");
    }

    static {
        System.out.println("静态代码块");
    }

    /**无参构造*/
    public  CodeBlockDemo(){
        System.out.println(a);
        System.out.println(b);
        System.out.println("构造方法");
    }

    /**有参构造*/
    public CodeBlockDemo(int a) {
        this.a = a;
        System.out.println(this.a);
    }

    public CodeBlockDemo(int a,char b){
        this.b = b;
        this.a = a;
    }

    public void test(){
        System.out.println("test");
        {
            System.out.println("我应该是什么分类");
        }
    }

    public static void main(String[] args) {
       CodeBlockDemo codeBlockDemo =  new CodeBlockDemo();
       codeBlockDemo.test();

        {
            System.out.println("main");
        }
    }
}

反编译结果

image-20211115201710108

3.4、同步代码块

? 在多线程的时候使用, 用来给共享空间加锁的操作。

4、执行顺序

静态代码块 --> 构造代码块(创建对象的时候使用) --> 普通代码块

二、Package 封包

  • 一般定义 package 会定义在第一行
    • 设置 package com.jsxniu.entity
    • 为了解决两个问题:
      • 1、文件同名问题
      • 2、为了方便管理类,将具体处理功能的代码放到同一个目录下
    • 完全限定名: 包名 + 类名
    • 使用: 域名倒着写即可,再加上模块名, 并与内部管理类
  • 注意事项
    • 写项目的时候,要加包, 不要使用默认包
    • com.qzkcom.qzk.car 这两个包没有包含关系,是两个完全独立的包。
      • 只是逻辑上看起开后者是前者的一部分。

JDK中的主要包

  • java.lang -- 核心类包
    • 包含一些Java 语言的核心类,如 StringMathInteger、·SystemThread ,提供常用功能。
    • 注:只有 lang 包不需要手动导入, 自动加载, 其他包都需要手动导入
  • java.awt
    • 包含了构成抽象窗口的工具集 (abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图
  • java.net -- 网络包
    • 包含执行与网络相关的操作的类
  • java.io -- 输入输出流包
    • 包含能提供多种输入/输出功能的类
  • java.util -- 工具类包
    • 包含一些使用工具类,如定义系统特性,使用与日期日历相关的函数。
  • 其他包

image-20211123200143225

三、Import -- 导包操作

1、为什么用import

  • 如果不使用 import , 我们如果用到其他包的类时,只能这么写 java.util.Date date = new java.util.Date()

  • 这样的话,代码量非常大,不利于编写和维护。

  • 通过 import 可以导入其他包下面的类, 从而可以再本类中直接通过类名来调用。

  • 当需要引入 非 lang

2、如何使用 import

  • 需要用哪个类就导入哪个类
import java.util.Date;

import java.util.*;  //  导入该包下面的所有类, 会降低编译速度, 但不会降低运行速度。

3、注意点

  • java 会默认导入 java.lang 包下的所有的类,因此这些类我们可以直接使用。
  • 如果导入两个同名的类,只能用 报名+类名 来显示调用相关类
    • java.util.Date date = new java.util.Date()
    • java.sql.Date dateSql = new java.sql.Date()

4、补充: 静态导包---JDK5.0以后增加的

  • 当需要使用一个或某个类的多个方法的时候,同时又不想频繁写改类的名称, 此时可以使用静态导包
package com.study.qzk.study;
import java.util.Date;
//  这里使用了静态导包
import static java.lang.Math.*;

/**
 * @Author:qzk
 * @Date: 2021/11/23 8:17 下午
 */
public class ImportDemo {

    public static void main(String[] args) {
        Date date = new Date();

        System.out.println(Math.sqrt(2));
        System.out.println(Math.abs(-1));
      // 因为使用了静态导包, 所以可以直接使用导入的该包下的类的所有方法。
        System.out.println(sqrt(2));
        System.out.println(abs(-1));
    }
}

// 注意:  使用 静态导包的时候, 如果调用的方法在当前类中有同名的方法,会优先加载当前类的方法。