Java中static关键字的使用

本文介绍了Java中static关键字的使用,包括静态变量和静态方法。static关键字使得属性和方法在类级别上共享,不依赖于对象实例。通过示例展示了如何通过类名直接访问静态成员,以及静态成员在内存中的唯一性。此外,还讨论了静态方法的特点,即不能访问非静态成员,并强调了在静态方法中不能使用this关键字。
摘要由CSDN通过智能技术生成

Java中static关键字的使用

static关键字的作用

为什么需要static关键字

当我们编写了一个类之后,其实只是描述完了它的属性和行为,但是并没有产生实质的对象,只有当我们new了一个对象之后,内存空间中才会分配空间给对象,它的属性和方法才可以调用。

而有时候,我们会遇到有些数据,无论我们在内存中是否new了对象或new了几个对象,它在数据空间中有且只有一份。

代码举例(为了尽量简洁,代码省略了构造器、权限修饰符、this关键字等)

假设我们有一个Chinese类,它的属性和方法如下:

public class Chinese{
     String name; //名字
     int age;// 年龄
     String nation;//国籍
}

现在一个非常简单的类就构造好了,我们new两个对象试试

public static void main(String[] args) {
		//new一个p1的对象
        Chinese p1 = new Chinese();
        p1.name = "xiaoming;";//名字叫小明
        p1.age=18;//小明18岁
        p1.nation = "China";//小明是中国人
        //p2同理
        Chinese p2 = new Chinese();
        p2.name="xiaohong";
        p2.age=20;
        p2.nation = "China";
        //输出信息
		System.out.println(p1.nation);
		System.out.println(p2.nation);
		
    }

我们会发现,在Chinese这个类中,无论你是一个什么样的人,无论你的年龄,职业,性别,名字,都会有一个相同的属性,那就是都是中国人,即nation =“China”.

但在new对象的时候,我们new了多个对象,就会在内存空间中划分多个对象空间,他们里面都会有各自的属性,也就意味着会有两个nation=“China”的属性,这就有点多余了。

所以我们需要在这个类中创建一个静态的变量,让Chinese类的所有对象都共享这个变量,这就需要我们的static关键字了

static的使用

静态变量

如上所述,我们改变Chinese类中nation属性的定义方式,在前面加上static关键字

public class Chinese {
     String name;
     int age;
     static String nation;
    }

接着再new对象试试看,但这次不给p2的nation赋值

public static void main(String[] args) {
		//new一个p1的对象
        Chinese p1 = new Chinese();
        p1.name = "xiaoming;";//名字叫小明
        p1.age=18;//小明18岁
        p1.nation = "China";//小明是中国人
        //p2同理,但我们不用再给p2的nation属性赋值
        Chinese p2 = new Chinese();
        p2.name="xiaohong";
        p2.age=20;
        //直接输出p2的nation属性的值看看
        System.out.println(p2.nation);//输出"China"
    }

可以看到,我们只给p1的nation属性赋值,p2也是同样的值,理所当然的,改变p2的nation值,通过p1调用,也是一样的结果。

		p2.nation="CN";
        System.out.println(p1.nation);//输出"CN"

因为nation通过static的关键字,已经成为了Chinese类的静态方法,这个类的所有对象都指向它,而且我们可以不创建对象,直接通过类来调用它,但我们得先给他赋个默认值。

public class Chinese(){
	static String nation = "CHN";
}

直接通过Chinese调用。

public static void main(String[] args) {
        System.out.println(Chinese.nation); //输出“CHN”
        }

静态方法

有了静态属性,肯定也可以有静态方法,同样的我们在Chinese中创建一个show()方法,来输出我们的国籍

public void show(){
        System.out.println("国籍为" + nation);
    }

一般来说我们要通过new一个对象,然后用对象来调用这个方法
但同样道理地,我们无论是哪个对象,哪个人,他都应该是China,或者说只要是这个类,不需要对象,都应该可以确定他是China,于是我们加上static。

public static void show(){
        System.out.println("国籍为" + nation);
    }

因为我们之前有设置默认值,所以我们直接通过Chinese调用试试看。

public static void main(String[] args) {
        Chinese.show(); //输出“国籍为CHN”
        }

总结

static修饰属性(静态属性)

  1. 当我们创建多个对象的时候,多个对象会共享同一个静态属性,当通过一个对象设置、修改静态变量时,会导致其他对象调用静态对象时,会是修改会设置过了的。
  2. 静态变量随着类的加载而加载,也可以通过 类.静态变量 的方式来调用。
  3. 静态变量的加载要早于对象的加载。
  4. 由于类只加载一次,所以静态对象在内存中也只会存在一份:位于方法区的静态域中。

static修饰方法(静态方法)

  1. 静态方法随着类的加载而加载,也可以通过 类.静态方法 的方式来调用。
  2. 静态方法中只能调用静态的方法和属性(因为早于对象的方法存在,所以不能调用)
  3. 在静态方法中不能使用thissuper关键字(同理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值