Java中的package和import 感性认识

为什么要使用package和import

现在我学习Java遇到了class类的复用的问题,比如我昨天写了一个Person类,它和包含main()方法的类放在一个java文件中。类似如下

public class MainClass{
	public static void main(String[] args){
		Person jack = new Person("Jack",18);
		jack.sayHello();
	}
}

class Person{
	private String name;
	private int age;
	public Person(String _name,int _age){
		name=_name;
		age=_age;
	}
	
	public void sayHello(){
		System.out.println("Hi! I'm "+name+" and "+age+" years old");
	}
}

结果今天我写新的编程练习,又想使用这个Person类,我似乎需要把这个类的代码复制到我新的Java文件中。这可不是办法啊,另外我还发现当我在一个java源文件中写了两个类时,编译出来的class文件会有两个,例如上面的代码编译后,会有MainClass.class和Person.class。

所以是不是利用“import Person;”代码,就能在我新写的代码中直接使用Person类呢?事情似乎没这么简单。首先我的Person.class文件,来自于对上面代码的编译,但是这个类不是一个public类(一个java文件中只能有一个public类,并以此类作为java文件的文件名)。所以没有办法使用当前的Person.class文件。

所以我要为Person.class重写一个独立的java文件,将Person类改为public类型。当我写的类越来越多时,就要使用package关键字给他们打包。打包,字面意义而已。

package打包

当我在Person类源文件中加上

package madokast;

这段语句后。再利用javac -d . Person.java编译,class文件就不会出现在当前文件夹中,而是当前文件夹中新出现了一个叫madokast的新文件夹,打开后里面才有Person.class文件。
为了更好的管理源文件Java和编译后的class文件,我们一般建立一个项目project文件夹,然后在里面建立源文件 source/src文件夹和类classes文件夹,这样一来,让源文件和编译好的类文件分家,整个项目清晰美观。
project
|++source
|—++madokast
|———Person.java
|——MainClass.java
|++classes
|—++madokast
|———Person.class
|——MainClass.class

这样在MainClass.java中添加语句,也能进一步的展示项目的文件结构。

import madokast.Person;

记得编译和执行语句分别是(当前目录处于project文件夹下)

javac -d ./classes ./source/madokast/Person.java
javac -d ./classes -classpath ./classes ./source/MainClass.java
java -classpath ./classes MainClass

javac编译MainClass.java时,需要让编译器javac知道madokast.Person类所在的位置,不然会报错说无法识别Person符号。
java执行语句时,也需要指出类的位置。

这里有个细节我到今天才清楚,那就是java执行的是MainClass命令,而不是MainClass.class文件,因为如果你写成以下几种形式,都无法执行
java -classpath ./classes ./classes/MainClass
java -classpath ./classes MainClass.class
java -classpath ./classes ./classes/MainClass.class
也许java的运行是这样的——当它得知需要执行MainClass命令时,就去我设定的环境变量、classpath地址、当前地址中搜索MainClass.class文件,当以上路径都找不到这个文件时,就自然报错。

可以不用import语句

每个类都有独一无二的名字,那就是packageName.ClassName,因此使用 madokast.Person 就能让编译器知道其位置。

最后说下感受。今天学到Java的package管理,突然觉得这种模式比C/CPP好多了,C/CPP中分头文件和源文件,而我最近在书上看到说,根本没必要用头文件,多此一举,因为头文件主要就是所谓的声明,源文件是具体的函数定义,实际上编译器完全可以把函数定义当作声明去寻找,没有必要使用函数前,先有其声明语句。
的确呀。我在最上面贴的Java代码中,没看到MainClass类上面还写一句

class Person;

直接使用Person类,毫无问题。

另外一点是,Java中所有东西强制在类里面,这样编译后,一个class文件就是一个完整的类,实乃顺水行舟的存在。所以在一个java源文件中,最好是只定义一个类,有多少个类,就写多少个java源文件,这样source文件夹和classes文件夹里的内容就像一面镜子,太漂亮了。
当然你要按照package的语句把Java文件放在对应的文件夹中。这样子的双重操作,一面有点繁琐,一面又提醒我package命名的统一。

(注:此人还没有安装Java IDE,打算再研究一两周的时间)
(这时写的第一篇文章。可惜现在很忙,一面要学习geant4,bdsim软件,一面正在偷偷学Java,计算机组成和数据结构。大概写文章最主要的目的就是整理自己的思路,而不是简单地罗列学到的知识点,所以称为感性认识)

猜你喜欢

转载自blog.csdn.net/zrxrzrx/article/details/84206271