我是一个新的java学习者,我正在创建一个程序,我希望在静态方法中访问非静态数据成员的值 但规则说我不能这样做,但我们可以在创建一个对象后访问它 我的问题是,如果我创建该类的一个对象,该数据成员的旧值被擦掉为什么? 我怎样才能在静态方法中使用非静态数据成员的旧值
import java.util.Scanner;
class emp
{
String name;
int rate;
static String c_name="TCS";
void setdata(String n,int s)
{
name=n;
rate=s;
}
static void employee_salary_cal(int t)
{
int day,rate1,Total;
day=t;
emp e2=new emp();
rate1=e2.rate;
Total=rate1*day;
System.out.println("Total salary " +Total);
}
void showData()
{
System.out.println("Employee name = " +name);
System.out.println("Employee pay rate per day = " +rate);
}
}
class emp_main
{
public static void main(String args[])
{
int da;
emp e1=new emp();
e1.setdata("alex",100);
System.out.println("Company name = " +emp.c_name);
e1.showData();
System.out.println("Enter Work days in months ");
Scanner sc=new Scanner(System.in);
da=sc.nextInt();
emp.employee_salary_cal(da);
}
}
程序输出:
Company name = TCS
Employee name = alex
Employee pay rate per day = 100
Enter Work days in months
25
Total salary 0
答案 0 :(得分:5)
只需将emp
对象传递给静态方法,而不是创建它的新实例。 “规则”是你不能访问实例变量和方法,但静态方法可以接收外部对象并摆弄它们。
static void employee_salary_cal(emp e, int t)
{
System.out.println("Total salary " + e.rate * t);
}
另一方面,你缺乏严肃的编程基础知识。我建议你再次学习一些非常基础的教程。
答案 1 :(得分:2)
为什么你会为这个功能使用静态?使用this
上下文。
void employee_salary_cal(int day)
{
System.out.println("Total salary " + (this.rate * day));
}
然后你可以把它称为像这样的实例函数
emp e = new emp();
e.employee_salary_cal(5);
答案 2 :(得分:0)
将您想要使用的对象作为参数传递给静态函数。
static void employee_salary_cal(emp employee, int t)
答案 3 :(得分:0)
能够从静态上下文访问实例变量是没有意义的。
每个班级都有一组静态字段。但是,每个类可以具有其每个实例变量的任意数量的副本。 JVM不知道您正在讨论的实例变量的哪个副本。
与其他人一样,如果你想从静态访问一个实例,你必须通过将实例传入它来告诉静态方法哪个实例。
答案 4 :(得分:0)
静态和非静态之间的区别:
class MyClass {
public int nonStatic=1;
public static int isStatic = 2;
}
MyClass a=new MyClass();
a.nonStatic = 3 // nonStatic =3; isStatic=2
MyClass b=new MyClass(); // nonStatic =1; isStatic=2
MyClass.isStatic = 3; // nonStatic =1; isStatic=3
MyClass c=new MyClass(); // nonStatic =1; isStatic=3
我想要解释的是,如果你创建了MyClass的N个实例,你还可以为nonStatic创建N个值(或者更精确的内存指针),但是对于isStatic只能创建一个;