前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java嵌套类

Java嵌套类

作者头像
用户7886150
修改2021-04-07 11:34:47
6590
修改2021-04-07 11:34:47
举报
文章被收录于专栏:bit哲学院

参考链接: Java嵌套接口

本文来自于Java深入解析——透析Java本质的36个话题  Java的嵌套类分为 静态成员类(静态嵌套类)、内部类(非静态嵌套类)、嵌套接口。内部类还可以分为内部成员类、本地内部类、匿名内部类。 

一、静态成员类 

习惯上将它成为静态嵌套类。标记为在类中使用 static 声明的类。静态成员类可以访问外围类的任何成员,包括声明为private的成员。但是非静态的外围成员,则需要经过恰当的对象引用才能访问。因为是静态成员类,所以可以不依赖于外围类而独立存在并访问。在继承方面,静态成员类与外围类也没有什么区别,在访问权限允许的情况下,任何类都可以继承静态成员类,静态成员类也可以继承任何(允许继承的)类或者接口。

二、内部类 

内部类与静态成员类不同之处在于,内部类与外围类紧密关联。从结构上说,内部类类似于类的实例变量,必须存在对象,才能够访问。所以,如果没有外围类对象存在,则不可能有内部类。而静态成员又是不需要对象就可以直接访问的,由于这种依赖与矛盾关系,内部类不可以申明为静态成员(包括静态成员变量、静态方法、静态成员类或嵌套接口)或静态初始化块。  不过内部类可以声明为编译时常量的final静态变量,因为编译器对final类型的变量进行了特殊处理,是将值直接写入字节码中,而不会生成变量的符号引用。 

内部类绑定到外围对象 

内部类必须要存在对象时才能访问。示例 

package test;

public class Out{

    public static class Static{ }

    public class Inner{ }

    public void go(){

        Out mout = new Out();

        Out.Inner inner = mout.new Inner();

    }

此处的内部类Inner虽然构造函数没有接收参数,但是编译器会将Out对象 mout 作为参数传递进去。所以Inner其实是这样的 

public class Inner{

    final Out this$0;

    public Inner(Out t){

        this$0 = t;

        super();

    }

此处的 this$0 是编译器自动生成。 

内部类继承 

public class InnerInheritance extends Outer.Inner{

    public InnerInheritance(Outer outer){

        outer.super();

    }

}

calss Outer{

    class Inner{ }

本地内部类 

public class LocalClass{

    private int a = 1;

    {

        class Local1{};

    }

    static {

        Class Local2{};

    }

    public LocalClass(){

        int x = 2;

        final int y = 3;

        class Local3{

            int w = y;

            int q = a;

            //int z = x; 不能访问非final 的局部变量

        }

    }

    public TV method(){

        //使用本地类实现某个接口,然后以接口形式返回

        class Local4 implements TV{

            @override

            public void turnOn(){

                System.out.println("Turn on the TV.");

            }

            @override

            public void turnOff(){

                System.out.println("Turn off the TV.");

            }

        }

        return new Local4();

    }

}

interface TV{

    void turnOn();

    void turnOff();

匿名类 

待续。。。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档