从第一个Java程序开始,我们就一直都能看到static关键字(public static void main(String args[])),在Java中static关键字可以用来定义属性和方法。
在这里顺便介绍一下Java中常用的内存区域,主要有四种:
- 栈内存空间:保存所有的对象名称(更准确的说是堆内存空间的地址)。
- 堆内存空间:保存每个对象具体的属性内容。
- 全局数据区:保存static类型的属性。
- 全局代码区:保存所有的方法定义。
主方法中每一个组成单元的含义:
- public:主方法是程序的开始,所以这个方法对任何操作都一定是可见的,所以必须使用public(公共)。
- static:证明此方法由类名称调用。
- void:主方法是一切执行的开始点,既然是所有的开头,就不能返回,知道执行完毕为止。
- main:是系统规定好的方法名称,不能修改。
- String args[]:指的是程序运行时传递的参数,格式为:“ java 类名称 参数 参数 参数 参数 ”。
1.使用static关键字定义属性
如果一个类中的属性需要定义为公共属性(所有对象都可以使用),则可以在声明属性前加上static关键字,使属性成为公共属性。
class Book{
private String title;
private double price;
static String pub="清华大学出版社";
public Book(String title,double price){
this.title=title;
this.price=price;
}
public String getInfo(){
return "图书名称:"+this.title+",价格:"+this.price+",出版社:"+this.pub;
}
}
public class TestDemo{
public static void main(String args[]){
System.out.println(Book.pub); //在没有实例化对象的情况下直接输出属性内容
Book.pub="机械工业出版社"; //修改static属性内容
Book b1=new Book("Java核心技术",109.9);
System.out.println(b1.getInfo());
}
}
程序执行结果:清华大学出版社
图书名称:Java核心技术,价格:109.9,出版社:机械工业出版社
注意事项:
- static是一个公共属性概念,所有static定义的属性(没有封装)可以由类名称直接调用。
- static属性和非static属性最大的区别:static属性不受实例化对象的控制,而非static属性必须产生实例化对象才可以访问。
- static属性只有在描述共享概念或不受实例化对象限制时才会使用,而大部分情况下都使用非static属性。
2.使用static关键字定义方法
在定义类的普通方法时可以使用static进行定义,使用static定义的方法也可以在没有实例化对象产生的情况下由类名称直接调用。
class Book{
private String title;
private double price;
private static String pub="清华大学出版社";
public Book(String title,double price){
this.title=title;
this.price=price;
}
public static void setPub(String p){ //定义的static方法可以由类名称直接调用
pub=p;
}
public String getInfo(){
return "图书名称:"+this.title+",价格:"+this.price+",出版社:"+this.pub;
}
}
public class TestDemo{
public static void main(String args[]){
Book.setPub("机械工业出版社"); //在没有对象产生时调用,修改static属性内容
Book b1=new Book("Java核心技术",109.9);
System.out.println(b1.getInfo());
}
}
程序执行结果:图书名称:Java核心技术,价格:109.9,出版社:机械工业出版社
注意事项:
- 在Book类中对pub属性进行了封装,这就不能使用Book.pub来修改属性的内容,所有在Book类中定义了一个setPub()的static方法,这样就可以使用类名称直接调用setPub方法来修改pub属性内容。
- static方法不能直接访问非static属性和方法,只能调用static属性或方法。
- 非static方法可以访问static的属性或方法,不受任何限制。
观察下面两段代码,加深理解:
public class TestDemo{
public static void main(String args[]){ //static定义的方法
fun(); //static方法调用static方法
}
public static void fun(){ //static定义的方法
System.out.println("Hello World!");
}
}
public class TestDemo{
public static void main(String args[]){ //static定义的方法
new TestDemo().fun(); //对象调用方法
}
public void fun(){ //定义的非static方法
System.out.println("Hello World!");
}
}
3.static的实际应用
功能一:实现实例化对象个数的统计
class Book{
private static int num=0; //保存统计个数
public Book(){
num++;
System.out.println("这是第"+num+"个对象。");
}
}
public class TestDemo{
public static void main(String args[]){
new Book();
new Book();
new Book();
}
}
程序执行结果:这是第1个对象。
这是第2个对象。
这是第3个对象。
功能二:实现属性的自动设置
class Book{
private String title;
private static int num=0;
public Book(){
this("Java--"+num++);
}
public Book(String title){
this.title=title;
}
public String getTitle(){
return this.title;
}
}
public class TestDemo{
public static void main(String args[]){
System.out.println(new Book("Java").getTitle());
System.out.println(new Book().getTitle());
System.out.println(new Book().getTitle());
}
}
程序执行结果:Java
Java--0
Java--1