面向对象的基础_04_static及静态初始化块简述,传值机制

本文深入解析Java中的静态关键字static的用途及其特点,包括静态成员变量、静态方法、静态初始化块等概念,并探讨了它们在类与对象之间的区别及执行顺序。此外,还介绍了Java的参数传递机制以及包机制的基本原理。

static关键字

在类中,用static声明的成员变量为静态成员变量,也叫做类变量。类变量的声明周期和类相同,在整个应用程序执行期间都有效。

static修饰的成员变量和方法——从属于类
普通变量和方法——从属于对象
注:类加载了,不一定有对象

  1. 静态方法中不能调用非静态方法,可以使用静态变量
  2. 非静态方法可以使用静态变量或是静态方法

静态初始化块

构造方法是用于对象的初始化;而静态初始化块是用于类的初始化操作。
注:在静态初始化块中不能直接访问非静态成员
静态初始化块执行顺序:

  1. 先追溯到所有类的父类object类,执行它的静态初始化块,在向下执行子类的静态初始化块,直到所有的类的静态初始化块完成。
  2. 构造方法执行顺序同上。
package text;
public class text01 {
    int id;        //id
    String name;   //账户名
    String pwd;   //密码
    static String company; //公司名称
    //静态初始化块——在类初始化时执行(类的初始化时没有对象)
    //如果有构造器,那么会在构造器之前执行
    static {
        System.out.println("执行类的初始化");
        company = "大公司";
        printCompany();
    }  
    
    public static void printCompany(){
        System.out.println(company);
    }  
    public static void main(String[] args) {
    	text01   u3 = null;
    }
}

java的参数传值机制

方法中所有的参数都是”值传递“——传递的是值的副本
得到的是”原参数的复印件,而不是原件“,复印的内容改变不会影响到原件

1.基本数据类型参数的传值

传递的是值的副本。副本改变不会影响原件

2.引用类型参数的传值

传递的是值的副本。引用类型指的是”对象的地址“。副本和原参数都指向了同一个地址,改变”副本指向地址对象的值,也就改变了原参数指向对象的值“

java包机制

包机制是java中管理类的重要手段,对于同名类——通过包可以解决对类重名的问题,也可以实现对类的有效管理。包对于类——文件夹对文件
package的要点:

  1. 一般package放在类的第一句非注释性语句
  2. 包名——域名倒着写,再加上模块名,便于内部管理类
    举例:com.xt和com.xt.tx——这两个包是没有关系的,是两个完全独立的包

import详解——静态导入详解

有两种方法可以让一个类在不同包下调用另一个类:

  1. 包名.类名 类名=new 包名.类名();
  2. import导入类

静态导入

这个是在JDK1.5新增的功能,作用是用于导入指定类的静态属性——可以直接使用静态属性

import static java.lang.Math.*;//导入Math类的所有静态属性
import static java.lang.Math.PI;//导入Math类的PI属性
<think> 我们正在讨论Java中的代码,特别是匿名代码(也称实例初始化)和静态代码static)。根据用户提供的引用内容,我们可以总结如下: 1. 执行顺序: - 静态代码:在加载时执行,且仅执行一次。 - 匿名代码:在每次创建对象实例时执行,且在构造函数之前执行。 - 构造函数:在匿名代码之后执行。 2. 引用中给出的示例代码和输出结果都验证了上述顺序。 现在,我们需要简述匿名代码静态代码的作用。 ### 静态代码static block) - **作用**:用于初始化静态成员变量或执行仅需进行一次的初始化操作。由于它在加载时执行一次,因此适合用来初始化静态资源,例如加载配置文件、初始化静态变量等。 - **特点**: - 在被加载到内存时执行(通常发生在首次使用该时,如创建实例、访问静态成员等)。 - 一个中可以有多个静态代码,它们按照在中出现的顺序执行。 ### 匿名代码(实例初始化,instance initializer block) - **作用**:用于初始化实例成员变量或执行每次创建对象时都需要进行的通用初始化操作。它可以减少构造函数中重复的代码。 - **特点**: - 在每次创建对象时执行,并且在构造函数体执行之前执行。 - 一个中可以有多个匿名代码,它们按照在中出现的顺序执行(合并为一个)。 ### 为什么需要它们? - **静态代码**:当静态成员变量的初始化需要复杂的逻辑(例如需要异常处理)时,不能在声明时直接初始化,这时可以使用静态代码。 - **匿名代码**:当多个构造函数都需要执行相同的初始化代码时,可以将这部分代码提取到匿名代码中,避免重复。 ### 示例代码回顾 引用[1]中的代码: ```java public class Student { { System.out.println("匿名代码"); } static { System.out.println("静态代码"); } public Student() { System.out.println("构造函数"); } // main方法创建两个对象 } ``` 输出: ``` 静态代码 // 第一次加载时执行一次 ============ 匿名代码 // 创建第一个对象时执行 构造函数 ============ 匿名代码 // 创建第二个对象时执行 构造函数 ``` ### 总结作用 1. **静态代码**:用于初始化静态资源,在加载时执行一次。 2. **匿名代码**:用于初始化实例成员,在每次创建对象时执行(在构造函数之前)。 ### 相关问题 根据用户要求,生成相关问题: 1. 静态代码静态方法有什么区别? 2. 在多重继承(接口和父)的情况下,静态代码的执行顺序是怎样的? 3. 匿名代码能否访问静态成员?如果能,有什么限? </think> ### 匿名代码静态代码的作用简述 #### 1. **静态代码static block)** - **核心作用**:初始化**级别的静态资源**[^1][^2][^3] - **主要用途**: - 加载静态变量(如配置文件、全局常量) - 执行只需运行一次的初始化逻辑(如数据库驱动注册) - 预加载依赖资源(如图片、本地库) - **特点**: ```java static { System.out.println("静态代码调用"); // JVM加载时自动执行一次[^1] } ``` - ✅ 加载时自动触发 ✅ 仅执行**一次** ✅ 优先于所有其他代码和构造函数[^1] #### 2. **匿名代码(实例初始化)** - **核心作用**:初始化**对象级别的实例资源**[^1][^4] - **主要用途**: - 统一多个构造函数的公共初始化逻辑 - 校验对象状态有效性(如参数检查) - 设置实例变量的默认值 - **特点**: ```java { System.out.println("匿名代码调用"); // 每次new对象时执行[^2] } ``` - ✅ 每次`new`对象时自动触发 ✅ 在**构造函数前**执行[^1] ✅ 可为同一的不同构造函数提供统一初始化 --- ### 对比总结 | **特性** | 静态代码 | 匿名代码 | |------------------|-------------------------------|-------------------------------| | **执行时机** | 加载时(首次使用)[^1] | 每次创建对象时(new) | | **执行次数** | 仅1次(全局共享)[^2] | 每对象1次(独立) | | **初始化对象** | 级别的静态资源 | 对象级别的实例资源 | | **典型用例** | 加载配置文件、注册驱动[^4] | 构造函数公共逻辑、参数校验 | > **示例场景**: > ```java > public class DatabaseUtil { > static { > loadJDBCDriver(); // 静态:加载驱动(只需1次)[^4] > } > { > validateParams(); // 匿名:每次new对象校验参数 > } > } > ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值