JavaSE基础语法--static成员

文章讨论了Java编程中static关键字的使用,如何通过static修饰成员变量和成员方法,使其成为静态成员,存储在方法区并由所有对象共享。静态成员不依赖于对象实例,可以直接通过类名访问。文章还强调了在静态方法内不能直接调用非静态成员的规则。
摘要由CSDN通过智能技术生成

假设我们现在有一个场景,定义一个学生类。

class Student{
    private String name;
    private  int age;
    private int classroom_num;

    public Student(String name, int age, int classroom_num) {
        this.name = name;
        this.age = age;
        this.classroom_num = classroom_num;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11,8);
        Student student2=new Student("马2",12,8);
        Student student3=new Student("猪3",13,8);
        System.out.println("--------------------------------------");


    }
    }

定义了三个private权限的成员变量。并且通过构造函数给他们初始化了值。我们看到我们创建的三个同学对象中,他们都是一个班的。但是这样写的代码,却又三份属性。调试看看效果:

那么在内存布局中是这样子的:

但是其实我们只需要一份这样的数据就可以了。那么怎么做呢,这个时候就需要我们的static关键字了。我们把代码修改一下:

class Student{
    private String name;
    private  int age;
    private static int classroom_num=8;

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

public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11);
        Student student2=new Student("马2",12);
        Student student3=new Student("猪3",13);
        System.out.println("--------------------------------------");


    }
    }

 这个时候,我们再调试一下:

就只有name和age这两个成员变量了。这说明,我们的classroom_num成员变量,在加了static之后就不在堆上了。也不属于这个对象。那么它放了了什么位置呢?它在JVM的方法区内放着。而且只有一份。这种加了static关键字的变量我们称之为 静态成员变量。现在我们可以把成员变量分为两种:

1.静态成员变量(加了static关键字修饰的)

2.非静态成员变量(普通成员变量)

静态成员变量的一个很大特点是它不属于某个对象,是所有对象共享的。那么如何去访问这个静态变量呢?

我们知道静态成员变量不属于对象,也就不在堆上,虽然可以用对象引用去得到。不报错但是会报警告。我们最好通过类名去引用这个静态成员变量,我暂时把classroom_num的权限改为public:


 static关键字既然能修饰成员变量,是否能修饰成员方法呢?是可以的。有了static的加入,成员方法也分为两类:

1.静态成员方法/类方法(static 修饰)

2.非静态成员方法

和静态成员变量一样,静态成员方法被static修饰后也不再属于对象。但是可以通过类名来访问:

class Student{
    private String name;
    private  int age;
    public static int classroom_num=8;

    public static void Study(){
        System.out.println("这是个静态成员方法");
    }

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

public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11);
        Student student2=new Student("马2",12);
        Student student3=new Student("猪3",13);
        System.out.println("--------------------------------------");
        System.out.println(Student.classroom_num);
       Student.Study();


    }
    }

输出如下:

在静态方法内部是不能直接调用非静态的成员方法。非静态方法一定是依赖对象的引用。因此static关键字,能够让方法不依赖于对象而被调用。普通成员方法内部,是可以使用静态成员方法。总结几个点:

1.在静态方法内部是不能直接调用非静态成员方法。

2.在静态方法内部,不能直接使用非静态的数据成员。

3.静态方法里面是不能使用this的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值