文档章节

内部类、静态内部类

 大胖和二胖
发布于 2016/11/25 11:54
字数 933
阅读 42
收藏 1
点赞 0
评论 0

最近在阅读一些开源框架的源码,发现了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
博文 68
码字总数 50641
作品 0
沈阳
架构师
Java的内部类

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

西红柿的眼泪 ⋅ 2016/07/09 ⋅ 0

Java内部静态类

解析静态内部类的使用目的与限制。在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。 现在我们看组例子: public class...

John_Zhang ⋅ 2011/05/14 ⋅ 0

静态类(即static 类)

一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类。 在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关...

对岸 ⋅ 2014/06/09 ⋅ 0

内部类, 静态内部类, 局部类, 匿名内部类的解析和区别

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

翻滚吧李博 ⋅ 2017/12/16 ⋅ 0

java学习笔记--内部类:(参考java核心技术卷1and转载)

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

codingcoge ⋅ 04/27 ⋅ 0

第十章 内部类

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

notis ⋅ 2017/10/26 ⋅ 0

黑马程序员---面向对象之内部类

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

长平狐 ⋅ 2013/07/01 ⋅ 0

【解惑】领略Java内部类的“内部”

内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中...

明舞 ⋅ 2014/07/27 ⋅ 0

谈谈内部类

首先谈谈非静态内部类 1、非静态内部类可以直接访问外部类的属性值,但是外部类却不能直接访问非静态内部类 的属性值,必须显式创建内部类对象来访问。 package com.wisco.lidahu; import c...

tiger1986 ⋅ 2013/06/28 ⋅ 3

Java成员内部类和静态内部类

Java成员内部类和静态内部类 使用内部类最吸引人的原因是:每个内部类都能独立地继承一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响。 在我们程...

秋风醉了 ⋅ 2014/07/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

R计算IV

参考文章 #读取文件 rawdata = read.csv("/path/to/csv/file",header=T) colnames(rawdata)[18] <- "y" //重命名因变量y #数据分区 训练集测试集 trainIdx <- sample(nrow(rawdata), round(......

火力全開 ⋅ 18分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

阿里云云栖社区 ⋅ 18分钟前 ⋅ 0

SQL老司机,在SQL中计算 array & map & json数据

摘要: 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primitive类型的数据。 场景 通常,我们处理数据,一列数据类型要么是字符串,要么是数字,这些都是primi...

猫耳m ⋅ 28分钟前 ⋅ 0

关于ireport自定义变量类型为list的时候

自己摸石头过河,我真的应该去趟市中心图书馆,借本真正靠谱的教材 网上的东西,只有0.01%是有用的,还有0.99%是垃圾,剩下的99%是垃圾的复制品。。 哎!~ 问题是这样的,报表带sql,从db中获...

炑炑milina ⋅ 29分钟前 ⋅ 0

Spring mvc ContextLoaderListener 原理解析

对于熟悉Spring MVC功能,首先应从web.xml 开始,在web.xml 文件中我们需要配置一个监听器 ContextLoaderListener,如下。 <!-- 加载spring上下文信息,最主要的功能是解析applicationContex...

轨迹_ ⋅ 30分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云官方博客 ⋅ 31分钟前 ⋅ 0

Redis安装异常解决办法

官网地址:http://redis.io/ 官网下载地址:http://redis.io/download 1. 下载Redis源码(tar.gz),并上传到Linux 2. 解压缩包:tar zxvf redis-2.8.17.tar.gz 3. 进入解压缩后的文件夹:c...

slagga ⋅ 36分钟前 ⋅ 0

006. 深入JVM学习—年轻代

1. 年轻代图片 年轻代(Young)属于JVM堆内存空间的一个组成部分 所有使用关键字new新实例化的对象一定会在伊甸园区进行保存,而对于存活区保存的一定是已经在伊甸园区存在一段时间并且经过了...

影狼 ⋅ 37分钟前 ⋅ 0

如何成为一个合格的程序员

偶尔的,我会被人问道:如何成为一名优秀的程序员,更或者,如何成为一名程序员。每次人们问起,我都力图给出不同的答案。因此,我的答案是各种各样的。下面就是我认为的成为一名优秀的程序员...

柳猫 ⋅ 37分钟前 ⋅ 0

cups error_log日志暴增

日志内容 File \"/usr/lib/cups/notifier/dbus\" has insecure permissions 解决(未验证适用范围) sudo service cups stopsudo rm /etc/cups/subscriptions.conf*sudo rm -r /var/cac......

一介码夫_Hum ⋅ 41分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部