实例化内部类

2022-08-31 17:43:35

我正在研究一个过度清除hashCode和equals方法的示例问题,但得到一个错误:“没有自定义哈希代码示例类型的封闭实例是可访问的。必须使用 CustomHashCodeExample 类型的封闭实例(例如 x.new A(),其中 x 是 CustomHashCodeExample 的实例)来限定分配。我写了一个内部类HashPerson,当我尝试在另一个名为testHashCodeOverride()的方法中实例化这个内部类时,我得到了这个错误。

public static void testHashCodeOverride(){   
    System.out.println("\nTest HashCode Override Method");
    System.out.println("==================================\n");

    HashPerson william = new HashPerson("willy");
    HashPerson bill = new HashPerson("willy");          
}

这段代码工作正常,即使我没有看到静态内部类或外部类的实例化,混淆:(

public class HashCodeExample {

    public static void testHashCodeOverride() {

        HashPerson william = new HashPerson("Willy");
        HashPerson bill = new HashPerson("Willy");
        System.out.println("Hash code for william  = " + william.hashCode());
        System.out.println("Hash code for bill     = " + bill.hashCode());

        HashMap table = new HashMap();
        table.put(william, "Silly");

        if (table.containsKey(william)) {
            System.out.println(table.get(william));
        } else {
            System.out.println("Key " + william + " not found");
        }

        if (table.containsKey(bill)) {
            System.out.println(table.get(bill));
        } else {
            System.out.println("Key " + bill + " not found");
        }


    }

    class HashPerson {
        private static final int HASH_PRIME = 1000003;

        public HashPerson(String name) {
            this.name = name;
        }

        public String toString() {
            return name;
        }

        public boolean equals(Object rhs) {
            if (this == rhs)
                return true;

            // make sure they are the same class
            if (rhs == null || rhs.getClass() != getClass())
                return false;

            // ok, they are the same class. Cast rhs to HashPerson
            HashPerson other = (HashPerson) rhs;

            // our test for equality simply checks the name field
            if (!name.equals(other.name)) {
                return false;
            }

            // if we get this far, they are equal
            return true;
        }
        public int hashCode() {
            int result = 0;
            result = HASH_PRIME * result + name.hashCode();
            return result;
        }
        private String name;

    }
}

答案 1

我想你想将类声明为.否则,它只能在包含类的上下文中实例化,无论是在包含类的方法中还是使用如下代码:HashPersonstatic

ContainingClass container = new ContainingClass();
HashPerson william = container.new HashPerson("willy");

实际上,我的经验法则是使任何嵌套类都是静态的,除非我有特殊原因不这样做。这也更有效,因为非静态嵌套类(称为内部类)始终包含对包含对象的隐式引用。


答案 2

您需要使内部类成为静态类,或者通过外部类的实例引用它。最有可能的是,您只是想使内部类保持静态。

类的非静态成员(变量、方法、内部类)是该类的每个实例。因此,从静态上下文(如 类似 )访问非静态成员时,需要指定封闭类的实例。testHashCodeOverride


推荐