static概念
Java中的关键字,可用来定义类中的属性和方法,中文理解为静态的。
最大的特性就是:使用static定义的属性和方法可以在没有实例化对象的时候使用
为什么要使用static关键字?
首先通过一个demo引出问题
package basis;
/**
* @author lkh
* @date 2020/7/22 11:34
* @description
* @Version 1.0
*/
public class demo6 {
public static void main(String[] args) {
Person perA = new Person("张三",10);
Person perB = new Person("李四",10);
Person perC = new Person("王五",11);
System.out.println(perA.getInfo());
System.out.println(perB.getInfo());
System.out.println(perC.getInfo());
}
}
class Person{
private String name;
private Integer age;
String country = "中国"; //国家,暂时不使用private封装
//构造方法
public Person(String n,Integer a){
name =n;
age = a;
}
//getter、setter方法略
public String getInfo(){
return "姓名:" + this.name + "、年龄:" + this.age + "、国家:"+this.country;
}
}
分析:代码不需过多讲解,进行内存分析
- 每new一个对象,就在堆内存中开辟内存,案例中是三个实例,对应的属性及值如图;栈分别指向对应的堆
- 若此时,我们要将所有对象的country属性的值改为“中华人民共和国”!就需要加上
perA.country = "中华人民共和国";
perB.country = "中华人民共和国";
perC.country = "中华人民共和国";
如果我们new了5000个实例化对象!那么修改起来就会是一场噩梦,那还怎么修改?
解决办法: 将country属性修改为公共属性,而这种情况下必须使用static关键字------如果一个实例化对象修改了这一公共属性,其它对象的属性值也会相应修改!
只需要给country属性加上static关键字
package basis;
/**
* @author lkh
* @date 2020/7/22 11:34
* @description
* @Version 1.0
*/
public class demo6 {
public static void main(String[] args) {
Person perA = new Person("张三", 10);
Person perB = new Person("李四", 10);
Person perC = new Person("王五", 11);
Person.country = "中华人民共和国";
System.out.println(perA.getInfo());
System.out.println(perB.getInfo());
System.out.println(perC.getInfo());
}
}
class Person {
private String name;
private Integer age;
static String country = "中国"; //国家,暂时不使用private封装
//构造方法
public Person(String n, Integer a) {
name = n;
age = a;
}
//getter、setter方法略
public String getInfo() {
return "姓名:" + this.name + "、年龄:" + this.age + "、国家:" + this.country;
}
}
分析:给country属性加上static关键字后,该属性就成为公共属性,对于static属性的访问,由于其本身是一个公共属性,虽然可以通过对象进行访问 ,但是最好的做法应该是通过 所有对象的最高代表——类 进行访问。所以static属性可以由类名称直接调用(Person.country = “中华人民共和国”)
此时内存分析:
综上可得:static特性就是:公共性、可以在没有实例化对象的时候使用
什么时候使用static关键字
在进行类设计的时候首选一定是非static属性,只有考虑到公共信息存储(所有实例化对象的属性值是相同的)的时候才会使用到static属性
使用static关键字定义方法
与普通方法最大区别就是:static定义的方法可以在未实例化的时候进行调用
在程序中就存在着 static方法和非static方法。这两个方法间在调用上就有了限制
- static方法中只允许调用static属性或static方法,否则程序报错
- 非static方法允许调用static属性或static方法
原因:所有的static定义的属性和方法都可以在没有实例化对象的前提下使用,而所有的非static定义的属性和方法必须要有实例化对象的情况下才可以使用,这也是为什么不能在static方法中使用“this”的原因——this指向当前对象 ,与static可以在没有实例化对象的前提下使用冲突。
结论: 首选还是非static属性和方法只有在回避实例化对象调用并且描述公共属性的时候才会考虑static定义的属性和方法
参考资料:https://edu.aliyun.com/lesson_1011_8806?spm=5176.10731542.0.0.16ec6d9fEOZ8ey#_8806