实例变量和类变量的区别

本文详细阐述了静态变量与实例变量的区别,包括它们的语法特点、隶属关系、存在时机及如何在静态方法与非静态方法中使用。同时,通过具体示例展示了变量的使用过程及其在内存中的分配情况。

1.从语法区别上说:变量声明时前面加了static关键字的变量为静态变量又称为类变量,反之变量声明时没加static修饰的变量为实例变量。

2.变量的隶属:静态变量是该类的所有对象所共享的即该变量属于该类,而不属于某个对象,而实例变量则是属于特定的对象的。

3.变量何时存在:静态成员在类的对象初始化前可以通过类名访问,即静态变量在new对象之前就已经存在内存中,类的静态成员在类加载(即第一次创建一个类)的时候分配空间,静态成员贯穿整个生命周期==》如:main方法为static的。                              而实例变量要在创建对象时才分配内存。

4.静态方法:

1)静态方法中只能访问静态成员(原因:若要被访问,首先得在内存中已分配空间)

2)非静态方法中可以访问类的静态成员

3)静态方法中没有this引用

5.静态块

static{}主要是用于给类的静态化成员赋值的

{  }代码块在每次实例化对象前执行,在调用构造方法前执行

6.执行顺序:

1)先执行代码块再执行构造方法

2)先自动执行静态块,再执行静态方法(需要手动调用)

7.静态变量和实例变量,实例:

public class TestIns{
    public static void main(String[] args) {
        for(int i = 0;i<10;i++){
            new Son();
        }
    }

}
class Son{
    int var=0;
    static int staticVar =0;
    Son(){
        var++;
        staticVar++;
        System.out.println(var+"=============="+staticVar);
    }
}

结果:

1==============1
1==============2
1==============3
1==============4
1==============5
1==============6
1==============7
1==============8
1==============9
1==============10

8.静态块代码块的执行

public class TestIns{
    public static void main(String[] args) {
        new Son();
        Son.test();
    }

}
class Son{
    int var=0;
    static int staticVar ;
    static{
        staticVar=3;
        System.out.println("我是静态块,给静态变量赋值了");
    }
    Son(){
        System.out.println("我是       构造方法         被执行了");
    }
    {
        System.out.println("我是    代码块       被执行了");
    }
    static void test(){
        System.out.println("我是     静态方法");
    }
}


结果:

我是静态块,给静态变量赋值了
我是    代码块       被执行了
我是       构造方法         被执行了
我是     静态方法

===========================================================================

类变量可以通过类名直接调用,类名.静态变量名

实例变量要通过,对象.变量名

静态变量实例变量在定义、使用方式、存储生命周期等方面存在差异。 ### 定义 - **静态变量**:属于级别的变量,在加载时被创建,在内存中只有一份,所有实例共享该变量。可以使用`static`关键字来定义,例如: ```java public class MyClass { static int staticVariable = 0; } ``` - **实例变量**:与对象实例相关,每个对象实例都有自己独立的实例变量,用于描述对象的具体状态。无需使用`static`关键字,例如: ```java public class MyClass { int instanceVariable; } ``` ### 区别 - **所属关系**:静态变量属于,而实例变量属于对象实例 [^1]。 - **内存分配**:静态变量加载时分配内存,且在内存中只有一份;实例变量在创建对象时分配内存,每个对象都有自己的一份 [^1]。 - **访问方式**:静态变量可以通过名直接访问,也可以通过对象实例访问;实例变量只能通过对象实例访问。例如: ```java public class MyClass { static int staticVariable = 0; int instanceVariable; public static void main(String[] args) { // 访问静态变量 MyClass.staticVariable = 1; MyClass obj = new MyClass(); obj.staticVariable = 2; // 访问实例变量 obj.instanceVariable = 3; } } ``` - **生命周期**:静态变量的生命周期从加载开始,到卸载结束;实例变量的生命周期从对象创建开始,到对象被垃圾回收结束 [^3]。 ### 使用场景 - **静态变量**:适用于需要在的所有对象之间共享数据的场景,如计数器、全局配置、常量或共享资源(数据库连接池、日志对象等)。例如,一个计数器可以作为静态变量存储,并在每次创建对象时递增 [^2]。 ```java public class Counter { static int count = 0; public Counter() { count++; } public static int getCount() { return count; } } ``` - **实例变量**:适用于描述对象的具体状态,每个对象的实例变量值可以不同。例如,描述学生的年龄、姓名等信息。 ```java public class Student { String name; int age; public Student(String name, int age) { this.name = name; this.age = age; } } ``` ### 并发问题 静态变量发生并发时,会出现与时间有关的错误,一般通过加锁解决 [^3]。 ### 性能方面 静态方法比非静态方法少一个`this`参数,也不需要进行虚函数解析,效率上会高一些。但如果声明过多静态变量方法,可能会影响系统性能 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值