如何解决静态方法访问实例变量的报错?
在学习Java类的知识的时候,遇到下面的return age报错:
class Pig {
private int age;
private int weight;
private char sex;
public Pig(int age, int weight, char sex) {
this.age = age;
this.weight = weight;
this.sex = sex;
}
public static int getAge(){
return age;//这里报错
}
}
这里的return age会报错,因为age是一个实例变量,而getAge()是一个静态方法。静态方法不能访问实例变量,只能访问静态变量。如果想让getAge()返回age的值,需要把age声明为静态变量,或者把getAge()声明为实例方法。
代码块如下:
class Pig {
private static int age; // 静态变量
private int weight;
private char sex;
public Pig(int age, int weight, char sex) {
this.age = age;
this.weight = weight;
this.sex = sex;
}
public static int getAge(){ // 静态方法
return age;
}
}
或者:
class Pig {
private int age; // 实例变量
private int weight;
private char sex;
public Pig(int age, int weight, char sex) {
this.age = age;
this.weight = weight;
this.sex = sex;
}
public int getAge(){ // 实例方法
return age;
}
}
为什么静态方法不能访问实例变量
成员方法分为静态方法和实例方法。用static修饰的方法叫静态方法,或类方法。静态方法也和静态变量一样,不需创建类的实例,可以直接通过类名来访问,例如:
public class Sample1 {
public static int add(int x, int y) { //静态方法
return x + y;
}
}
public class Sample2 {
public void method() {
int result =Sample1.add(1,2); //调用Sample1类的add()静态方法
System.out.println("result= " + result);
}
}
因为静态方法不需通过它所属的类的任何实例就会被调用,因此在静态方法中不能使用this关键字,也不能直接访问所属类的实例变量和实例方法,但是可以直接访问所属类的静态变量和静态方法,但是可以直接访问所属类的静态变量和静态方法。例如在Voter类中,count变量是静态变量,表示所有选民的共同投票数,name变量是实例变量,表示每个具体选民对象的名字。以下程序在Voter类的静态方法printVoteResult()中直接访问count和name变量:
public class Voter{
private static final int MAX_COUNT=100; //静态变量,最大投票数,到达此数就停止投票
private static int count; //静态变量,投票数
private static Set<Voter> voters=new HashSet<Voter>(); //静态变量,存放所有已经投票的选名
private String name; //实例变量,投票人姓名
/** 打印投票结果 */
public static void printVoteResult(){
System.out.println("当前投票数为:"+count); //合法
System.out.println("选民的姓名:"+name); //编译错误
System.out.println("选民的姓名:"+this.name); //编译错误
……
}
}
前面一堆废话 ,本质是Java虚拟机无法定位它们。如果程序中出现这样的操作,Java编译器会生成以下编译错误:
在静态方法内不允许访问非静态变量。
这是我的第一篇博客,谢谢观看