动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > Java教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Java教程 ]的信息

本月文章推荐
.Java技术与XML常见问题之JAXR.
.Turbine HowTo 之 Service.
.如何挽救Java命运危急 改革JCP已.
.Java中存储区的分类.
.Sun将在12月12日前发布Java桌面系.
.在Java中解读压缩文件.
.访问控制.
.对于模式的“十大误解”.
.设计和优化MicrosoftWindowsCE.N.
.常用JDBC连接方法.
.java设计模式之Prototype(原型).
.JBuilder开发常用快捷键.
.JFCUnit测试GUI的一个实例(代码.
.XP 精华:何使 Java 项目获得更大.
.JavaScript与JavaApplet的综合运.
.java反射技术(一).
.JAVA中文问题及最优解法.
.基于Java并且开放源代码的可扩展.
.成为GUI的最好的朋友并揭开Liar .
.一些错误地解决方法.

通过内部类的一个例子展示java中的可访问特性

发表日期:2008-1-5 |


 

该篇文章涉及到了Java可访问特性以及内部类的一些内容,向读者展示了一个内部类的非凡的现象,通过这个例子,使开发者了解到一些他们以前可能没有注重到的细节,也许可以帮助开发者更透彻的了解java的可访问特性、内部类和虚拟机。并且通过对这些细节的分析,可能会对开发者思考、分析问题,以及适当的使用工具有所启迪。

java的访问修改符(Access modifier)包括:Default-Access、public、private、protected四种。并不是所有的情况都可以使用全部四种访问修改符,有的情况下使用某些访问修改符是没有意义的,例如:假如一个类不是内部类,则不能使用private作为该类的访问修改符,编译下面的代码:
private class test
{ ... }
jdk编译器将给出“modifier private not allowed here”错误提示。因为private特性只能由定义它的那个类使用,假如上面的代码通过编译,则不会有任何情况可以使用test类,那么也就不会有任何意义。

假如一个类没有定义任何构造函数,则编译器将生成一个缺省的构造函数,该构造函数的访问修改符和类的访问修改符相同,例如:
class test将生成test()构造函数public class test将生成public test()构造函数。
在使用内部类的情况,上述的特性将使编译器表现出一个非凡现象。需要说明的是,下面的例子仅针对Windows系统下jdk编译器,作者并没有尝试使用其他的编译器的情况。但由于java编译器生成的是class文件这种中间形式的代码,所以下面的讨论应该适用于任何符合java标准的编译器。
编译下面的代码:
public class Wrapper
{
private class InnerClass
{}

private void testInnerClass()
{
InnerClass inner = new InnerClass();
}

public static void main(String[] args)
{
Wrapper wrapper = new Wrapper();
wrapper.testInnerClass();
}
}
将产生三个class文件:Wrapper、Wrapper$InnerClass和Wrapper$1。
对于前两个文件,了解内部类的读者都会理解,但第三个类Wrapper$1的作用是什么呢?
使用java的反射机制,或者使用javap反汇编器,将发现Wrapper$1类没有任何成员变量和方法,而Wrapper$InnerClass则除了有一个private Wrapper$InnerClass()构造方法外,还有一个Wrapper$InnerClass(Wrapper$1)构造方法,使用javap,你将发现Wrapper$InnerClass(Wrapper$1)并没有使用Wrapper$1类型的参数,而只是直接调用了private Wrapper$InnerClass()。假如读者仔细思考一下创建一个新的类实例的过程,大概已经明白了产生上述现象的原因:当程序试图创建一个Wrapper$InnerClass的类实例时,却不能使用其缺省的构造函数,因为Wrapper$InnerClass()是private的,不能由外部使用。因此编译器不得不再生成一个可访问的构造函数,由于这里只有Wrapper类的private void testInnerClass()方法使用了new InnerClass(),所以编译器只(需)为这个新的构造函数生成了Default-Access的访问修改符。同时,为了和已有的缺省构造函数有所区别,就加入了一个Wrapper$1类型的参数,为此,编译器还要生成一个Wrapper$1类。

为了更简单,(也许)更清楚的看到编译器生成的class代码工作的原理,读者可以使用java反编译器,来看看class反编译后生成的java源程序,下面是作者使用Jad反编译后生成的Wrapper类的代码:
// Decompiled by Jad v1.5.7d. Copyright 2000 Pavel Kouznetsov.
// Jad home page: http://www.geocities.com/SiliconValley/Bridge/8617/jad.Html
// Decompiler options: packimports(3)
// Source File Name: Wrapper.java

public class Wrapper
{
private class InnerClass
{

private InnerClass()
{
}

InnerClass(_cls1 _pcls1)
{
this();
}
}

public Wrapper()
{
}

private void testInnerClass()
{
InnerClass innerclass = new InnerClass(null);
}

public static void main(String args[])
{
Wrapper wrapper = new Wrapper();
wrapper.testInnerClass();
}

// Unreferenced inner classes:

/* anonymous class */
class _cls1
{
}

}

显然,Wrapper$1类不会有任何实际的作用。

上一篇:如何在Java中实现远程方法调用 人气:601
下一篇:JAVA通过JNI调用本地C语言方法 人气:643
浏览全部Java的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-11-20 ECShop v2.6.1 GBK 正式版
2008-11-20 免费时代CMS v5.1
2008-11-20 ECShop v2.6.1 UTF-8 正式版
2008-11-20 雷风影视系统asp版 v1.0.1
2008-11-20 雷风影视系统php版 v1.0.1
2008-11-20 未知数网络文章系统HTML版
2008-11-20 云峰合同管理系统ASP+AJAX版
2008-11-20 翎风个人主页管理系统 v1.0
2008-11-20 开良美女图片小偷 v1.3
2008-11-15 BitTorrent 6.1.2 Build 13185
2008-11-15 BitComet 1.06
2008-11-15 SpeedFan 4.36 Final
2008-11-15 Windows Installer CleanUp Util
2008-11-15 Safari 3.2
2008-11-15 RealPlayer 11.0.0.835 简体中文
2008-11-15 QQ for Mac Preview 3 Build 394
2008-11-15 Vista优化大师3.20
2008-11-15 酷点 CoolDock 0.6
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | js/vbs加密 | md5加密 | 进制转换 | UTF-8 转换工具 | Html转换js | Html转换asp | Html转换php | Html转换perl
实用工具:汉字翻译拼音 | 拼音字典 | 符号对照表 | 个税计算 | 实时汇率查询换算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 | 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵
SEO対策 中国語教室 ホームページ作成