当前位置: 首页 > 编程日记 > 正文

[转载] static class 静态类(Java)

一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类
  在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的。由于静态的内部类在定义、使用的时候会有种种的限制。所以在实际工作中用到的并不多。
  在开发过程中,内部类中使用的最多的还是非静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作用。

一、静态内部类的使用目的。

在定义内部类的时候,可以在其前面加上一个权限修饰符static。此时这个内部类就变为了静态内部类。不过由于种种的原因,如使用上的限制等等因素(具体的使用限制,笔者在下面的内容中会详细阐述),在实际工作中用的并不是很多。但是并不是说其没有价值。在某些特殊的情况下,少了这个静态内部类还真是不行。如在进行代码程序测试的时候,如果在每一个Java源文件中都设置一个主方法(主方法是某个应用程序的入口,必须具有),那么会出现很多额外的代码。而且最主要的时这段主程序的代码对于Java文件来说,只是一个形式,其本身并不需要这种主方法。但是少了这个主方法又是万万不行的。在这种情况下,就可以将主方法写入到静态内部类中,从而不用为每个Java源文件都设置一个类似的主方法。这对于代码测试是非常有用的。在一些中大型的应用程序开发中,则是一个常用的技术手段。为此,这个静态内部类虽然不怎么常用,但是程序开发人员还必须要掌握它。也许在某个关键的时刻,其还可以发挥巨大的作用也说不定。

public class MainInStaticClass {static class Main{static void main() {//将主方法写到静态内部类中,从而不必为每个源文件都这种一个类似的主方法new MainInStaticClass().print();}}public static void main(String[] args){new MainInStaticClass().print();}public void print(){System.out.println("main in static inner class");}
}public class TestMain {public static void main(String[] args) {// TODO Auto-generated method stub// new MainInStaticClass().print();MainInStaticClass.Main.main();new MainInStaticClass.Main();}
}

二、静态内部类的使用限制。

将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。

一是静态成员(包括静态变量与静态成员)的定义。一般情况下,如果一个内部类不是被定义成静态内部类,那么在定义成员变量或者成员方法的时候,是不能够被定义成静态成员变量与静态成员方法的。也就是说,在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员方法。这是静态内部类都有的一个特性。也正是因为这个原因,有时候少了这个静态的内部类,很多工作就无法完成。或者说要绕一个大圈才能够实现某个用户的需求。这也是静态的内部类之所以要存在的一个重要原因。

二是在成员的引用上,有比较大的限制。一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法),其非静态内部类都可以随意的访问。则是非静态内部类的特权。因为在其他类中是无法访问被定义为私有的成员变量或者方法。但是如果一个内部类被定义为静态的,那么在银用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。那么在静态内部类中,无论在成员方法内部还是在其他地方,都只能够引用外部类中的静态的变量,而不能够访问非静态的变量。在静态内部类中,可以定义静态的方法(也只有在静态的内部类中可以定义静态的方法),在静态方法中引用外部类的成员。但是无论在内部类的什么地方引用,有一个共同点,即都只能够引用外部类中的静态成员方法或者成员变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上
  通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。但是,如果成员开发人员创建的时静态内部类,那么这就又另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。即在创建静态类内部对象时,不需要其外部类的对象

new MainInStaticClass.Main();

具体为什么会这样,一般程序开发人员不需要了解这么深入,只需要记住有这个规则即可。在定义静态内部类的时候,千万不要犯画蛇添足的错误。

从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。不管这么理解,程序开发人员都需要牢记静态内部类与非静态内部类的差异。如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员而非静态的内部类不可以)、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法而非静态的内部类即可以访问静态的也可以访问非静态的外部类成员方法与成员变量)。这两个差异是静态内部类与非静态外部类最大的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发人员还需要知道,在什么情况下该使用静态内部类。如在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。

总之,静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功半的反面效果。

原文转载自:https://www.cnblogs.com/KingIceMou/p/7823918.html
版权归:https://klcwt.iteye.com/blog/452834 所有。

转载于:https://www.cnblogs.com/VAllen/articles/java-static-class.html

相关文章:

tomcat监控-psi-probe使用

什么是psi-probe 这是一款 Tomcat 管理和监控工具,前身是 Lambda Probe。由于 Lambda Probe 2006不再更新,所以 PSI Probe 算是对其的一个 Fork 版本并一直更新至今。 下载 下载地址:https://github.com/psi-probe/psi-probe 百度网盘地址…

配置文件app.config

无论对于客户端程序还是web应用程序,配置文件的作用不言而喻,现总结用法如下: 1. 创建配置节类 必须创建继承自ConfigurationSection的对象才能进行配置数据读写操作,ConfigurationSection提供了索引器用来获取和设置配置数据&…

windows远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可

