#详细介绍:java中的static修饰的静态成员变量和静态方法!!!

目录

介绍static

静态成员变量的特性

详解static修饰的成员变量

不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

为什么说static修饰的成员变量与对象无关,不属于对象

生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

static修饰成员方法

静态方法的特性

为什么不能在静态方法中访问任何非静态成员变量

static成员变量初始化

1.直接初始化

2.通过静态代码块来初始化

3.通过静态方法更改static成员变量的值


 


介绍static

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

简单来说:在某些类的对象中存在一些相同的成员变量,那么这种成员变量就可以设置成static修饰的成员变量,当然这只是一种相对简单的介绍。

静态成员变量的特性

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

详解static修饰的成员变量

注意:由于类最好是单独存放一个java文件,本文为了方便展示把类定义在了一个java文件里

不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

假设三个同学是同一个班的,那么他们上课肯定是在同一个教室,那既然在同一个教室,那能否给类中再加一个成员变量,来保存同学上课时的教室呢?答案是不行的。

因为假设班级是String类型,如果把班级设置成普通的成员变量在没实例化“班级”成员之前里面存放的是null,而我们设置一个这种变量,且都是一个班级,参数都是相同的,就必须每new一个新对象就得实例化这个相同的参数,显得很繁琐冗余

那么把这个“班级”设置成static修饰的成员变量就不会有这样的麻烦,因为他是静态的,且与对象无关,每new一个新对象那么就会先赋予这个参数

例如:static String CS = "1班";

那么每次new一个对象就不需要实例化它,该对象CS成员会在第一次创建该类的对象时被实例化为“1班”; 

为什么说static修饰的成员变量与对象无关,不属于对象

原因很简单:

被static修饰的成员变量与对象的构造无关,它是放在方法区的,而对象是放在堆区的

看代码:

class Student{
    public String name;
    public int age;
    public static String CS = "1班";
}
public class Test {
    public static void main(String[] args) {
        System.out.println(Student.CS);
    }
}

结果:

 

注意:我并没有创建一个Student对象,而是直接Student.CS把CS打印出来了 ,并且在后面这张图片中我new了一个对象,但是对象中只有name和age两个成员变量

结论:static修饰的成员变量并不属于对象

生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

上面我没有创建对象直接用Student(类名)来访问类中的CS静态成员变量就能很好的说明这点,静态成员变量在访问类的时候就已经存在且被赋值了,且只执行一次,所以该变量才会是被共享的,所有对象都是的这个变量都是一样的值,

和类绑定自然而然就是类被加载是就创建好了,类没了这个变量也就没了

class Student{
    public String name;
    public int age;
    public static String CS = "1班";
    Student(String name,int age){
        this.name = name;
        this.age = age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student stu = new Student("张伟",18);
        Student stu1 = new Student("张三",18);
        System.out.println(stu.name + "CS="+Student.CS);
        System.out.println(stu1.name + "CS="+Student.CS);
    }
}

 结果:CS是一个全局的成员变量

static修饰成员方法
 

既然static修饰的成员变量不属于对象

那static属性应该如何访问呢?

答案是:使用static修饰的成员方法来

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

比如说:

public static String getCS(){
    return CS;
}

static修饰的getCS方法就能很好的访问到类中的静态成员变量CS,并且提取数据

静态方法的特性

1. 不属于某个具体的对象,是类方法
2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者
3. 不能在静态方法中访问任何非静态成员变量
(和前面的静态成员变量的特性差不多)

为什么不能在静态方法中访问任何非静态成员变量

我们知道:在创建一个对象之后,是通过对象的引用(this)去访问对象的普通成员,

而静态方法也是放在方法区的,且非静态方法有this参数,在静态方法中调用时候无法传递this引用

static成员变量初始化

1.直接初始化

2.通过静态代码块初始化

需要更改变量值可以:通过静态方法更改static成员变量的值

1.直接初始化

就是在创建静态变量时就初始化

static String CS = "1班";

2.通过静态代码块来初始化

static String CS;
static{
    CS = "2班";
}

3.通过静态方法更改static成员变量的值

pubilc static void setCS(String CS){
    Student.CS = CS;
}

本篇就分享都这里了,各位看官老爷给个三连支持一下吧!!!

 

 

 

  • 28
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值