实例化内部类

我正在处理一个示例性的问题: 重写 hashCode和equals方法,但得到一个错误:“不能包含CustomHashCodeExampletypes的封闭实例,必须使用一个封闭的CustomHashCodeExampletypes实例来限定分配(egxnew A()其中x是一个实例)我写了一个内部类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; } } 

我想你想声明HashPerson类为static 。 否则,只能在包含类的上下文中实例化,或者在包含类的方法中使用或使用如下代码:

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

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

您需要使内部类为静态,或通过外部类的实例引用它。 很可能你只是想让你的内部类是静态的。

类的非静态成员(variables,方法,内部类)是每个类的实例 。 因此,当从一个静态的上下文访问非静态成员时(比如像testHashCodeOverride这样的静态方法),你需要指定一个封闭类的实例。