远程桌面如果超出最大连接数, 使用命令行mstsc /console登录即可。 (也可以用 mstsc /admin) 可以在运行里使用mstsc /console /v:IP:远程端口即可强制登录; 如果直接在远程桌面连接端使用就直接输入/console /v:IP:远程端口. 如:mstsc /cons…

AppiumForWin安装

尝试安装Windows版本的Appium参考:http://www.cnblogs.com/fnng/p/4540731.html第一步:安装nodehttps://nodejs.org/en/安装成功后使用:node -v,进行验证第二步:安装Appium下面的方法失败:原因下载不成功&a…

prometheus--初见

什么是prometheus Prometheus(普罗米修斯)是一个开源系统监控和警报工具,最初是在SoundCloud建立的。自2012年成立以来,许多公司和组织都采用了普罗米修斯,该项目拥有一个非常活跃的开发者和用户社区。它现在是一个独立…

JavaScript时间日期格式化

/** 时间对象的格式化;*/ Date.prototype.format function(format) {/** eg:format"YYYY-MM-dd hh:mm:ss";*/var o {"M" :this.getMonth() 1, // month"d" :this.getDate(), // day"h" :this.getHours(), // hour"m" :th…

Hello World

作为所有编程语言的起始阶段,HELLO WORLD占据着无法改变的地位,所有中/英/法/德/美……版本的编程教材中,HELLO WORLD总是作为第一个TEST记录于书本之中,所有的编程第一步就在于此了!经典之中的经典!HELLO …

POJ 1144 Network (求割点)

题意&#xff1a; 给定一幅无向图&#xff0c; 求出图的割点。 割点模板&#xff1a;http://www.cnblogs.com/Jadon97/p/8328750.html 分析&#xff1a; 输入有点麻烦&#xff0c; 用stringsteam 会比较简单 #include<cstdio> #include<iostream> #include<queu…

mongoose简单使用

介绍&安装 官网&#xff1a;http://www.mongoosejs.net/ npm i -S mongoose 使用 1.连接mongodb&创建模型 var mongoose require(mongoose)​//1、连接mongodb mongoose.connect(mongodb://localhost/test)​//2、设置文档结构var userSchema new mongoose.Schema…

Codeforces Round #563 (Div. 2)/CF1174

Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i1}^n a_i\)与\(\sum\limits_{n1}^{2n}a_i\)差值最大&#xff0c;排一下序就好了 CF1174B Ehab Is an Odd Person 一个显然的结论就是如果至少有一个奇数和一个偶数&#xff…

Enterprise Architect 中文经典教程

一、Enterprise Architect简介Enterprise Architect是一个对于软件系统开发有着极好支持的CASE软件&#xff08;Computer Aided Software Engineering&#xff09;。EA不同于普通的UML画图工具&#xff08;如VISIO&#xff09;&#xff0c;它将支撑系统开发的全过程。在需求分析…

[WebDev]Web 开发与设计师速查手册大全

Cheat Sheet 一词在中文中并没有很贴切的对译&#xff0c;大概是考试作弊条一类的东西&#xff0c;这要求 Cheat Sheet 必须短小精悍又覆盖广泛&#xff0c;作为 Web 开发与设计师&#xff0c;免不了在工作时查询大量资料&#xff0c;某个 Web 色值&#xff0c;某个 JavaScript…

android中的回调

1、引子 android中的回调最经典的就是点击事件设置监听&#xff08;一般通过switch&#xff08;v.getId()&#xff09;&#xff09;这里写个最主要的 btn_rigister.setOnClickListener(new View.OnClickListener() {Overridepublic void onClick(View view) {// TODO log in} }…

nodejs回调函数理解

回调实例 问题&#xff1a;想要得到一秒后 计算出的结果 //错误写法function add(x,y) {console.log(1);setTimeout(function () {console.log(2);var ret x y;return ret;},1000);console.log(3)}console.log(add(10,20))添加一个函数作为参数&#xff0c;将计算出来的结果传…

C# 运算符的优先级

优先级由高到低 --(用作前缀); ; -(一元); () ; ! ; ~ * ; / ; % ; - <<; >> < ; > ; < ; > ; ! & ^ | && || ; * ; / ; % ; ; - ; << ; >> ; & ; ^ ;| --(作后缀);转载于:https://www.cnblogs.com/h…

Service Manager 的系统要求

以下各节包含有关 Service Manager 的硬件和软件要求的信息&#xff0c;并基于以下环境。System Center Service Manager 2010 已经过测试&#xff0c;并且正在使用一个支持 80 到 100 个并发 Service Manager 控制台的 Service Manager 管理服务器&#xff0c;测试根据本指南中…

读Lodash源码——chunk.js

