统计Java对象和静态变量[已关闭]

kiayqfof  于 2023-03-28  发布在  Java
关注(0)|答案(2)|浏览(93)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

3天前关闭。
Improve this question
我对对象计数器经过几次修改后所做的更改有疑问。
我希望计数器在创建每个对象后告诉它的值,这工作正常,但是当我分别为每个对象询问计数器的值时,它给出了相同的输出,尽管使用了“this”关键字,以便只有当前对象的计数器的值增加。计数器的示例变量对于此输出是静态的。当使用未修改的示例变量作为计数器时,每种情况下的输出都是1,这是可以理解的,所以我怀疑是否只创建了一个静态变量,或者这些更改是否应用于下面所附代码中的所有对象。

2jcobegt

2jcobegt1#

如果你想计算你的类中Object的个数,你可以在代码中做以下事情。

  • 创建一个静态变量。
  • 创建一个示例块。如果你要创建任何对象,那么示例块将被调用。
  • 现在将该变量添加到示例块中。

例如:- class CountObject { static int objectCount;{ ++ bytes;}公共静态void main(字符串str[]){
int count = new count();System.out.println();{\fnSimHei\bord1\shad1\pos(200,288)}

qni6mghb

qni6mghb2#

计算示例化次数的一种方法是在类上放置一个static字段。在该字段中,存储一个递增的数字。
static为该类创建一个字段,而不涉及该类的任何示例。这实际上是一个global variable。通常最好避免全局变量,但有时它们也很方便。
这样的静态字段不是面向对象的,因为它们存在于任何对象之外。所以你使用this.someStaticField是不合适的,也是误导性的。使用类名:Person.someStaticField .
如果有任何跨线程示例化的可能性,那么您必须采取措施保护static字段免受并发问题的影响。一种简单的保护方法是使用AtomicLong对象。
在下面的代码中,请注意我们是如何将字段声明与填充字段结合起来的,这意味着Java语言规范保证字段在创建外部类的任何示例之前被填充。
final防止任何其他AtomicLong示例替换我们的原始示例。
需要说明的是,作为一个static,我们 * 没有 * 将递增计数附加到每个Person对象。在这里看到的代码中,在每个Person示例化时,我们递增数字,将该数字转储到控制台,然后忘记那个特定的数字。每个Person对象不记得那个递增的数字,因为没有member field存储那个数字,只有一个class fieldstatic).我们有一个,只有一个,AtomicInteger号码存在,而这个应用程序运行.

public class Person {
    static final AtomicLong countInstances = new AtomicLong() ; // Populated when class loads. 

    public Person() {
       long count = Person.countInstances.incrementAndGet() ;
        System.out.println( "Created Person # " + count ) ;
    }
}

示例代码:

List< Person > persons = 
    List.of(
        new Person() ,
        new Person() ,
        new Person()
    );
System.out.println( persons ) ;

请在Ideone.com上查看此代码。

Created Person # 1
Created Person # 2
Created Person # 3
[Person@548c4f57, Person@1218025c, Person@816f27d]

相关问题