-4

我对 Java 还很陌生,我在理解我做错了什么时遇到了一些麻烦。以下是该程序目的的简要说明。

  1. 开一个银行账户。
  2. 存入1000。
  3. 提现400。
  4. 提现500。
  5. 打印结果和预期结果。

这是我的代码。bankAcc一直说不能从静态上下文中引用非静态变量。

 public class BankAccountTester
    {
        private double bankAcc; //Stores bankAcc balance

        public void money(double deposit)
        {
            deposit= (1000);

            int withdraw1 = -400;
            int withdraw2= -500;
            bankAcc= bankAcc + withdraw1 + withdraw2;
        }

        public double getbankAcc()//Returns value to bankAcc so it has new balance
        {
            return bankAcc;
        }

        //Prints out value and expected value
        public static void main(String[] args){
            System.out.Println("My bank account has " + bankAcc);
            System.out.Println("Expected is 100");
        }
    }
4

6 回答 6

0

main()是一种static方法,即没有类实例与之关联。WhilebankAccBankAccountTester类的实例成员,因此如果不先创建其实例就无法访问。使用以下对象实例测试您的程序:

public static void main(String[] args){
    BankAccountTester bat = new BankAccountTester();
    bat.deposit(0.0);
    System.out.Println("My bank account has " + bat.getbankAcc());
    System.out.Println("Expected is 100");
}

另外,请参见此处

于 2013-10-11T20:58:44.953 回答
0

当您编写课程时,课程内容有两种“风味”。静态的,作为与“类”相关联的全局属性存在,非静态的存在于您使用该类定义构建的各个对象上。因此,您的代码 -to java- 如下所示:

  • 对于对象:private double bankAcc, public void money,public double getbankAcc
  • 对于全局类访问:public static void main

无论是否构建了任何对象,静态代码都存在,因此您无法告诉静态方法它应该访问对象变量:据它所知,它不存在。即使您确实从此类创建了一个对象,它也会在本地有一个名为 的变量backAcc,但它不是静态可访问的。

您要遵循的一般配方是这样的:

public class Test {
    private long whatever = 123456;
    public Test() {
      // real code goes here.
      System.out.println("my whatever variable holds " + whatever);
    }
    public static void main(Sting[] args) {
        // build an object based on the Test class.
        // and let it handle everything else.
        new Test();
    }
}

当您编译并运行此代码时,Test 类将有一个静态(=全局可调用)方法main,该方法构建一个实际Test对象。在你这样做之前,有一些对象可以使用,只有类定义存在。一旦你构建了一个Test对象,它就可以以一种很好的面向对象的方式完成你需要做的所有事情。

于 2013-10-11T20:59:33.157 回答
0

首先,static(re. a variable) 意味着存在该变量的一个全局实例class。这与简单相反private double bankAcc;,即类的每个实例都有自己的bankAcc

更特别是对于您的问题,因为mainstatic不是. 这意味着,当您尝试打印时,您正在尝试从静态上下文访问非静态变量,这是不允许的。 BankAccountTesterbankAcc

没有看到你到底在哪里使用moneyand getbankAcc,你可以通过改变来解决这个问题:

private double bankAcc;

至:

private static double bankAcc;

于 2013-10-11T20:59:41.473 回答
0

该变量bankAcc是一个实例变量,这意味着它仅在您创建BankAccountTester(使用new BankAccountTester())的实例时才存在。由于您只是从static main()方法中调用它而不创建实例,因此没有bankAcc变量。将声明更改为private static double bankAcc;以使您的程序工作。

于 2013-10-11T21:01:03.060 回答
0

由于main是静态方法,所以只能引用静态变量和方法。静态变量如下所示:

private static double bankAcc;

如您所写,bankAcc 是一个实例变量,这意味着它与 BankAccountTester 的特定实例相关联。

由于您没有任何实例(即,您还没有创建new BankAccountTester()),因此您只能参考 BankAccountTester 的静态部分。

于 2013-10-11T21:02:03.727 回答
0

这是基本的Java。这就是为什么有人对你的问题投了反对票。但这是答案。

在 Java 中,执行代码的最常见方式是在通过 java 命令启动 JVM 时引用包含 main 方法的类。例如:

java com.me.MyClass

这将启动一个 jvm 并在 MyClass 上查找要执行的 main 方法。注意,主要方法是静态的。

另一方面,Java 类最常定义“类”。这些是对象结构的定义。对象是类的运行时实例,具有自己的内存。您的字段 bancAcc 是实例字段,而不是静态字段。这意味着您的 BankAccountTester 类的每个对象实例都将拥有自己的专用内存来保存 bankAcc 的值。请注意,除非您创建 ojbect,否则它不存在。

因此,在您的代码中,您还没有创建实例对象。您可以使用 new 构造函数执行此操作,然后在该实例对象上引用 bankAcc;请注意,除非有实例对象,否则没有 bankAcc。所以 。. .

BankAccountTester accTester = new BankAccountTester();
accTester.bankAcc = 100.00;
System.out.Println("My bank account has " + accTester.getBankAcc() );

请注意,您之所以感到困惑,是因为您错误地假设您的类中的 main 方法的存在与其中定义的类有关。这里 main 的位置是任意的,与您的实际类定义无关。为了在您的脑海中澄清它,您应该创建两个类,一个定义银行帐户,另一个是您的“引导程序”类。

引导程序将只包含一个 main 方法,它将创建对象的实例,由在单独的类文件中找到的类定义,并在它们上执行方法。

于 2013-10-11T21:06:33.103 回答