java内部类 匿名内部类 静态内部类 成员内部类 局部内部类 横向对比
四种类比较一:
• Oracle官方文档比较
–匿名内部类:Use it if you need to declare fields or additional
methods. 应用它,如果需要定义额外的变量和方法
–局部内部类:Use it if you need to create more than one
instance of a class, access its constructor, or introduce a new,
named type (because, for example, you need to invoke
additional methods later). 在一个方法内,需要创建一个新的类
型,并重复使用
• Oracle官方文档比较
–普通内部类:Use it if your requirements are similar to those of a
local class, you want to make the type more widely available, and
you don't require access to local variables or method parameters.
和局部内部类相似,在一个类中定义,可重复使用,可以访问外部
类的成员,但不需要访问外部类方法的形参和内部变量
–静态嵌套类:Use a static nested class if you don't require access
an enclosing instance's non-public fields and methods在一个类中
定义,可重复使用,并需要访问外部类的静态成员。
四种类比较二:
四种类比较三:
四种类比较四:
外部访问规则
• 外部访问和修饰符关系
–普通内部类和静态嵌套类可以被外部访问
–外部访问普通内部类和静态嵌套类,和普通类之间访问规则一样
变量遮蔽
• 变量遮蔽:Shadowing
–嵌套类变量和外部包围类的变量重名
• 以离得近作为优先原则
• 优先级高的变量会遮蔽优先级低的变量
• 外部包围类.this.变量名,可以访问到外部包围类的成员变量
• 静态嵌套类不能访问非静态变量
• Java 7及以前,匿名内部类和局部内部类只能访问外部包围类的final成员变量
• Java 8及以后,匿名内部类和局部内部类可访问外部包围类的final成员变量和
事实意义上的final变量(effectively final, 一个变量定值后,再也没有改过值)
注:本文参考学习了mooc课程java核心技术高阶
转载请注明出处。