文档章节

内部类、静态内部类

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

最近在阅读一些开源框架的源码,发现了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一个静态内部类的。究竟是基于什么样的考虑,有了这样的限制,暂时不知道~~~

 

© 著作权归作者所有

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

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

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

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

翻滚吧李博
2017/12/16
0
0
java学习笔记--内部类:(参考java核心技术卷1and转载)

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

codingcoge
04/27
0
0
黑马程序员---面向对象之内部类

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

长平狐
2013/07/01
72
0
第十章 内部类

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

notis
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7防火墙firewalld操作

firewalld Linux上新用的防火墙软件,跟iptables差不多的工具。 firewall-cmd 是 firewalld 的字符界面管理工具,firewalld是CentOS7的一大特性,最大的好处有两个:支持动态更新,不用重启服...

dingdayu
今天
1
0
关于组件化的最初步

一个工程可能会有多个版本,有国际版、国内版、还有针对各种不同的渠道化的打包版本、这个属于我们日常经常见到的打包差异化版本需求。 而对于工程的开发,比如以前的公司,分成了有三大块业...

DannyCoder
今天
2
0
Spring的Resttemplate发送带header的post请求

private HttpHeaders getJsonHeader() { HttpHeaders headers = new HttpHeaders(); MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8"); ......

qiang123
昨天
3
0
Spring Cloud Gateway 之 Only one connection receive subscriber allowed

都说Spring Cloud Gateway好,我也来试试,可是配置了总是报下面这个错误: java.lang.IllegalStateException: Only one connection receive subscriber allowed. 困扰了我几天的问题,原来...

ThinkGem
昨天
27
0
学习设计模式——观察者模式

1. 认识观察者模式 1. 定义:定义对象之间一种一对多的依赖关系,当一个对象状态发生变化时,依赖该对象的其他对象都会得到通知并进行相应的变化。 2. 组织结构: Subject:目标对象类,会被...

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部