java中static关键字
2019-01-23 本文已影响0人
小漫画ing
package cn.manman.com;
class person{
String name;
int age;
String country;
public person(){
}
public person(String name,int age){
this.age=age;
this.name=name;
}
public person(String name,int age,String country){
this.age=age;
this.country=country;
this.name=name;
}
public void show(){
System.out.println("姓名:"+name+",年龄:"+age+",国家:"+country);
}
}
public class Test {
public static void main(String[] args) {
person per1=new person("林青霞",23,"中国");
per1.show();
person per2=new person("张三",15,"中国");
per2.show();
person per3=new person("王五",16,"中国");
per3.show();
}
}
结果
先直接看这段代码,有一个person类,里面有三个构造,一个方法,在测试类里面通过创建对象,创建了三个对象,并且给他设定了值,但是会发现,他们三者的国籍都是中国,每创建一次,堆里面就会有一个中国,如果数据库较大,会导致代码冗余,针对多个对象有共同的这样的成员变量值得时候,java就提供了一个关键字来修饰:static;
所以我们可以这样来改进代码:
package cn.manman.com;
class person{
String name;
int age;
static String country;
public person(){
}
public person(String name,int age){
this.age=age;
this.name=name;
}
public person(String name,int age,String country){
this.age=age;
this.country=country;
this.name=name;
}
public void show(){
System.out.println("姓名:"+name+",年龄:"+age+",国家:"+country);
}
}
public class Test {
public static void main(String[] args) {
person per1=new person("林青霞",23,"中国");
per1.show();
person per2=new person("张三",15);
per2.show();
person per3=new person("王五",16);
per3.country="美国";
per3.show();
}
}
结果
仔细比较这两段代码会发现里面的一点点区别就是给局部变量country前加了关键字static,然后给了林青霞国籍之后,张三也相应的给了对应的国籍,这就是多个对象有共同的成员变量时资源共享的操作;如果在多个对象里面恰好有一个或者几个与别人不一致,我们我可以单独赋值,例如per3,我们会发现王五的国籍是美国;
再来看:
public class Test {
public static void main(String[] args) {
person per1=new person("林青霞",23,"中国");
per1.show();
person per2=new person("张三",15);
per2.show();
person per3=new person("王五",16);
per3.country="美国";
per3.show();
per2.show();
per1.show();
}
}
结果
我们或发现再次调用之后,per1和per2 的国籍也被改变,这就是static关键字的好处;
static关键字的特点:
随着类的加载而加载
优先于对象存在
被类的所有对象共享
可以通过类名调用
package cn.manman.com;
class Student2{
int a=10;
static int b=20;
}
public class num1 {
public static void main(String[] args) {
Student2 student=new Student2();
System.out.println(student.a);
System.out.println(Student2.b);
System.out.println(student.b);
}
}
结果
我们明确成员变量a是一个非静态的变量,而成员变量b,是一个静态的变量。a的调用需要创建一个对象,然后去调用;而b则可以直接通过类名调用,也可以通过对象调用,但是推荐是类名调用;
static关键字的注意事项
- 在静态方法中是没有this关键字的
- 静态方法只能访问静态成员变量和静态成员方法;