Java内部类和静态内部类的区别

  • 静态内部类可以有静态成员(方法,属性),而非静态内部类则不能有静态成员(方法,属性)

  • 静态内部类只能够访问外部类的静态成员,而非静态内部类则可以访问外部类的所有成员(方法,属性)

  • 实例化一个非静态的内部类的方法:
//a.先生成一个外部类对象实例
OutClassTest oc = new OutClassTest();
//b.通过外部类的对象实例生成内部类对象
OutClassTest.InnerClass no_static_inner = oc.new InnerClass();
  • 实例化一个静态内部类的方法:
//a.不依赖于外部类的实例,直接实例化内部类对象
OutClassTest.InnerStaticClass inner = new OutClassTest.InnerStaticClass();
//b.调用内部静态类的方法或静态变量,通过类名直接调用
OutClassTest.InnerStaticClass.static_value;
OutClassTest.InnerStaticClass.getMessage();

静态内部类不持有外部类的引用

在普通内部类中,我们可以直接访问外部类的属性、方法,即使是private类型也可以访问,这是因为内部类持有一个外部类的引用,可以自由访问。而静态内部类,则只可以访问外部类的静态方法和静态属性(如果是private权限也能访问,这是由其代码位置所决定的),其他则不能访问。

静态内部类不依赖外部类

普通内部类与外部类之间是相互依赖的关系,内部类实例不能脱离外部类实例,也就是说它们会同生同死,一起声明,一起被垃圾回收器回收。而静态内部类是可以独立存在的,即使外部类消亡了,静态内部类还是可以存在的。

普通内部类不能声明static的方法和变量

普通内部类不能声明static的方法和变量,注意这里说的是变量,常量(也就是final static修饰的属性)还是可以的,而静态内部类形似外部类,没有任何限制。

上一篇 Java8新特性Function和BiFunction
下一篇 Java静态代码块与静态变量定义的执行顺序
目录
文章列表
1 Spring Security OAuth2 token存储Redis用户登出logOut
Spring Security OAuth2 token存储Redis用户登出logOut
2
jQuery获得select/option的值和对select/option进行操作
jQuery获得select/option的值和对select/option进行操作
3
Nginx中Access-Control-Allow-Origin字体跨域请求配置方法
Nginx中Access-Control-Allow-Origin字体跨域请求配置方法
4
TestNG自动化测试使用入门
TestNG自动化测试使用入门
5
Android NDK调用C++标准库问题
Android NDK调用C++标准库问题
最新评论
一位WordPress评论者
一位WordPress评论者
2月12日
您好,这是一条评论。若需要审核、编辑或删除评论,请访问仪表盘的评论界面。评论者头像来自 Gravatar。