[Java SE] 类与对象(五):static成员

1. 为什么要使用static成员

有一些通过类实例化出的对象,它们具有相同的特点,在实例化一个类时候,每次都实例化相同的属性或方法,显得有些麻烦,所以我们便引入了static成员。
我们都一样

static成员,又叫静态成员,也可以称作类成员,其不属于某个具体的对象,它是所有对象索共有的。下面我们拿“学生类”来举例。

public class Student {
    public String name;
    public int age;
    public String classroom;

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

    public void classbegin(){
        System.out.println("在同一间教室上课");
    }

    public static void main(String[] args) {
        Student s1=new Student("张三",20,"111");
        s1.classbegin();
        Student s2=new Student("李四",19,"111");
        s2.classbegin();
    }
}

从这段代码中,我们发现,张三和李四上课的教室是同一间教室,都是111班,这样每一次都对classroom进行初始化和每次调用classbegin方法显得过于麻烦,所以我们对以上代码使用类成员进行改进。

public class Student {
    public String name;
    public int age;
    public static String classroom="111";

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

    public static void classbegin(){
        System.out.println("在同一间教室上课");
    }

    public static void main(String[] args) {
        Student s1=new Student("张三",20);
        Student s2=new Student("李四",19);
        Student.classbegin();//这里先不用管,讲到后面会明白
    }
}

2.static修饰成员变量

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

  • 不属于某一个对象,是类的属性,是所有对象所共有的(最大的特点)
  • 既可以通过对象访问(会报警告),也可以通过类名访问,更推荐第二种。
  • 类变量储存在方法区中
  • 生命周期伴随类的一生(随着类的加载而创建,随着类的销毁而销毁

3.static修饰成员方法

我们对以上“学生类”代码进行一些简单修改

public class Student {
    public String name;
    public int age;
    private static String classroom = "111";

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

    public static String classbegin() {
        //System.out.println(this.name);  error
        return classroom;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1=new Student("张三",20);
        Student s2=new Student("李四",19);
        System.out.println(Student.classbegin());
    }
}

我们把类中的classroom进行了封装限定,并通过公开的classbegin接口来获取到classroom,并把主函数移动到了一个不同的类当中,在主函数中使用类名来访问classbegin方法。
从以上代码,我们可以看出static修饰成员方法的一些特点:

  • 不属于某个具体的对象,是类方法
  • 既可以通过对象访问(会报警告),也可以通过类名访问,更推荐第二种。
  • 不可以在静态方法中访问任何非静态成员变量
  • 同上面第三条的原理在静态方法中不可以调用任何非静态的方法
  • 但是反过来,非静态的成员变量可以调用静态成员变量,举例如下。
public class Student {
    public String name;
    public int age;
    private static String classroom = "111";
    public void test(){
		classbegin();//未报错
    }

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

    public static String classbegin() {
        return classroom;
        //this.test; error
    }
}
public class Test {
    public static void main(String[] args) {
        Student s1=new Student("张三",20);
        Student s2=new Student("李四",19);
        System.out.println(Student.classbegin());
    }
}
  • 静态方法无法重写,无法实现多态(后面会讲到)

4.static成员变量的初始化

注意:static成员变量不可以放在构造方法中来初始化
他的初始化方法只有两种,就地初始化和静态代码块初始化

  1. 就地初始化是指:在定义的时候就给出初始值,就如上面的“学生类”
private static String classroom = "111";
  1. 静态代码块初始化
    下一篇博文会讲到
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值