内部类解读 一、内部类写法 1.非静态内部类创建方式之一 package test;public class TestClass { public class Inner{ void fun(){ System.out.println(1); } }}package test;import test.TestClass.Inner; // 请注意这里,一定一定要导入内部类文件,不然(1)会报错public class Implements { public static void main(String[] args) { TestClass test = new TestClass(); Inner inner = test.new Inner(); (1) inner.fun(); }}//结果1 2.非静态内部类创建方式之二 package test;public class Implements { public static void main(String[] args) { TestClass test = new TestClass(); (1)//(1)(2)可用
香港vps TestClass.Inner inner = new TestClass().new Inner();代替 TestClass.Inner inner = test.new Inner(); (2) //注意这里Inner并不是静态类,用“外部类名.内部类 ” 是为了将它们看成一个整体 inner.fun(); }}//结果1 3. 静态内部类创建方式 package test;public class TestClass { public static class Inner{ void fun(){ System.out.println(1); } }}public class Implements { public static void main(String[] args) { TestClass.Inner inner = new TestClass.Inner(); inner.fun(); }}//结果1 区别
一个类文件中,只能有一个公共的(public)外部类,但可以有多个(public、default、private)内部类,多个(default)外部类,private不能用来修饰外部类!
如图·:当试图申明多个public外部类时保错,外部类也不能用private来修饰
(1)静态内部类只能访问外部类的静态方法,静态属性,静态方法,如图,当静态内部类试图访问非静态变量和非静态方法时编译器报错了:
(2)而普通的内部类可以访问外部类的任何属性和方法(静态、非静态、私有、公共、默认)
(3)只有静态内部类,才能在类中申明静态方法,普通内部类申明静态方法会报错。
(4)外部类不能直接访问所有内部类的成员和方法,但可以通过创建内部类对象的方式进行访问。
(5)外部类和内部类拥有同名的变量和方法时,内部类有需要进行访问外部的同名变量或方法,可以通过外部类.this.方法名/变量名进行访问。
拓展
除了静态内部了、普通内部类外,还有一个局部内部类,匿名内部类其实相当于它儿子,只是把类名这些都省略了。它在实际开发中用的很少,它是在方法中定义的类,既然是方法里头的东西,那么它就不能定义静态类,静态变量或静态方法了,如图,编译器直接报错
它的申明不能用public和private、procted修饰,可以用final和abstract修饰,另外,它也能正常访问外部类的变量,但在访问局部变量时网上有很多人说它只能访问final类型的局部变量,于是我做了如下实验:
结果
运行后,发现还是可以正常访问,而且我还用了jdk1.7和1.8做了测试,发现都可以,jdk1.7之前的因为没有就没测试了。
但是若果是访问方法的参数的话,jdk1.8不会报错,但1.7报错了,如图是jdk1.8的。
猜测是JVM问题,于是反编译了class文件:
从图中,可以看到,JVM为k加了final类型进行修饰但 j变量没有。所以,,,我也很方。。。。不知哪位道友可解?
25943816