在一个类内部定义类,这就是嵌套类(nested classes),也叫内部类、内置类。嵌套类可以直接访问嵌套它的类的成员,包括private成员,但是,嵌套类的成员却不能被嵌套它的类直接访问。

指点迷津:

当一个类中的程序代码要用到另外一个类的实例对象,而另外一个类中的程序代码又要访问第一个类中的成员,将另外一个类做成第一个类的内部类,程序代码就要容易编写得多,这样的情况在实际应用中非常之多!

下面的程序说明了如何定义和使用一个内部类。名为Outer的类定义了一个实例变量outer_i,一个test()方法,和一个名为Inner的内部类。

class Outer

{

int outer_i = 100;

void test()

{

Inner in = new Inner();

in.display();

}

class Inner

{

void display()

{

System.out.println("display: outer_i = " + outer_i);

}

}

}

class InnerClassDemo

{

public static void main(String[] args)

{

Outer outer = new Outer();

outer.test();

}

}

打印结果如下:

display: outer_i = 100

在程序中,内部类Inner定义在Outer类的范围之内。因此,在Inner类之内的display()方法可以直接访问Outer类的变量outer_i。其实,在内部类对象保存了一个对外部类对象的引用,当内部类的成员方法中访问某一变量时,如果在该方法和内部类中都没有定义过这个变量,调用就会被传递给内部类中保存的那个外部类对象的引用,通过那个外部类对象的引用去调用这个变量,在内部类中调用外部类的方法也是一样的道理。

一个内部类可以访问它的外部类的成员,但是反过来就不成立了。内部类的成员只有在内部类的范围之内是可知的,并不能被外部类使用。例如:

class Outer

{

int outer_i = 100;

void test()

{

Inner inner = new Inner();

inner.display();

}

class Inner

{

int y = 10;

void display()

{

System.out.println("display: outer_i = " + outer_i);

}

}

void showy()

{

System.out.println(y);

}

}

编译上面的程序,会出现如下错误:

G:\outer.java:19: cannot resolve symbol

symbol  : variable y

location: class Outer

System.out.println(y);

^

1 error

这里,y是作为Inner的一个实例变量来声明的,对于该类的外部它就是不可知的,因此不能被showy()使用。

如果用static修饰一个内部类,这个类就相当于是一个外部定义的类,所以static的内部类中可声明static成员,但是,非static的内部类中的成员是不能声明为static的。static的内部类不能再使用外层封装类的非static的成员变量,这个道理不难想像!所以static嵌套类很少使用。

我们把前面程序中的Inner内部类声明为static,来看看会出现什么样的错误:

class Outer

{

int outer_i = 100;

void test()

{

Inner in = new Inner();

in.display();

}

static class Inner

{

void display()

{

System.out.println("display: outer_i = " + outer_i);

}

}

}

class InnerClassDemo

{

public static void main(String[] args)

{

Outer outer = new Outer();

outer.test();

}

}

程序运行结果:

E:\TestOuter.java:13: non-static variable outer_i cannot be referenced from a static context

System.out.println("display: outer_i = " + outer_i);

^

1 error

这段信息表明Outer类的非静态成员变量outer_i不能被一个静态内部类的成员调用。

如果函数的局部变量(函数的形参也是局部变量),内部类的成员变量,外部类的成员变量重名,我们应该按下面的程序代码所使用的方式来明确指定我们真正要访问的变量。

public class Outer

{
 private int size;
 public class Inner

{
     private int size;
     public void doStuff( int size)

{
      size++; // 引用的是doStuff函数的形参

this.size++; //引用的是Inner类中的成员变量

Outer.this.size++; // 引用的Outer类中的成员变量

}

}
}

转载于:https://www.cnblogs.com/simple_666/archive/2010/06/04/1751630.html

