一、static关键字的介绍
关于static关键字,我们最是在一个类的主方法中见到的,如"public static void main(String[] args)",static关键字在java中,通常用于公共的部分,static关键字可以修饰属性,也可以修饰方法。
二、static关键字修饰属性
下面举一个例子:
class Person{
//姓名
private String name;
//国籍
private String country;
public Person(String name){
this.name = name;
}
public String getName(){
return name;
}
public String getCountry(){
return country;
}
public void setName(String name){
this.name = name;
}
public void setCountry(String country){
this.country = country;
}
public void show(){
System.out.println("姓名:"+name+",国籍:"+country);
}
}
public class StaticDemo{
public static void main(String[] args){
Person person1 = new Person("人员一号");
Person person2 = new Person("人员二号");
Person person3 = new Person("人员三号");
person1.show();
person2.show();
person3.show();
//修改一个对象中的一个非static属性的值
person1.setCountry("中国");
System.out.println("修改一个对象中的一个非static属性的值");
person1.show();
person2.show();
person3.show();
}
}
运行结果:
通过结果我们可以看出,当修改某个对象中的属性时,其他对象的其对应的值是不会改变的
这个时候我们在country这个属性用static修饰,再次运行
//姓名
private String name;
//国籍
private static String country;
运行结果:
从结果中我们可以看出,只修改了一个对象中属性的值,其他对象的相对应的这个属性的值也发生了变化,这就是用static修饰属性的结果
下面从对象内存分析一下原因:
从图中我们可以看出,每个对象中的country属性变量值都指向静态区"中国"这个变量值,所以当任意一个对象中的这个变量
修改值的时候,其他对象的值都会变 。
三、static关键字修饰方法
用static关键字修饰的方法和属性都可以通过类名直接调用,即不创建对象,使用"类名.属性/方法"的形式调用,但是不推荐直接使用类名.属性直接
给属性赋值,因为这样赋值不够安全,例如年龄这个字段,通过类名.属性可以给年龄赋一个负值,显然年龄是负的不合理。所以以后在类中定义属性
的时候,用private修饰,这样就不能直接通过类名.属性这种方式赋值。但是用static关键字修饰的方法,建议我们通过类名.方法这种方式调用,因为
在方法中,我们可以加一些逻辑,避免不合理的情况出现,在日常开发中,使用类名.方法这种方式调用static关键字修饰的方法这种形式很常见。
class Person{
public static void eat(){
System.out.println("人要吃饭");
}
}
public class StaticMethodDemo{
public static void main(String[] args){
//创建对象并调用方法
Person person = new Person();
person.eat();
System.out.println("===========");
//直接通过类名直接调用
Person.eat();
}
}
运行结果: