内部类/内部接口那点事

来源:互联网 发布:其孰能讥之乎的其 编辑:程序博客网 时间:2024/06/06 21:50
先上总结:

1、一个类的静态内部类,因为是静态的,所有不需要有包裹类的对象就可以实例化这个内部类(new Out.Inner()),所以在包裹类的静态方法中可以直接new这个内部类,而且静态内部类不可以访问包裹类的成员变量

2、一个类的非静态内部类,必须要先有包裹类的对象才能实例化这个内部类(new Out().new Inner()),且,在包裹类的静态方法中不能实例化非静态内部类(原因:非静态内部类可以访问包裹类的的成员变量,但包裹类的静态方法不可以)

3、静态接口,这个我经常用,以前都是迷迷糊糊的就用了,不管写不写成static一样用,原因是内部接口不管写不写static它都是static的


测试代码:

public class InnerClass {private int i;public static void main(String[] args) {//new Cls1().func(); // errornew Cls2().func();}// 非静态内部类, 在他包裹类的静态方法中不能直接new// 因为内部类可以访问包裹类的成员变量,而在上面的静态方法中不能访问成员变量// 所以如果可以new,就违背了自身class Cls1 {public void func() {i++;System.out.println("cls1");}}// 静态内部类, 可以在包裹类的静态方法中直接new// 因为他是静态的, 可以在不实例化包裹类的前提下实例化static class Cls2 {public void func() {//i++; // 不可以访问, 因为该类可以在包裹类未实例化的前提上实例化System.out.println("cls2");}}// 一个类的内部接口本身就是静态的public interface If {}}class Cls3 {public void test() {new InnerClass().new Cls1().func(); // 对于非静态内部类,必须先有包裹类的对象才能有内部类的对象new InnerClass.Cls2().func(); // 静态的不需要}public class Ifimpl implements InnerClass.If {}}


0 0
原创粉丝点击