使用static关键字声明属性
在程序中使用static声明属性称作全局属性,也叫做静态属性。
使用static关键字声明的属性,在理解上可以将其看做一个公共属性,比如一个类Person,在实例化这个对象时,生成的对象中有一个属性country,而对于所有的实例的值都为China,那么我们可以将其定义为是static,这样我们就有了一个属于所有对象的属性,而且在生成很多对象之后,我们需要将这些对象的country属性修改为USA,如果是在以前我们需要对这些对象的属性一一修改,那么我们需要进行很多的操作才能完成这一个修改,我们在使用了static之后,我们想要修改它,只需要将这个属性修改掉就可以将所有对象的该属性修改,(这是由于它是属于大家的、共享的)。
在java中常用的内存区域:
- 栈内存空间,保存所有对象的名称(其实就是保存所有引用堆内存的地址)
- 堆内存空间,保存每个对象的具体属性内容。
- 全局数据区,保存static类型的属性。
- 全局代码区,保存所有的方法定义。
现在有一个问题,如果我们的static属性是所有的对象共享的,可以通过对象访问的话,那么我们任何一个对象都可以将其修改,那是不是违反常理呢,例如:我们几个合伙人现在共有3000元资金,如果我们任何一个人由于一些事而私自挪用,那么对于所有人来说,在不知情的情况下,资金变了,那显然是不行的,对于这个资金而言,是大家共有财产,应该由大家共同去使用,那么这个大家就是我们在实现时候的类,类是指代所有对象的共有属性的集合,那么java中就由类去访问它比较合适,访问格式:
类名.static属性
public class mystatic {
public static void main(String[] args) {
Person p1=new Person();
p1.name="李四";
p1.show();
Person p2=new Person();
p2.name="王五";
p2.show();
Person.country="USA";
p1.show();
p2.show();
}
}
class Person{
public static String country="China";
public String name;
public void show() {
System.out.println(country+name);
}
}
在运行结果中可以看出,在修改了country属性之后,连个对象的country属性值都发生了变化。
static关键字修饰方法
使用static关键字也是可以修饰方法的,它声明的方法有时也被称作类方法,因为该方法可以由类名直接调用,在方法中,非static声明的方法可以去调用static声明的属性或方法,但是static修饰的方法不能去调用非static声明的属性或方法。
**static是不能调用任何非static的东西,在程序中,所有的属性和方法必须在对象开辟堆内存之后才可使用,而static它是属于全局的,在对象未被实例化就可以被类名直接调用,这在时间上是很好解释的。比如:
public class mystatic {
public static void main(String[] args) {
// Person p1=new Person();
// p1.name="李四";
// p1.show();
// Person p2=new Person();
// p2.name="王五";
// p2.show();
// Person.country="USA";
// p1.show();
// p2.show();
System.out.println(Person.country);
}
}
class Person{
public static String country="China";
public String name;
public void show() {
System.out.println(country+name);
}
}
从这个例子可以看出,并没有任何一个对象,但是我们可以访问static修饰的属性,也就是说static在程序中出现的时间要比普通属性早,并且它消亡的时间比普通属性晚。
静态导包
Java包的静态导入,用import static代替import静态导入包是JDK1.5中的新特性。
一般我们导入一个类都用 import com……ClassName;而静态导入是这样:import static com……ClassName.;这里的多了个static,还有就是类名ClassName后面多了个. ,意思是导入这个类里的静态方法。当然,也可以只导入某个静态方法,只要把 .* 换成静态方法名就行了。然后在这个类中,就可以直接用方法名调用静态方法,
而不必用ClassName.方法名的方式来调用。
好处:这种方法的好处就是可以简化一些操作,例如打印操作System.out.println(…);就可以将其写入一个静态方法print(…),在使用时直接print(…)就可以了。
但是这种方法建议在有很多重复调用的时候使用,如果仅有一到两次调用,不如直接写来的方便.
例如:
在Java 5中,import语句得到了增强,以便提供甚至更加强大的减少击键次数功能,虽然一些人争议说这是以可读性为代价的。
这种新的特性成为静态导入。当你想使用static成员时,可以使用静态导入(在API中的类和你自己的类上,都可以使用该特性)。