内部类:
内部类与普通类其实是相似的,只是位置不同导致了有一些使用上的差别(或者说是注意事项)。
package Demo_1_26_内部类; public class Outter { // 外部类 private String msg = "www"; //私有成员属性 public void fun(){// 普通方法 Inner inner = new Inner(); inner.print(); } class Inner{ // 在Out类中定义内部类Inner public void print(){ System.out.println(Outter.this.msg); // Out类中的属性 } } }
package Demo_1_26_内部类; public class Main { public static void main(String[] args) { Outter outter = new Outter(); // 实例化外部类对象 outter.fun(); // 调用外部类方法 } }
所以内部类的结构不合理却还存在的好处是什么?
public class Outter { // 外部类 private String msg = "www"; //私有成员属性
}
如果msg需要被其它类使用,那么就需要各种操作来设置引用的调用。
所以内部类的存在就是可以轻松访问外部类的私有属性或私有方法。
同理外部类也可以轻松地访问内部类的私有属性或私有方法。
package Demo_1_26_内部类; public class Outer { // 外部类 private String msg = "www"; //私有成员属性 public void fun(){// 普通方法 Inner inner = new Inner(); // 创建内部类对象 System.out.println(inner.inFo); // 访问内部类的私有属性 inner.print(); // 调用内部类方法 } class Inner{ // 在Out类中定义内部类Inner private String inFo = "天气真好!"; public void print(){ // 内部类方法 System.out.println(Outer.this.msg); // Out类中的属性 } } }
使用了内部类之后,内部类与外部类之间的私有操作的访问就不再需要通过setteer、getter以及其它的间接方式完成了,可以直接进行处理操作。
需要注意的是:内部类本身也是一个类,虽然大部分时候内部类是被外部类包裹的,但是外部依然可以产生内部类的实例化对象,格式如下:
package Demo_1_26_内部类; public class Main { public static void main(String[] args) { Outer.Inner in = new Outer().new Inner(); // 如果内部类内部还有类就继续 .new 内部类() } }
在内部类编译完成之后会自动形成一个" Outer$Inner.class"类文件,其中" $ " 符号在程序中的符号就是 " . "
如果不允许外部使用内部类,可以将内部类进行私有化,在类前加上private权限控制:
package Demo_1_26_内部类; public class Outer { // 外部类 private String msg = "www"; //私有成员属性 public void fun(){// 普通方法 Inner inner = new Inner(); // 创建内部类对象 System.out.println(inner.inFo); // 访问内部类的私有属性 inner.print(); // 调用内部类方法 } private class Inner{ // 在Out类中定义内部类Inner,权限控制,不允许外部使用 private String inFo = "天气真好!"; public void print(){ // 内部类方法 System.out.println(Outer.this.msg); // Out类中的属性 } } }