The time is out of joint: O cursed spite, That ever I was born to set it right. --莎士比亚 最艰难的第一步 最近学习遇到了些障碍&#xff0c;浮躁浮躁又浮躁。很难静下心来做一件事&#xff0c;北京的寒风也难以让我冷静下来. 之前一直很想找个源码读读&#xff0c;太懒…

使用相对路径时,./、../、../../,代表的什么?

./ 当前目录。../ 父级目录。/ 根目录。 举个栗子&#xff1a; 页面引入js、css等文件&#xff1a; 1.如果about.jsp页面想引入common.css文件&#xff1a; 以about.jsp为基点寻找 直到 和static文件在同一级&#xff1b; 2.如果引入的外部css、js文件又引入image等时&#x…

asyncawait

简单理解 async async就是将方法变成异步 await 是等待异步方法的执行完成&#xff0c;可以获取异步方法里面的数据&#xff0c;但必须得用在异步方法(async)里面 创建异步方法 定义一个普通方法&#xff0c;返回值是一个字符串 function getData() {return 这是一个数据;}co…

引起路由器重启的“元凶”

文章出处&#xff1a;www.net1980.com在我们的日常维护中&#xff0c;偶然会遇到一些路由器自动重启的故障。那么大家都会自然地猜测到是否设备已经运行一段长时间&#xff0c;设备稳定性开始减低。或者可能有工作人员把电源拨松了&#xff0c;又或者设备负荷过重等原因。那么究…

python csv.reader参数指定

转载于:https://www.cnblogs.com/mahailuo/p/8375997.html

xBIM 实战01 在浏览器中加载IFC模型文件

系列目录 【已更新最新开发文章&#xff0c;点击查看详细】 一、创建Web项目打开VS&#xff0c;新建Web项目&#xff0c;选择 .NET Framework 4.5选择一个空的项目新建完成后&#xff0c;项目结构如下&#xff1a; 二、添加webServer访问文件类型由于WexXplorer 加载的是 .w…

node 判断文件夹是否存在

判断文件夹是否存在 let filePath path.join(__dirname,../)/download_tmp/fs.exists(filePath, function(exists) {if(!exists){fs.mkdir(filePath,function (err) {if(err){console.log(err)}})}});生成excle文件到本地 业务要求&#xff1a;生成excle文件到本地的路径 #安装…

IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)

以下代码在IE8下运行通过&#xff0c;在IE9中出错&#xff1a;document.createElement(<iframe id"yui-history-iframe" src"../../images/defaults/transparent-pixel.gif" style"position:absolute;top:0;left:0;width:1px;height:1px;visibilit…

数字家庭开发者中心

数字家庭开发者中心 http://www.adobe.com/devnet/devices/digital_home.html转载于:https://www.cnblogs.com/kobo/archive/2010/07/06/1772136.html

LeetCode 1021:Remove Outermost Parentheses

C语言 char * removeOuterParentheses(char * S){int len strlen(S);int j 0;int sum 0;for(int i 0; i < len; i){if (S[i] (){sum 1;}else if (S[i] )){sum - 1;}if (S[i] ( && sum > 1){S[j] (;j;}else if (S[i] ) && sum > 0){S[j] );…

Koa实现下载excel

Koa实现下载excel #安装 node-xlsx npm install node-xlsx --save实现思路&#xff1a;将生成的excel文件流返回到前端 routes router.get(/mp/push_excle, async (ctx, next) > {await Push.pushGroupExcel(ctx).then(function(res) {// let path resctx.set(Content-Ty…

使用 雨林木风 Ghost XP SP3 装机版 YN9.9 安装 Win7 (SP1)

下载Win7 SP1一段时间了&#xff0c;一直没来安装&#xff0c;今天来安装&#xff0c;由于没有DVD刻录机&#xff0c;不能做成光盘安装发现还不是那么方便。后面想到用雨林木风PE光盘来安装&#xff0c;一步一步 【下面假设是将Win7 (SP1) 将要安装到 C: 盘中】 首先使用 雨林木…

2010中国大陆×××指南,满足你的欲望!

中国大陆指南&#xff0c;满足你的欲望&#xff01; 川渝--椒麻鸡,怪味鸡,棒棒鸡,口水鸡,罐罐鸡,辣子鸡 广东--太爷鸡,越秀鸡,花雕鸡,板栗焖仔鸡,客家盐局鸡,湛江鸡,清远鸡广西--桂林黄焖鸡,梧州纸包鸡,啤酒鸡,泉水鸡 山东--沂蒙光棍鸡,德州扒鸡 云南--汽锅鸡,柴把鸡 贵州-…

iframe元素內嵌页面如何去掉继承的html及body背景色/背景图片

【1】去掉背景色&#xff1a;添加如左的样式 filter:Chroma(Colorwhite); <iframe name"Conframe" id"Conframe" name"back" style"background:#2397E2filter:Chroma(Colorwhite)"></iframe> 转载于:https://www.cn…