如何解决静态方法访问实例变量的报错以及为什么静态方法不能访问实例变量

如何解决静态方法访问实例变量的报错?


在学习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编译器会生成以下编译错误:
在静态方法内不允许访问非静态变量。


这是我的第一篇博客,谢谢观看

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值