访问java中静态方法中的非静态数据

时间:2013-09-09 20:40:13

标签: java

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

5 个答案:

答案 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只能创建一个;