文档章节

内部类、静态内部类

 大胖和二胖
发布于 2016/11/25 11:54
字数 933
阅读 42
收藏 2

最近在阅读一些开源框架的源码,发现了static class这样的东西,似曾相识,但是又有点搞不清楚它确切的含义,今天把这个事情搞搞清楚。

关于java当中的static,大家应该都有着一定的了解。多数时候使用它来修饰class当中的一个属性或者一个方法,这样的话,对这个属性或者方法的调用就可以不依赖于class的某一个实例了。

但是,如果用static来修饰一个内部class,它又代表着什么样的含义呢?看起来应该是跟修饰属性和方法代表着差不多的意思。

那么我们还需要先复习一下非静态内部类的使用。

public class OutClass {
    private int value = 100;
    public class InnerClass {
        public void println(){
            System.out.println("I am an inner class!" + " the value of out obj is " + value);
        }
    }
}

public class TestInner {
    public static void main(String[] args){
        OutClass.InnerClass innerObj = new OutClass().new InnerClass();
        innerObj.println();
    }
}

请注意一下,我标注成红色的部分,这里有几个知识点:

1、在InnerClass的定义当中,他是一个public的类,但是,即使如此,我们在定义变量类型的时候,还必须要写上OutClass.InnerClass,这里,从逻辑上是说得通的,我们需要知道这个内部类究竟是来自哪里。因为我们其实可以定义一个也叫InnerClass的顶层类,所以,如果不加上OutClass.,会让编译器无所适从的。

2、在实例化内部类的时候,必须依赖于一个外部类的实例,这里和非static的属性和方法的使用是一样的,非static的内部类、属性、方法,都必须依赖于一个外部类的实例。

3、内部类当中可以随意访问外部类的属性和方法,关于这个问题,我们可以这么理解,在构造内部类的时候,java编译器,会把一个外部类对象交给内部类对象来使用,这一点其实和第二点是息息相关的。

下面我们再看一下静态内部类的使用:

public class OutClass {
    public static class InnerClass {
        public void println(){
            System.out.println("I am an static inner class!");
        }
    }
}

public class TestInner {
    public static void main(String[] args){
        OutClass.InnerClass innerObj = new OutClass.InnerClass();
        innerObj.println();
    }
}

这一次,我们把InnerClass变成了static的,那么在实例化的时候,就可以不依赖于OutClass的实例了,static的语义的一致性在这里得到了充分的体现。那么由于内部类的实例化,并不依赖于外部类的实例,所以,内部类也无法访问外部类的任何非静态的属性和方法。

那么还有最后一个问题,我们知道,虽然我们不依赖于实例,来访问类的静态属性和方法,但是用实例来访问,其实也是可以的。

但是,我还是要通过外部类的实例,来创建一个内部类的实例,这样可以吗?

public class TestInner {
    public static void main(String[] args){
        OutClass outObj = new OutClass();
        OutClass.InnerClass innerObj = outObj.new InnerClass();
        innerObj.println();
    }
}

红色的部分会报错,而给出的错误信息是:Qualified new a static class(有资格来new一个静态类),大概意思是,你能直接new一个静态内部类,就别通过外部类的实例了。

这里其实是我们今天的结论,static的语义,在用于class的时候,和它用于属性和方法的时候,语义是大体上相同的。唯一的不同点,static在用于class的时候,是无法通过外部类实例来new一个静态内部类的。究竟是基于什么样的考虑,有了这样的限制,暂时不知道~~~

 

© 著作权归作者所有

共有 人打赏支持
粉丝 21
博文 69
码字总数 50842
作品 0
沈阳
架构师
Java的内部类

类是java中定义的一个独立的程序单元,在某种情况下也可以把一个类放在另外一个类的内部定义,这定义在内部的类就叫内部类或嵌套类。 1.内部类提供了更好的封装,把一个内部类隐藏在外部类之...

西红柿的眼泪
2016/07/09
38
0
内部类, 静态内部类, 局部类, 匿名内部类的解析和区别

众所周知,外部顶级类的类名需和类文件名相同,只能使用public和default。而内部类是指在外部类的内部再定义一个类,类名不需要和文件名相同。内部类可以是静态static的,也可用public,def...

翻滚吧李博
2017/12/16
0
0
黑马程序员---面向对象之内部类

-------------------------android培训、java培训、期待与您交流! ------------------------- Java中的内部类有四种:一般内部类、静态内部类、局部内部类、匿名内部类。 一、一般内部类 定...

长平狐
2013/07/01
72
0
java学习笔记--内部类:(参考java核心技术卷1and转载)

做JavaEE即网站的 基本不接触内部类 做安卓的 基本天天接触内部类 内部类是定义在另一个类中的类 可以分为这四类: 局部内部类 成员内部类 与外部类有直接联系 静态内部类 与外部类没有直接联...

codingcoge
04/27
0
0
第十章 内部类

本文转载自牛客网 往OuterClass类的代码段中插入内部类声明, 哪一个是错误的问题的第一个解析。 可以将一个类的定义放在另一个类的内部,这就是内部类 1.为什么使用内部类? 使用内部类最吸引...

notis
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

angular 解决其他电脑不能访问的问题。

ng serve --host 0.0.0.0 --disable-host-check

miaojiangmin
今天
1
0
优酷视频文件怎么转换格式

  以前在优酷上下载视频都只是在手机上观看,但随着科技的发展,对于视频的要求也逐渐增多,不再只是观看视频那么简单,在精彩的部分还会将其单独分割出来,然后进行视频剪辑,可以做出我们...

萤火的萤火
今天
0
0
数据结构:散列

在一个数据结构中查找key元素,用顺序查找、二分查找都需要经过一系列关键之比较才能查找到结果,平均查找长度与数据量有关,元素越多比较次数就越多。 如果根据元素的关键字就能知道元素的存...

京一
今天
0
0
Apache RocketMQ 正式开源分布式事务消息

近日,Apache RocketMQ 社区正式发布4.3版本。此次发布不仅包括提升性能,减少内存使用等原有特性增强,还修复了部分社区提出的若干问题,更重要的是该版本开源了社区最为关心的分布式事务消...

阿里云云栖社区
今天
30
0
使用JavaScript和MQTT开发物联网应用

如果说Java和C#哪个是最好的开发语言,无疑会挑起程序员之间的相互怒怼,那如果说JavaScript是动态性最好的语言,相信大家都不会有太大的争议。随着越来越多的硬件平台和开发板开始支持JavaS...

少年不搬砖老大徒伤悲
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部