Java学习 第八章 static成员

文章目录

  • 一、static成员
    • 前言
    • 1.static修饰成员变量
    • 2.static修饰成员方法
    • 3.static成员变量初始化

一、static成员

前言

我们实例化了三个个学生类的对象
例如:

public class Student {
    String name;
    int age;
    float score;
    public Student(String name, int age, float score){
        this.name = name;
        this.age = age;
        this.score = score;
    }
    public static void main(String[] args) {
        Student s1 = new Student("小明",15,4.0f);
        Student s2 = new Student("小红",14,4.1f);
        Student s3 = new Student("小黄",16,3.8f);
    }
}

三个学生具有三个属性,名字 年龄 学分,这三个都是对象自己特有的属性,现在假设三个同学是同一个班级的,就会在同一间教室上课,那么我们需不需要再定义一个成员变量表示,学生们上课时的教室呢?
答案是不需要的,因为在Student类中定义的成员变量,每个对象中都会包含一份(称之为实例变量),这个教室的属性并不需要每个学生对象中都存储一份,而是需要让所有的学生来共享。在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的。

1.static修饰成员变量

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

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
  3. 类变量存储在方法区当中
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
    例如
public class Student {
    public String name;
    public int age;
    public float score;
    public static String classroom = "101";

    public Student(String name, int age, float score){
        this.name = name;
        this.age = age;
        this.score = score;
    }

    public static void main(String[] args) {
        System.out.println(Student.classroom);//可以通过类名访问
        Student s1 = new Student("小明",15,4.0f);
        Student s2 = new Student("小红",14,4.1f);
        Student s3 = new Student("小黄",16,3.8f);
        //也可以通过对象来访问
        System.out.println(s1.classroom);
        System.out.println(s2.classroom);
        System.out.println(s3.classroom);
    }
}

运行之后我们可以通过监视来看到classroom并没有存到某一个对象里面
Java学习 第八章 static成员_第1张图片

2.static修饰成员方法

一般类中的数据成员都设置为private,而成员方法设置为public,那设置之后,在不同一个类就不能访问成员变量,Student类中classRoom属性如何在类外访问呢?
Java学习 第八章 static成员_第2张图片
这是就体现了Java的面向对象思想,对象的成员变量相当于cpu 内存,对用户不开放,我们能操控的只有键盘鼠标等函数接口,类似的我们可以写一个public的成员方法得其成员变量。
Java学习 第八章 static成员_第3张图片
这样就解决了private修饰的成员变量的问题,这种不能直接访问对象的成员变量用一个接口去访问大大提高了程序的安全性。
同理的我还可以写一个set接口来设置修改对象的成员变量
Java学习 第八章 static成员_第4张图片
这里IDEA提供有一个快速写好成员变量的get和set的方式
我们 点击右键 点击Generate(生成)再点击Getter and Setter
然后再摁下ctrl键 点击你要生成的成员变量的get和set的方法就能快速生成了。

Java学习 第八章 static成员_第5张图片
Java学习 第八章 static成员_第6张图片
Java学习 第八章 static成员_第7张图片
那static属性应该如何访问呢?
Java中,被static修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。静态成员一般是通过静态方法来访问的。
Java学习 第八章 static成员_第8张图片
可以看到通过对象来访问是不行的,一定要通过类来访问
Java学习 第八章 static成员_第9张图片
输出:101
【静态方法特性】

  1. 不属于某个具体的对象,是类方法
  2. 可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
  3. 不能在静态方法中访问任何非静态成员变量
public static String getClassRoom(){
	System.out.println(this);
	return classRoom;
}

// 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this

public static String getClassRoom(){
	age += 1;
	return classRoom;
}

// 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量age

  1. 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
public static String getClassRoom(){
	doClass();
	return classRoom;
}

// 编译报错:Error:(35, 9) java: 无法从静态上下文中引用非静态 方法 doClass()

3.static成员变量初始化

注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化静态代码块初始化。

  1. 就地初始化
    就地初始化指的是:在定义时直接给出初始值
public class Student{
	private String name;
	private String gender;
	private int age;
	private double score;
	private static String classRoom = "Bit306"; 
// ...
}

2. 静态代码块初始化
在代码块的学习中会说明。

你可能感兴趣的:(Java运算符解析,static,类和对象,java,学习,jvm)