主函数一般定义为静态:
public static void main(String[] args) {
}
静态方法不能访问非静态数据域和非静态方法。下面例子
public class Display {
int value = 0; //非静态数据
int limit = 0; //非静态数据
public Display(int limit) {
//定义构造函数
this.limit = limit;
}
public void increase() {
//定义成员函数
value++;
if(value == limit)
value = 0;
}
public int getValue() {
//定义get方法
return value;
}public static void main(String[] args) {
System.out.println(value);//错误:静态方法不能访问非静态数据(在同一个类中也不行)
}
修改如下:
public class Display {
static int value = 0;//静态数据
int limit = 0;//非静态数据
public Display(int limit) {
//定义构造函数
this.limit = limit;
}
public void increase() {
//定义成员函数
value++;
if(value == limit)
value = 0;
}
public int getValue() {
//定义get方法
return value;
}public static void main(String[] args) {
System.out.println(value);//true:静态方法能访问非静态数据
}
}
通过对象访问非静态数据。如果想要让一个类的所有实例共享数据,就要使用静态变量,也称类变量。
如果某个对象修改了静态变量的值,那么同一个类的所有对象都受到影响。
如何判断一个变量或方法应该是实例还是静态的?如果一个变量或方法依赖于类的某个具体实例,就应该将他定义为实例变量或实例方法。如果一个变量不依赖于类的某个具体实例,就将他定义为静态的。例如:每个圆都有自己的半径,半径都要依赖某个圆,所以半径radius就是Circles类的一个实例变量。
public class Display {
static int value = 0;//静态变量
int limit = 0;//实例数据(非静态变量)
public Display(int limit) {
//定义构造函数
this.limit = limit;
}
public void increase() {
//定义成员函数
value++;
if(value == limit)
value = 0;
}
public int getValue() {//非静态方法可以访问静态变量
//定义get方法
return value;
}
public static void dispValue() {//静态方法
value++;//静态方法可以访问静态变量
limit++;//错误:静态变量不能访问非静态变量
}public static void main(String[] args) {
System.out.println(value);//error:静态方法不能访问非静态数据(在同一个类中也不行)
System.out.println(Display.value);
System.out.println(Display.limit);//错误:非静态数据不可以通过(类名.变量名)使用
Display t = new Display(1);
System.out.println(t.value);//静态数据也可通过对象访问,但一般不这么做,太麻烦了
System.out.println(t.limit);//非静态数据一般通过对象来访问
}
}