目的

  为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合,我并不是很清楚,留下一些值得思考的问题作为记录,说不定以后能自己来填。于是就会有这篇文章啦。

  常规使用方法我也不想介绍,网上一大把,我就说说比较容易错的,值得注意的地方。

注意

  这篇文章只是分享一下我对内部类的一些研究与困惑吧,说不定对大家有帮助,说不定能引导大家一起思考学习。Java语法知识其实是很复杂很容易错的,特别是在细节方面。所以我的观点可能会有各种错误。

  另外我的JDK版本是1.7。JDK1.8的版本貌似对内部类的规则有一些修改,所以请大家注意。

非静态非匿名内部类

不能拥有static成员

网上大部分文章的说法大致是这样的,就是告诉你这种内部类不能拥有static的方法,属性。其实这句话有那么点小问题。非静态内部类也可以拥有static的属性的(static区块不行),但是要求这个static属性必须是常量,这个地方经过我的研究,我觉得和 “调用类的static属性,但却不会初始化这个类的static区块和其他static变量” 有点相似。什么意思?就是说

 class Outter{
class Inner{
final static int a = 9;
}
}

这样是没有编译错误的。要求静态变量a必须是final类型的,且是基本类型,且是字面值

 class Outter{
class Inner{
final static int a = get();
} static int get(){
return 1;
}
}

这样就会报错,因为a不是字面值。

这里我想请大家看一下我的另外一篇学习记录,这种变量是不会触发类初始化的。

地址:http://www.cnblogs.com/abcwt112/p/4567332.html 分析标题下面的第二小点。

当然,这种字面值貌似没什么卵用啊。。。。所以说这种内部类不能有static成员大致上好像也算对吧。。

为什么不能拥有static成员?

我觉得道理是这样的(个人理解)。非静态的内部类是和普通成员一样的,是隶属于外部类对象的,创建这种内部类对象需要先创建外部类对象。也就是说这种内部类是不能单独于外部类对象存在的。这个道理大家都明白,一个成员变量怎么能脱离于类的对象独立存在呢。那假设这种内部类可以拥有static的属性,比如static int a = 1;那这个a数据存在哪里呢?根据前面的分析,应该是存在于分配给外部类对象拥有的内存中的,那么等外部类对象呗销毁以后,这个a分配的内存也会被销毁。这样的话修改这个a毫无意义,因为每次都是重新分配内存,每次值都是1。所以这个static没什么用,并不是全局的。

这个问题我是这么理解的。我觉得等我看完JVM虚拟机(我觉得有可能final static int与static int变量值存的地方可能不一样)或者学习汇编(可以观察数据是怎么存储的)以后再看它可能会有更深的理解。

静态内部类

只能调用外部类的静态方法与属性

这点蛮好理解,就像静态方法main里不能调用非静态的属性,方法一样。但是这并不代表静态内部类就不能定义 非静态的方法和属性。它不能调用外部类的非静态的成员,但是却可以在自己内部定义。毕竟它是个类。。。。

 public class StaticTest {
static int a = 9; private static class Inner{
public static void main(String[] args) {
System.out.println(StaticTest.a);
} public void doSomething(){ }
}
public static class Inner2{
}
}

这里代码就没有什么问题,能编译通过(doSomething方法)。

用途(废话)

  静态内部类是没有指向外部类的引用的,所以说它和外部类并没有什么关系,因此,即使没有外部类的对象,也可以直接创建静态内部类的对象。但是我觉得如果是这样使用的话,那完全没必要把类弄成静态内部的,直接创建外部类一般的类就OK了。所以说静态内部类肯定有它自己独特的作用。既然是个内部类,我觉得应该会声明成private,不然还不如创建一个外部类呢。。。。那private static的class有啥用处呢?我也不清楚。。。现在我唯一觉得有用的地方就是可以把测试代码main方法写在里面。因为是private的类,外接不能调用它,也就不能调用写的main函数了。。但是如果只是测试的话可以使用junit test呀。。。不可能为了测试就专门搞这么一个语法。。。这点值得日后研究,等我代码看得多了,说不定会有新体会。

  我看Apache Shiro框架中的Ini类就有个静态内部类Section(被声明为public类型),这个Section类独立存在毫无意义,外部只需要用到Ini类就行了。但是又不能没有,因为这个类地位其实和外部类Ini差不多,Ini是整个配置文件的抽象,Section是整个配置文件中每一小节的抽象。如果没有这个类,可能Ini中可能需要定义大量的static方法和大量的map来做关联,这样可能会很麻烦,所以shiro用到了这个静态内部类。具体内容可以查看我的另外一篇文章,介绍了Ini类:http://www.cnblogs.com/abcwt112/p/4641500.html

