> 文档中心 > 《JAVASE系列》类和对象篇:static关键字

《JAVASE系列》类和对象篇:static关键字


《JAVASE系列》类和对象篇:static关键字

文章目录

  • 《JAVASE系列》类和对象篇:static关键字
    • 前言
    • 1.为什么要static关键字?
    • 2.static修饰成员变量
    • 3. static修饰成员方法
    • 4.static 相关: Jvm虚拟机的小小扩展
    • 总结:

前言

本章学习内容:

  1. static关键字的作用
  2. 如何使用static
  3. 深入理解静态变量/方法在jvm的内存分配

1.为什么要static关键字?

​ 当我们在创建对象的过程中,如果每个对象都有共用的特性,我们即便知道也需要一个个得去初始化,这就显得比较麻烦复杂,在java中引入了静态关键字static,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。 这样就可以实现我们想要的不同对象的共性。

2.static修饰成员变量

当类中的一个成员变量由static修饰后,就称为静态成员变量。

静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。

class A {    public static int a = 20;    public  int b;    public  int c;    public void print(){ System.out.println(a+" "+b+" "+c+" ");    }}public class test {    public static void main(String[] args) { A aclass = new A(); A bclass = new A(); aclass.a = 10; aclass.b = 10; aclass.c = 20; bclass.a = 20; bclass.b = 20; bclass.c = 30; aclass.print(); bclass.print();    }}

运行结果:

在这里插入图片描述

如果A类中的变量a没有被static 修饰

在这里插入图片描述

则运行结果为

在这里插入图片描述

不同之处在于aclass与bclass对象中的a变量的结果不同

两者不同的原因:

被static修饰后的成员变量,属于类的属性,不依赖于对象,也就是说静态成员变量是类的特征,不同的对象去修改静态成员变量,会直接改变所有对象的共有特征,这也就导致了两个代码运行结果的不同。所以静态成员一般建议使用private修饰。

如何访问静态成员变量:

方式一:推荐

class A {    public static int a = 20;    public  int b;    public  int c;    public void print(){ System.out.println(a+" "+b+" "+c+" ");    }}public class test {    public static void main(String[] args) { A.a = 10;     //类名.静态变量名         }}

方式二:十分不推荐(因为静态变量是类的特性,不是对象的)

class A {    public static int a = 20;    public  int b;    public  int c;    public void print(){ System.out.println(a+" "+b+" "+c+" ");    }}public class test {    public static void main(String[] args) { A aclass = new A(); aclass.a = 10;     //对象名.静态变量名         }}

静态成员变量的特性:

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. HotSpot(Java虚拟机)中存储在方法区。
  4. 类变量存储在方法区当中
  5. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

3. static修饰成员方法

Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的,不依赖于对象。静态成员一般是通过静态方法来访问的。

在一般的实际工程当中,静态变量一般会被private修饰这样在类外就无法访问到了这个静态成员变量。
在这里插入图片描述

如何访问:一般通过静态方法访问

class A {    private static int a = 20;    public static int geta(){ return a;    }}public class test {    public static void main(String[] args) {    A.geta();    }}

静态方法特性:

  1. 不属于某个具体的对象,是类方法

  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,推荐使用类名访问

  3. 静态方法没有隐藏的this引用参数,因此不能在静态方法中访问任何非静态成员变量

在这里插入图片描述

由于静态方法是不依赖与对象的,所以没用this参数,而普通成员变量是需要实例化对象才可以产生的,所以在静态方法中自然无法访问普通成员变量。

可以在静态方法中通过创建该类对象去实现访问。

class A {    public  int b;    public int c;    private static int a = 20;    public static void print(){ A aclass = new A(); System.out.println(aclass.b);    }}
  1. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
    在这里插入图片描述在这里插入图片描述

  2. 普通方法是可以调用静态方法与静态变量的。

4.static 相关: Jvm虚拟机的小小扩展

jvm说明:

在这里插入图片描述

也就是说 ,静态变量是存储在方法区的,但是方法区又是在堆中的,但是方法区的等级是与堆相同的。

总结:

学习完本章内容,需要能解答以下问题:

  1. 说说static关键字的作用?
  2. 说说静态成员变量的特性?
  3. 说说静态方法的特性?
  4. 理解静态变量存储在jvm的内存位置吗?

感谢阅读!

与君共勉!
在这里插入图片描述

素彩网