内部类详解————静态内部类

内部类三连击:

内部类详解————匿名内部类

内部类详解————局部内部类

内部类详解————静态内部类

定义

静态内部类,又叫静态嵌套类或嵌套类。是使用static关键字修饰的内部类

静态内部类可以用 private 修饰,这非常符合良好的OOM设计。并且由于嵌套类被认为是外部类的一部分,所以不存在产生不可见问题。——《数据结构与算法分析—Java语言描述》p50

书写形式

一般的书写形式:

public class Outter {
    /** 嵌套类,public等四种访问修饰符均可修饰*/
    public static class Inner {
        /** 嵌套类内部*/
    }
}

接口中的书写形式:

public interface OutInterface {
    /** 嵌套类,在接口中定义的任何类都自动的是public和static的,因此这两个关键字都可以省略*/
    class Inner {
        public void print() {
            System.out.println("print()");
        }
    }
}

嵌套类的语法规则

规则一:不能从嵌套类中访问外部类的非静态成员。这一点与Java基础语法中对静态非静态语法的相关描述完全一致。

规则二:与普通内部类不同,嵌套类实例化不需要依赖外部类对象,而普通的内部类对象需要与外部类的对象有一种绑定关系。

public class Outter {
    /** 嵌套类*/
    public static class Inner {
        
    }
    public static void main(String[] args) {
        Outter.Inner inner = new Inner();
    }
}

规则三:与普通内部类的区别如下:

普通内部类只能包含非静态变量非静态方法非嵌套类

静态嵌套类可以包含静态和非静态变量静态和非静态方法静态和普通内部类

注意:“嵌套类中包含”与规则一中的“嵌套类中访问”是不同的含义,区别在于“访问”是嵌套类中调用嵌套类之外定义的成员,而“包含”则表示在嵌套类中定义)

规则四:嵌套类可以定义在接口中,并作为接口的一部分来使用。

《Java编程思想》(第四版,P203)

如果你想要创建某些公共代码,使得它们可以被某个接口的所有不同实现所共用,那么使用接口内部的嵌套类会显得很方便。

代码实例:

/** 接口*/
public interface OutInterface {
    void method_1();
    void method_2();
    /** 嵌套类*/
    class Inner {
        public void print() {
            System.out.println("print something...");
        }
    }
}
/** 实现类 */
public class OutInterfaceImpl implements OutInterface {
    private OutInterface.Inner inner = new Inner();

    @Override
    public void method_1() {
        inner.print();
    }

    @Override
    public void method_2() {
        inner.print();
    }

    public static void main(String[] args) {
        OutInterface oif = new OutInterfaceImpl();
        oif.method_1();
        oif.method_2();
    }
}

输出结果:

print something...
print something...

规则五:静态内部类不会在外部类加载时也执行类加载。这一点可以应用于单例模式。

总之,静态内部类可以具有一个普通类的所有特性,本质上他们并无二致,而且还可以通过访问修饰符如private等,来控制访问权限。

综上,就是静态嵌套类的详细使用,其中需要注意的问题,已经列在规则中,经过博主实操,大概也就这些内容,如有疑问和建议,欢迎文末留言。:)

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页