读书人

治理Java类文件

发布时间: 2013-03-22 09:49:50 作者: rapoo

管理Java类文件

在java中,每一个定义好的类,在编译的时候,都会对应地产生一个.class文件。如果程序的规模越来越大,那么类文件也会越来越多,管理起来也会越来越麻烦,很容易发生命名的冲突。因此,java中引入了"包"(package)的概念。


一、内部类

在类中还可以再定义类,这种类叫做内部类(Inner Class)。使用内部类主要有三个好处:一是可以任意地访问对应的外部类的私有(private)成员;二是如果一个内部类只服务于对应的外部类,那么外界就不必知道有这个内部类的存在;三是对于外部类来说,内部类可以将一系列数据类型“打包”,就像C++的类中再定义结构体一样。当然类的功能要比结构体强大多了。

1、访问外部类的prvate成员


可以看到,程序打印出了外部类的private成员x的值。


2、将数据类型打包


对于一个包含内部类的类,程序编译后会产生一个名为 "外部类名$内部类名.class" 的类文件。如上例,编译后会生成InnerDemo$Point.class文件。由于Point类仅仅服务于其对应的外部InnerDemo类,因而在实际使用InnerDemo类的时候,我们不必关心Point类的存在。


二、匿名内部类

匿名内部类可以不用声明类名称,直接使用new关键字来产生一个对象:


那么,为什么编译器要强制我们把x声明为final?这是因为,在匿名内部类中访问x时,内部类中访问的只是变量x的一份拷贝,如果在匿名内部类中修改了变量x,那么这种修改是不会影响到外部的变量x的。所以把x声明为final后,就起到一个提醒的作用,表示程序员不可以在内部类中修改x的值。这样就降低了出错的可能性。



三、包(package),导入(import)

1、包

Java 提供包来管理类。包就对应着我们文件系统的文件目录。我们可以使用关键字 package来定义包,如:


假定在Point.class的上层目录里有这样一个程序:


为什么会发生这个错误呢?

因为,当使用通配符*时,编译器就会导入test目录下的所有文件。当我们用到Point 类时,由于Point.java文件和Point.class文件都在test目录下,编译器会首先找到Point.java文件而不是Point.class类。所以会报错。

为了避免此类错误的发生,我们要把源文件跟类文件分开,专门建立一个src目录存放.java 文件,建立classes目录存放.class文件。


特别要说明的是,java.lang包是默认被自动导入的。


3、import静态成员

在J2SE 5.0后增加了import static 语法,允许我们导入一个类或接口中的静态成员。这样就可以让程序员写得更少了。如:

import static java.lang.System.out;...out.println("");...



嗯嗯,就先到这吧。。


读书人网 >编程

热点推荐