1

我是一个新的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
4

5 回答 5

5

只需将您的emp对象传递给静态方法,而不是创建它的新实例。“规则”是您不能访问实例变量和方法,但静态方法可以接收外部对象并摆弄它们。

static void employee_salary_cal(emp e, int t)
{
    System.out.println("Total salary " + e.rate * t);
}

另一方面,你缺乏严肃的编程基础。我建议您再次遵循一些非常基本的教程。

于 2013-09-09T20:42:41.383 回答
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);
于 2013-09-09T20:46:37.760 回答
0

将要使用的对象作为参数传递给静态函数。

static void employee_salary_cal(emp employee, int t)
于 2013-09-09T20:42:55.073 回答
0

能够从静态上下文访问实例变量是没有意义的。

对于每个类,恰好有一组静态字段。但是,每个类都可以有其每个实例变量的任意数量的副本。JVM 不知道您正在谈论的实例变量的副本。

就像其他人所说的那样,如果你想从静态访问一个实例,你必须通过将实例传递给它来告诉静态方法哪个实例。

于 2013-09-09T20:46:58.557 回答
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

我要解释的是,如果你创建了 N 个 MyClass 的实例,你也会为 nonStatic 创建 N 个值(或者更精确的内存中的 int-pointer),但对于 isStatic 只有一个;

于 2013-09-09T20:54:56.693 回答