本章目标
- 了解static关键字的作用
- 掌握static属性、static方法的声明及使用
- 掌握static使用的限制
1、具体内容
在Java中可以使用static声明属性或方法,因为在之前所讲解的属性和方法都是属于非static的,这样一来,每个对象都占有各自的内容,如果现在希望一个属性被所有对象所共同拥有,则可以将其声明为static类型,声明static类型的属性或方法也称为类方法,可以由类名称直接调用。
1.1、使用static声明属性
Static可以声明全局属性,全局属性到底有哪些作用呢?先看下以下程序代码:
class Person{ // 定义Person类
String name ; // 定义name属性,暂时不封装
int age ; // 定义age属性,暂时不封装
String country = "A城" ; // 定义城市属性,有默认值
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo01{
public static void main(String args[]){
Person p1 = new Person("张三",30) ; // 实例化对象
Person p2 = new Person("李四",31) ; // 实例化对象
Person p3 = new Person("王五",32) ; // 实例化对象
p1.info() ;
p2.info() ;
p3.info() ;
}
};
输出结果:
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城
以上代码确实实现了一些基本的功能,但是如果此时城市的名称不叫“A城”,而改成了“B城”,如果现在已经产生了5000个对象,那么需要修改5000个对象的country属性。所以此时最好使用static关键字声明属性。
范例:使用static修改城市属性
class Person{ // 定义Person类
String name ; // 定义name属性,暂时不封装
int age ; // 定义age属性,暂时不封装
static String country = "A城" ; // 定义城市属性,有默认值,static
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo02{
public static void main(String args[]){
Person p1 = new Person("张三",30) ; // 实例化对象
Person p2 = new Person("李四",31) ; // 实例化对象
Person p3 = new Person("王五",32) ; // 实例化对象
System.out.println("--------------- 修改之前 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
p1.country = "B城" ; // 修改static属性
System.out.println("--------------- 修改之后 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
}
};
输出结果:
--------------- 修改之前 -------------
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城
--------------- 修改之后 -------------
姓名:张三,年龄:30,城市:B城
姓名:李四,年龄:31,城市:B城
姓名:王五,年龄:32,城市:B城
修改一个对象中的country属性,则其他对象的country属性内容全部改变,证明此属性是所有对象共享的。
![](https://img.haomeiwen.com/i7099290/d5ad199f1efb22b1.png)
![](https://img.haomeiwen.com/i7099290/782ed826491a0a5b.png)
1.2、声明static方法
如果一个方法是用了static关键字声明,则此方法可以直接使用类名称进行调用,下面将之前代码中的全部属性进行封装。
class Person{ // 定义Person类
private String name ; // 定义name属性,暂时不封装
private int age ; // 定义age属性,暂时不封装
private static String country = "A城" ; // 定义城市属性,有默认值,static
public static void setCountry(String c){ // 此方法可以直接由类名称调用
country = c ;
}
public static String getCountry(){
return country ;
}
public Person(String name,int age){
this.name = name ;
this.age = age;
}
public void info(){ // 得到信息
System.out.println("姓名:" + this.name + ",年龄:" + this.age + ",城市:" + country) ;
}
};
public class StaticDemo04{
public static void main(String args[]){
Person p1 = new Person("张三",30) ; // 实例化对象
Person p2 = new Person("李四",31) ; // 实例化对象
Person p3 = new Person("王五",32) ; // 实例化对象
System.out.println("--------------- 修改之前 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
Person.setCountry("B城") ; // 调用静态方法修改static属性的内容
System.out.println("--------------- 修改之后 -------------") ;
p1.info() ;
p2.info() ;
p3.info() ;
}
};
输出结果:
--------------- 修改之前 -------------
姓名:张三,年龄:30,城市:A城
姓名:李四,年龄:31,城市:A城
姓名:王五,年龄:32,城市:A城
--------------- 修改之后 -------------
姓名:张三,年龄:30,城市:B城
姓名:李四,年龄:31,城市:B城
姓名:王五,年龄:32,城市:B城
注意点:使用static方法,不能调用非static的属性或方法
class Person{ // 定义Person类
private static String country = "A城" ; // 定义静态属性
private String name = "Hello" ;
public static void sFun(String c){
System.out.println("name = " + name) ; // 错误,不能调用非static属性
fun() ; // 错误,不能调用非static方法
}
public void fun(){
System.out.println("World") ;
}
};
实际上这一点非常好理解,因为static属性或方法可以在对象没有实例化的时候就直接进行调用了。
1.3、static的其他应用
![](https://img.haomeiwen.com/i7099290/65611ad5abf76b3d.png)
因为每一个实例化对象在操作的时候都必须调用构造方法完成,所以如果现在要进行统计的话,则直接在构造方法之中增加一个static的属性即可。
class Demo{ // 定义Person类
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 只要有对象产生就应该自增
System.out.println("产生了" + count + "个对象!") ;
}
};
public class StaticDemo06{
public static void main(String args[]){
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
new Demo() ; // 增加新对象
}
};
输出结果:
产生了1个对象!
产生了2个对象!
产生了3个对象!
范例:自动编名操作
class Demo{ // 定义Person类
private String name ; // 保存名字
private static int count = 0 ; // 所有对象共享此属性
public Demo(){
count++ ; // 有对象产生就自增
this.name = "DEMO-" + count ; // 自动进行编名操作
}
public Demo(String name){
this.name = name; // 可以通过构造赋值
}
public String getName(){ // 取得姓名
return this.name ;
}
};
public class StaticDemo07{
public static void main(String args[]){
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("LXH").getName()) ;
System.out.println(new Demo().getName()) ;
System.out.println(new Demo("MLDN").getName()) ;
System.out.println(new Demo().getName()) ;
}
};
输出结果:
DEMO-1
LXH
DEMO-2
MLDN
DEMO-3
这一点,在之后的Java应用中也会有相关的实现。
2、总结
1、使用static声明属性与非static声明属性的区别
2、使用static声明的属性或方法可以直接由类名称调用
3、使用static方法的时候一定要注意,只能访问static声明的属性或方法,而非static生命的属性和方法是不能访问,因为可以在对象没有实例化时就直接调用,而其他的属性或方法在对象实例化之后才可以使用。
4、了解static的两个范例。
网友评论