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在一个类中

定义,可重复使用,并需要访问外部类的静态成员。

 

四种类比较二:

java内部类 匿名内部类 静态内部类 成员内部类 局部内部类 横向对比

四种类比较三:

java内部类 匿名内部类 静态内部类 成员内部类 局部内部类 横向对比

 

四种类比较四:

 外部访问规则

外部访问和修饰符关系

普通内部类和静态嵌套类可以被外部访问

外部访问普通内部类和静态嵌套类,和普通类之间访问规则一样

 

java内部类 匿名内部类 静态内部类 成员内部类 局部内部类 横向对比

 

变量遮蔽

变量遮蔽:Shadowing

嵌套类变量和外部包围类的变量重名

以离得近作为优先原则

优先级高的变量会遮蔽优先级低的变量

外部包围类.this.变量名,可以访问到外部包围类的成员变量

静态嵌套类不能访问非静态变量

Java 7及以前,匿名内部类和局部内部类只能访问外部包围类的final成员变量

Java 8及以后,匿名内部类和局部内部类可访问外部包围类的final成员变量和

事实意义上的final变量(effectively final, 一个变量定值后,再也没有改过值)

 

注:本文参考学习了mooc课程java核心技术高阶

转载请注明出处。