浅谈一下:Java学习中不得不知道的:static (静态)成员

举报
念君思宁 发表于 2023/02/07 17:24:48 2023/02/07
【摘要】 浅谈一下:Java学习中不得不知道的:static (静态)成员

下面笔者,按照之前的Student进行简单的说明:

class Student {
    private String name ;
    private int age ;
    private String classRoom ;//上课教室
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public void doClass() {
        System.out.println("姓名 "+ name +" 年龄 " + age +"正在上课学习");
    }
}
 
public class Main {
    public static void main(String[] args) {
       Student student1 = new Student("小赵",21);
       student1.doClass();
 
       Student student2 = new Student("小吴",19);
       student2.doClass();
 
       Student student3 =new Student("小王",20);
       student3.doClass();
    }
}

上述代码的运行结果为:

对于上述的代码,笔者画图简单解析一下:(堆区)

但是,对于每个学生的classRoom(上课教室)都一样!!因此,我们可以:

public static String classRoom ="山东大学数计学院!";

因此,当我们加了static 以后,每个对象里面,就没有了classRoom 只有name 和age ,此时的classRoom 在方法区!

因此,相当于,全部的学生,都在一个教室: 山东大学数计学院!

在Java当中,被static修饰的成员变量称为静态成员,也可以称为:类成员!其不属于某个具体的对象,是所有对象所共享的

static修饰的成员变量,称为静态成员变量

静态成员变量特性 :

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

 笔者将上面的代码;public static String classRoom ="山东大学数计学院!";,通过类名访问一下:

class Student {
    private String name ;
    private int age ;
   //private String classRoom ;//上课教室
   public static String classRoom ="山东大学数计学院!";
 
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public void doClass() {
        System.out.println("姓名 "+ name +" 年龄 " + age +" 正在上课学习");
    }
}
 
public class Main {
    public static void main(String[] args) {
        System.out.println(Student.classRoom);
    }
}

上述代码的运行结果为:

 在上述的代码中,没有开辟对象,但是仍能打印出来结果,证明,静态类的成员不属于对象,所以不用通过对象的引用来访问,直接通过类名就可以访问!!(静态不依赖于对象

下面讲解一下:用static修饰的成员方法

打今儿起,开始接触静态成员修饰的方法,所以,对于成员方法的叫法,我们也该改改口了!!

 静态成员方法:大致的写法为:

  public static void func() {
        System.out.println("static func()");
    }

非 静态成员方法:大致的写法为:

 public void doClass() {
        System.out.println("姓名 "+ name +" 年龄 " + age +" 正在上课学习");
    }

上述的区别主要在于:有无static !!

输出静态成员方法跟输出静态成员变量一样:Main 函数里面的写法为:

 public static void main(String[] args) {
        Student.func();
    }

然后就可以成功的输出最后的结果:

 因此,通过上述的代码可以看出:静态的成员方法,也不依赖于成员变量!

在静态方法中,我们需要注意的是:

  1. 在静态方法内部,不能直接调用非静态的成员方法,所有的非静态方法,一定依赖于对象的引用才能调用!
  2. 在静态方法内部不能直接使用非静态的成员数据  原因:非静态的数据成员是属于对象的,当我们调用的时候,没有实列化任何对象!!
  3. 只要是非静态的数据成员,都需要通过对象的引用才能调用
  4. 静态方法里面是不能使用this的
  5. 普通成员方法内部是可以使用静态的成员方法的

在我们一般进行Java项目的时候,一般类中的数据成员都设置为private ,而成员方法设置为public 

class Student {
    private static int size = 10;
 
    //构建getter and setter 方法!!来对数据进行更改!
    public static int getSize() {
        return size;
    }
 
    public static void setSize(int size) {
        Student.size = size;
    }
 
 
}
 
public class Main {
    public static void main(String[] args) {
        Student.setSize(12);
        System.out.println(Student.getSize());
 
    }
}

获取静态的成员变量或者是设置静态的成员变量,此时的方法最好是静态的,否则,你要是非静态的,你还得实列化对象,这就好比,脱裤子放屁,多费手续!!

下面讲解一下:对于静态变量的初始化!

1.直接赋值

public static String classRoom ="山东大学数计学院!";

2.默认初始化

    public static int arr ; // arr---->0
    public static String classRoom ;  //classRoom ------>null

3.可以通过getter 和setter方法来进行初始化

    //构建getter and setter 方法!!来对数据进行更改!
    public static int getSize() {
        return size;
    }
 
    public static void setSize(int size) {
        Student.size = size;
    }

4.在构造对象的时候,可以在构造方法中进行赋值(不建议这样写)

5.通过代码块进行赋值!!(对于代码块是什么??请详见笔者下篇博客!)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。