Java 静态内部类与非静态内部类 学习记录.的更多相关文章

  1. JAVA静态和非静态内部类

    JAVA静态和非静态内部类 一直对java的静态和非静态内部类的东东理解不清楚,今天测试了一下,下面把测试结果记录一下,加深印象.用于以后查找. 直接上代码. package com.test.xml ...

  2. 【java提高】(18)---静态内部类和非静态内部类

    java提高](18)-静态内部类和非静态内部类 定义 放在一个类的内部的类我们就叫内部类. 自己从开发到现在其实用到内部类主要在两个地方会考虑用内部类: 1.使用静态内部类的单例模式 2.将Json ...

  3. 《java入门第一季》之面向对象静态内部类和非静态内部类的区别

    很感谢在内部类章节,"开心阳"先生给与的建议.使用静态内部类.这里就简单说一下静态内部类的使用. package com.devin; public class MyMain{ p ...

  4. Java中static关键字声明的静态内部类与非静态内部类的区别

    (1)内部静态类不需要有指向外部类的引用.但非静态内部类需要持有对外部类的引用.(2)非静态内部类能够访问外部类的静态和非静态成员.静态类不能访问外部类的非静态成员.他只能访问外部类的静态成员.(3) ...

  5. java开源项目之IQQ学习记录之项目环境搭建与启动

    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/18779727 作者:sushengmiyan 现在就码字说说今天晚上搞定的一个项目 ...

  6. JAVA基础语法 我的学习记录

    1.标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划线( ...

  7. 《Java程序设计》第二周学习记录(2)

    目录 3.1 运算符与表达式 3.3 if条件分支语句 3.7 for语句与数组 参考资料 3.1 运算符与表达式 和C语言基本上没有区别,要注意的是关系运算符的输出结果是bool型变量 特别要注意算 ...

  8. 《Java程序设计》第二周学习记录(1)

    目录 第2章 基本数据类型与数组 2.1 标识符与关键字 2.2 基本数据类型 2.3 类型转换运算 2.4 输入.输出数据 2.5 数组 参考资料 第2章 基本数据类型与数组 2.1 标识符与关键字 ...

  9. 《Java程序设计》第一周学习记录(2)

    目录 使用JDB调试程序 系统文件被覆盖的挽救 参考资料 使用JDB调试程序 JDB是JDK自带的基于命令行的调试程序.我们先来man一下吧(说到这里,我之前在翻娄老师的博客的时候看到一篇文章:做中学 ...

随机推荐

  1. JavaSe:ThreadLocal

    JDK中有一个ThreadLocal类,使用很方便,但是却很容易出现问题.究其原因, 就是对ThreadLocal理解不到位.最近项目中,出现了内存泄漏的问题.其中就有同事在使用ThreadLocal ...

  2. 0040 Java学习笔记-多线程-线程run()方法中的异常

    run()与异常 不管是Threade还是Runnable的run()方法都没有定义抛出异常,也就是说一条线程内部发生的checked异常,必须也只能在内部用try-catch处理掉,不能往外抛,因为 ...

  3. 萌新笔记——git的问题(error: object file .git/objects/* is empty...)的解决方案及对git版本库文件的了解

    由于操作不当,导致git版本库出了大问题,如下所示: error: object file .git/objects/8b/61d0135d3195966b443f6c73fb68466264c68e ...

  4. IIS将错误信息发送到浏览器

    本文版权归博客园和dige1993所有,访问作者博客:http://www.cnblogs.com/dige1993 最近又开始玩ASP了,调试的时候出现错误不清楚详细错误信息特别不方便,记得以前可以 ...

  5. Java Web中的中文编码

    Java Web开发中经常会遇到中文编码问题,那么为什么需要编码呢?因为人类需要表示的符号太多,无法用1个字节来表示,而计算机中存储信息最小单元为1个字节.所以必须指定char与byte之间的编码规则 ...

  6. Referenced file contains errors (http://www.springframework.org/schema...错误

    Referenced file contains errors (http://www.springframework.org/schema...错误 Referenced file contains ...

  7. 解读ASP.NET 5 & MVC6系列(16):自定义View视图文件查找逻辑

    之前MVC5和之前的版本中,我们要想对View文件的路径进行控制的话,则必须要对IViewEngine接口的FindPartialView或FindView方法进行重写,所有的视图引擎都继承于该IVi ...

  8. Masonry介绍与使用实践:快速上手Autolayout

    1 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-iphone3gs时代 w ...

  9. php设计模式--面向对象

    php链式操作的实现: 特点:1.链式操作一般存在于面向对象的情况下链式操作才有意义 /* * SQL语句组合实例类,始发文章web开发笔记 * 学习用,非专业类 * */ class sql{ pr ...

  10. 研究Extension和Category的一个例子

    Category: 1. 无法添加实例变量 2.将类的实现分散到多个不同文件或多个不同框架中. Extension: 1. 可以添加实例变量 注: 如果Category的头文件中也使用Extensio ...