Java内部类(摘自Java就业培训教程)相关推荐

  1. 《张孝祥JAVA就业培训教程》书摘

    1.java虚拟机及java的跨平台原理: 图P2        java兼顾解释件与编译性语言的特点,java源文件转换成.class字节码文件的过程是编译型的,.class在操作系统上运行的过程则 ...

  2. java就业培训教程 第一章读书笔记

    1.1  JVM和java的跨平台 java的跨平台:  java源程序经过编译->java字节码文件->由JVM执行 其实对于java的跨平台的这个特性,刚开始不是很能理解,直到有一次, ...

  3. java内部类文件,Java内部类学习

    Java内部类学习 1.内部类的实例与外部类的实例共享一种特殊的关系,这种特殊的关系为内部类中的代码提供对封装(外部)类成员的访问.其实,内部类就是外部类的一部分.不仅仅是"一部分" ...

  4. java 内部类泛型,java – 使用泛型强制转换为内部类

    请考虑以下代码: public class Outer { public class Inner{ } public static Outer.Inner get(){ Object o = new ...

  5. java内部类写法,Java匿名内部类

    Pragma mark - NO.1 匿名内部类 public class Main { public static void main(String[] args) { Outer o = new ...

  6. 本人编写的《新编J2ME就业培训教程》一书正式出版!

    内容简介 本书系统地介绍了J2ME技术的各个方面,包括开发环境的安装.J2ME的相关技术以及开发工具的使用等.和一般的技术书籍不同,本书在介绍各个J2ME技术时,从实际应用的角度出发,详细介绍这些技术 ...

  7. 本人编写的《新编J2ME就业培训教程》即将出版!

    该书的具体信息: http://www.infopower.com.cn/showdetail.php?isbn=7-5083-3275-8 请大家多多支持!

  8. java培训教程:什么是匿名内部类?怎样创建匿名内部类?

    本期java教程要为大家分享的是关于java中的匿名内部类,相信很多同学在学java技术的时候有了解过,下面我们就来详细的看一下. java培训教程:什么是匿名内部类?怎样创建匿名内部类?匿名内部类是 ...

  9. java培训教程分享:Java中怎样将数据对象序列化和反序列化?

    本期为大家介绍的java培训教程是关于"Java中怎样将数据对象序列化和反序列化?"的内容,相信大家都知道,程序在运行过程中,可能需要将一些数据永久地保存到磁盘上,而数据在Java ...

  10. java培训教程分享:Java编写软件代码自动提示功能

    本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能,很多零基础和初学java的同学们对这一块还不是很了解,Eclipse for android 实现代码自动提示智能提示功能 ...

最新文章

  1. js中正则表达式验证_JS正则表达式的验证
  2. 国际顶级学术会议CIKM2019北京开幕在即,重量级嘉宾带你窥探人工智能前沿
  3. liferay和cas系统集成
  4. 恶意网址提醒服务见实效
  5. 在华为写了 13 年代码,都是宝贵的经验
  6. python入门题目及答案_Python基础自测题答案和基础知识梳理
  7. pandas之shift()函数
  8. redis淘汰策略面试题_redis有哪些数据淘汰策略
  9. 大事件后台管理系统开发实战(下)
  10. dede tags.php漏洞,织梦dedecms安全漏洞之/include/common.inc.php漏洞解决办法
  11. MFC UI库知多少
  12. 4-8 :button表单按钮选择器
  13. DevExpress之TreeList绑定复杂数据类型
  14. 蓝桥杯省赛2018年Java组B组
  15. weblogic静默安装
  16. 发光二极管 正向压降
  17. 哈工大CSAPP程序人生大作业
  18. cad绘制正八边形_什么是CAD?为什么要学CAD?该怎么学CAD?
  19. 制作本地SCLo-scl镜像仓库(reposync下载rpm包、createrepo制作镜像仓库、httpd发布服务)
  20. edxposed显示未安装_Magisk与EdXposed框架安装实践(Android P及以上)

热门文章

  1. 3S基础知识:MapInfo MapX中如何保存专题地图
  2. 《JSP实用教程(第2版)/耿祥义》错误之非必要导入包
  3. 二级c语言准考证,考试准考证打印
  4. 深圳最新10区地图划分JSON
  5. 将华为路由器做成ftp服务器(实现上传下载功能)
  6. java程序设计之学生选课管理系统_课内资源 - 基于JAVA面向对象的学生选课管理系统...
  7. Ubuntu系统安装JDK教程
  8. fiddler运行原理_fiddler工作原理
  9. CentOS 7.4 安装Teamviewer 14
  10. matlab常用代码程序