【问题标题】:writing a static method to set counter java?编写一个静态方法来设置计数器java?
【发布时间】:2020-03-12 04:52:48
【问题描述】:

我对编码很陌生,我想编写一个静态方法来将计数值设置为 1000。

我尝试做类似的事情

public static  int setCounter(){
        return 1000;

    }

当尝试在另一个中使用此方法来增加计数时

比如 someVariable = 符号常量 + setCounter()++; return someVariable,它给了我一个意外的类型错误,必需的变量,找到的值。我做错了什么?

编辑*

编辑*

private String getTicketNumber(){
    ticketNumber = TICKET_PREFIX + resetCounter()++;
    return ticketNumber;

 public static int resetCounter(int counter){
        counter = 1000;

    }

我想调用这个计数器以另一种方法增加它

【问题讨论】:

  • 注意到了。将来会添加所有内容,如果我之前不够清楚,请见谅
  • 当然,这都是一个学习的过程!学会提出好问题本身就是一项利基技能。这个问题中闻起来有点古怪的部分是,一般来说,将状态保持在静态(即单例)是不好的做法。他们确实有自己的位置,但它通常被用作最后的手段。见stackoverflow.com/a/138012/3280538
  • 我完全同意你的看法,它是编程入门课程。我早些时候在开始时将计数器声明为符号常量,然后在我的 getTicketNumber 方法中将其递增,它工作但再次阅读问题,我要求将其设为静态方法以将值设置为 1000

标签: java methods static


【解决方案1】:

静态属性与类的定义相关联,并且类的定义永远只有一个。每当您在类上使用 new 关键字时,都会创建一个实例。所有实例都从静态类中保留自己的私有数据。使用类实例时,您可以访问静态变量,但反之则不行。

您使用术语常量,但我认为您可能对它的含义有些误​​解。常量通常被声明为不可变的 static final 值(它们永远无法更改)。您应该无法修改常量。如果您愿意,静态值可以是可变的,这就是我们有时所说的有状态单例。

考虑这两个例子...一个修改实例变量,另一个修改静态变量。

class InstanceFoo {
    int i = 1000;
    int resetCounter() {
        i = 1000;
        return i;
    }
    int getAndIncrement() {
        return i++;
    }
}

class StaticFoo {
    static int i = 1000;
    static int resetCounter() {
        i = 1000;
        return i;
    }
    static int getAndIncrement() {
        return i++;
    }
}

在第一个示例中,您需要使用实例来访问变量。即,您需要使用 new 实例化它:

InstanceFoo foo = new InstanceFoo();
System.out.println(foo.resetCounter()); // 1000
System.out.println(foo.getAndIncrement()); // 1000
System.out.println(foo.getAndIncrement()); // 1001
System.out.println(foo.getAndIncrement()); // 1002
System.out.println(foo.resetCounter()); // 1000

在第二个您访问静态值。静态可以被类定义引用:

System.out.println(StaticFoo.resetCounter()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1000
System.out.println(StaticFoo.getAndIncrement()); // 1001
System.out.println(StaticFoo.getAndIncrement()); // 1002
System.out.println(StaticFoo.resetCounter()); // 1000

在您的示例中,您尝试通过执行resetCounter()++ 来增加计数器。由于完全不同于静态或实例的单独原因,这将不起作用。 Java 中的原始值(如整数、双精度、浮点数等)是按值传递,而不是按引用传递。

在非常简单的意义上,这意味着一旦你从像resetCounter 这样的方法返回一个原语,你实际上是在传递一个值的副本。然后您增加了副本,但与类关联的值保持不变(因为您只增加了变量的副本)。您需要在变量本身上调用后缀运算符++,而不是方法返回的值。即如果我有

class StaticFoo {
    static int i = 1000;
    static int get() {
        return i;
    }
}

System.out.println(StaticFoo.get()++); // prints 1000 and adds 1. the copy is then destroyed
System.out.println(StaticFoo.get()++); // prints 1000 and adds 1, the copy is then destroyed
System.out.println(StaticFoo.i); // prints 1000
System.out.println(StaticFoo.i++); // prints 1000 and now a postfix is applied to the static variable
System.out.println(StaticFoo.i++); // prints 1001 and another postfix is applied to the static variable
System.out.println(StaticFoo.get()); // prints 1002 because two postifx operators were applied to StaticFoo.i.

希望这可以帮助您入门。

【讨论】:

  • 我明白你在说什么,老实说我对你的回答如此简洁感到震惊!继续做你正在做的事情。谢谢!
【解决方案2】:

我认为您正在为不兼容的数据类型变量赋值。 请参阅我的代码以供参考:

      public class Main
         {
         public static void main(String[] args) {
         System.out.println("Hello World");
         int a = 10 + setCounter();
         System.out.println(a);
         }


        public static  int setCounter(){
        return 1000;
       }
       }

编辑*

private String getTicketNumber(){
    ticketNumber = TICKET_PREFIX + resetCounter()++;
    return ticketNumber;

 public static void resetCounter(int counter){
        counter = 1000;

    }

我想调用这个计数器以另一种方法递增它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 2015-02-21
    • 2013-11-29
    • 1970-01-01
    • 2015-10-22
    • 2019-08-31
    • 2015-10-05
    • 2011-04-28
    相关资源
    最近更新 更多