OutterClass.InnerClass innerClass = new OutterClass().new InnerClass();
因为你没有使用static修饰InnerClass,所以你必须new出来一个OutterClass的实例,才能在此基础上new出内部类的实例,因为内部类只能通过外部类的实例才能引用。如果你使用了static修饰,那么你就可以这样使用内部类。
OutterClass.StaticInnerClass staticInnerClass = new OutterClass.StaticInnerClass();
这两种方式的区别就是,种方式,如果你想要获得InnerClass的实例,你必须有一个OutterClass的实例,所有其实这种方式你创建了两个实例,所以有两个new关键字。而第二种方式就好理解一些,静态内部类不依赖于外部类的实例存在,因此只需要直接创建内部类的实例就可以了,所以只有一个new关键字。
static说的有点多了,不过LZ其实不光说了static关键字,也一起连同内部类的语法也大致都说了下。那么接下来,基础部分还有一个比较考验人的东西,就是volatile关键字。
这个关键字的重点就三个字,就是可见性。但是面试的时候,你说出可见性三个字,基本上满分100的话,多只能得到20分。剩下的那80分,就要靠你用硬功夫去获得了。
所谓的硬功夫,其实就是要整明白,在并发当中,可见性到底是什么意思。那么,为了弄明白可见性什么意思,就需要你了解什么叫主存和工作内存。
只有把这些概念都搞明白了,你才会知道volatile的真正作用到底是什么。不过有一点要提醒你的是,volatile并不保证同步,这一点一定要记住。不光是应付面试官,在真正使用volatile的时候,也要注意这一点,否则很容易出现问题。
好了,基础部分就说这么多吧,LZ挑了一些有代表性的说了下,归根结底,这一部分就是要你非常清晰的了解Java当中的关键字和语法,这里所谓的了解,是清晰的了解其实现原理,而非简单的会用而已。
2)Java运行时环境
Java运行时环境就是JRE的中文翻译,本质上其实就是指JVM。
首先对于JVM必须要知道的是,JVM与Hotspot的关系。JVM更多的是指JVM规范,而Hotspot是JVM的一种实现,也是我们常用的JVM实现。你可以把JVM规范当做接口,Hotspot当做实现类,这样去理解会比较简单一些。
此外,JVM重要的三个部分必须要非常清楚,内存划分、class加载机制以及GC策略。搞清楚这三部分不仅仅是为了面试,也是为了让你对于Java有更深刻的理解,这对于你的Java生涯非常有帮助。
而且,关于内存划分,还有一点要注意,咱们常说的划分方式,其实是指的Hotspot的划分方式,而非JVM规范所规定的。
Hotspot的内存划分简单说分为三个部分,Young Generation(年轻代)、Old Generation(年老代)以及Perm Generation(代)。其中的Young Generation(年轻代),又分为Eden、From和To,其中From和To又统称为Survivor Spaces(幸存区)。
未完待续。。。。。。