如果你可以访问一个变量或方法,那么不管它属于哪个对象你都可以访问它。如果this.a可以访问到,那another.a也可以访问到,只要它们是同一个类的实例。同一个类的实例对象可以随意调用其他实例的变量或方法。不过这样的代码一般都没有意义。现实生活中异常是equals()(由Eclipse生成, 15 - 18行):
package a;
publicclassPrivateIsClass{
privateObjectobject;
@Override
publicboolean equals(Object obj){
if(this== obj)
returntrue;
if(obj ==null)
returnfalse;
if(getClass()!= obj.getClass())
returnfalse;
PrivateIsClass other =(PrivateIsClass) obj;
if(object==null){
if(other.object!=null)
returnfalse;
}elseif(!object.equals(other.object))
returnfalse;
returntrue;
}
}
静态(static)类可能有很多实例访问类型不是对象级别的而是类级别的。
那些不支持有任何实例的类,通常被称为实用工具类。它们只包含静态字段和静态方法以及唯一的不被该类的任何静态方法调用的私有构造函数。在Java 8中也可以有这样的一个野兽(这个词翻译不通,译者注)在接口中实现,因为Java 8的接口可以有静态方法。我不觉得我们应该使用这个特性而不是实用工具类。我也不完全确信我们应该使用实用工具类。
静态类总是在另一个类或接口中。它们是嵌套类。他们是静态的,就像静态方法不能访问类的实例方法和字段一样,静态内部类也不能访问嵌入类的实例方法和字段。这是因为内部类没有嵌入类实例的引用(或者说是指针,如果你喜欢这么叫的话)。内部类(内部类,也即非静态嵌套类, 译者注),而非静态嵌套类, 没有嵌入类的一个实例,它是无法被创建的。每个内部类的实例都具有嵌入类实例的一个引用,因此一个内部类可以访问嵌入类的实例方法和字段。
因为这个原因,要是没有外部类的一个实例,你就不能创建一个内部类。当然,如果是当前对象,也就是this的话,你就可以不需要指定它。在这种情况下你可以使用new, 在这种情况下,也就是this.new的简式。在一个静态的环境中,例如从一个静态方法,你必须指定内部类应该创建哪个封闭类的实例。见第10行:
package a;
classNesting{
staticclassNested{}
classInner{}
void method(){
Inner inner =newInner();
}
staticvoid staticMethod(){
Inner inner =newNesting().newInner();
}
}
匿名类只能访问final变量变量必须是有效的final