首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>java>Java基础>正文

深入的理解嵌套类和内部类

http://www.oklinux.cn  2008-02-25  来源: 赛迪网 lingwen20  会员收藏  游客收藏  【 】 

一、什么是嵌套类及内部类?
可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:
静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为
内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:
其一、在一个类(外部类)中直接定义的内部类;
其二、在一个方法(外部类的方法)中定义的内部类;
其三、匿名内部类。
下面,我将说明这几种嵌套类的使用及注意事项。
二、静态嵌套类
如下所示代码为定义一个静态嵌套类,

public class StaticTest {
private static String name = "javaJohn";
private String id = "X001";

static class Person{
private String address = "swjtu,chenDu,China";
public String mail = "[email protected]";//内部类公有成员
public void display(){
//System.out.println(id);//不能直接访问外部类的非静态成员
System.out.println(name);//只能直接访问外部类的静态成员
System.out.println("Inner " address);//访问本内部类成员。
}
}

public void printInfo(){
Person person = new Person();
person.display();

//System.out.println(mail);//不可访问
//System.out.println(address);//不可访问

System.out.println(person.address);//可以访问内部类的私有成员
System.out.println(person.mail);//可以访问内部类的公有成员

}
public static void main(String[] args) {
StaticTest staticTest = new StaticTest();
staticTest.printInfo();
}
}
在静态嵌套类内部,不能访问外部类的非静态成员,这是由Java语法中"静态方法不能直接访问非静态成员"所限定。
若想访问外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。注意,外部类访问内
部类的的成员有些特别,不能直接访问,但可以通过内部类来访问,这是因为静态嵌套内的所有成员和方法默认为
静态的了。同时注意,内部静态类Person只在类StaticTest 范围内可见,若在其它类中引用或初始化,均是错误的。
三、在外部类中定义内部类
如下所示代码为在外部类中定义两个内部类及它们的调用关系:

public class Outer{
int outer_x = 100;

class Inner{
public int y = 10;
private int z = 9;
int m = 5;
public void display(){
System.out.println("display outer_x:" outer_x);
}
private void display2(){
System.out.println("display outer_x:" outer_x);
}

}

void test(){
Inner inner = new Inner();
inner.display();
inner.display2();
//System.out.println("Inner y:" y);//不能访问内部内变量
System.out.println("Inner y:" inner.y);//可以访问
System.out.println("Inner z:" inner.z);//可以访问
System.out.println("Inner m:" inner.m);//可以访问

InnerTwo innerTwo = new InnerTwo();
innerTwo.show();
}

class InnerTwo{
Inner innerx = new Inner();
public void show(){
//System.out.println(y);//不可访问Innter的y成员
//System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法
innerx.display();//可以访问
innerx.display2();//可以访问
System.out.println(innerx.y);//可以访问
System.out.println(innerx.z);//可以访问
System.out.println(innerx.m);//可以访问
}
}

public static void main(String args[]){
Outer outer = new Outer();
outer.test();
}
}
以上代码需要说明有,对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了
没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及
InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不
会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序
中的方法,不可直接访问内部类的变量。

四、在方法中定义内部类
如下所示代码为在方法内部定义一个内部类:

public class FunOuter {
int out_x = 100;

public void test(){
class Inner{
String x = "x";
void display(){
System.out.println(out_x);
}
}
Inner inner = new Inner();
inner.display();
}

public void showStr(String str){
//public String str1 = "test Inner";//不可定义,只允许final修饰
//static String str4 = "static Str";//不可定义,只允许final修饰
String str2 = "test Inner";
final String str3 = "final Str";
class InnerTwo{
public void testPrint(){
System.out.println(out_x);//可直接访问外部类的变量
//System.out.println(str);//不可访问本方法内部的非final变量
//System.out.println(str2);//不可访问本方法内部的非final变量
System.out.println(str3);//只可访问本方法的final型变量成员
}
}
InnerTwo innerTwo = new InnerTwo();
innerTwo.testPrint();
}

public void use(){
//Inner innerObj = new Inner();//此时Inner己不可见了。
//System.out.println(Inner.x);//此时Inner己不可见了。
}


public static void main(String[] args) {
FunOuter outer = new FunOuter();
outer.test();
}
}

从上面的例程我们可以看出定义在方法内部的内部类的可见性更小,它只在方法内部
可见,在外部类(及外部类的其它方法中)中都不可见了。同时,它有一个特点,就是方法
内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员。同时另一个
需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用。

共2页: 上一页 1 [2] 下一页

上一篇:JAVA基础:Java变量类型之间的相互转换   下一篇:对java两个IO基础类的理解


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·对java两个IO基础类的理解
·JAVA基础:Java变量类型之间的相互转换
·如何在内部类中返回外部类对象
·基础:深入理解Java对象实例生成的例子
·基础:理解构造器--构造器和方法的区别
·关于java中相对路径,绝对路径问题总结
·用例子来说明面向对象和面向过程的区别
·Java类完整构造执行顺序
·高级:编写多线程Java应用程序常见问题
·J2SE综合介绍:讨论关于Java占用内存的研究
·Java语言深入:关于java数组的深度思考
·J2SE综合--对于JAVA基础知识精华总结
·J2SE综合介绍:深入理解JavaHelp结构的好处
·J2SE综合介绍:深入了解Java 5.0的垃圾收集
·Java语言深入--什么叫面向接口编程
·J2SE综合--Java本地接口工作方式初探
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·Java入门:状态对象--数据库的替代者
·Java语言怎样调用外部应用程序
·Java语言深入--关于Java语言的内存泄漏
·JSP/Servlet/JSF:Servlet/JSP配置详解
·进阶-怎样使用AJAX进行WEB应用程序开发
·基础:J2ME程序开发之新手入门九大要点
·Java入门--Java语言接口与继承的本质
·JAVA进阶--如何提升JSP应用程序的效率
·对Java中四种XML解析技术之不完全测试
·编写高级 JScript应用代码
·JSP/Servlet/JSF--对标签库的深入研究
·Java入门--关于字符串分割的两种方法
  阅读排行
·使用AJAX技术实现网页无闪自动局部刷新
·快速教您Apache Tomcat SSL的配置
·Java语言深入--java调用C/C 的过程
·用JSP JavaScript打造二级级联下拉菜单
·JAVA进阶--线程运行栈信息的获取讲解
·J2SE综合--JAVA实现把汉字转化成拼音
·使用WEBWORK实现文件上传方法实例详解
·一个非常有趣的使用spring框架AOP例子
·关于java中相对路径,绝对路径问题总结
·高级:lucene全文检索应用示例及代码简
·详细讲解Struts构架中action的跳转大全
·Hibernate配置文件中的映射元素详解
·在Weblogic上配置JMS服务的方法
·对Java中四种XML解析技术之不完全测试
·基于AJAX的动态树型结构的设计与实现
网摘收藏: