利用包的定义实际上就可以将不同的功能类保存在不同的包之中,但是这些类彼此之间一定会存在有互相调用的关系,那么在这个时候就需要使用import语句来导入其他包中的程序类。
范例:定义一个程序类“cn.mldn.Message”,这个类负责进行一个消息数据的获取。
package cn.mldn.util;
public class Message
{
public String getContent()
{
return "我是Message类";
}
}
范例:定义一个测试类使用Message类“cn.mldn.TestMessage”。
public cn.mldn.test;
import cn.mldn.util.Message;//导入其他包的类
public class TestMessage
{
public static void main(Srting[] args){
Message msg = new Message();//实例化类对象
System.out.println(msg.getContent());
}
}
此时按照使用顺序来讲肯定要先编译Message.java,而后再编译TestMessage.java,但是如果一个程序代码里面有100个类,彼此之间互相引用严格,此时最好的做法不是区分顺序,而是交给java自己完成。
编译的命令:javac -d.*.java;
- javac:编译
- -d:打包
- “*” :所有
- .java:格式
结果:我是Message类
特别注意:关于public class 与class定义的区别?
- public class:类名称与文件名称保持一致,一个*.java里面只允许有一个public class,同时如果一个类需要被其他包的类所使用,那么这个类一定要定义为public class。
- classs:类名称可以与文件名称不一致,并且在一个*.java里面可以提供多个class定义,编译后将形成不同的*.class文件,这些类只能被本包所访问,外包无法访问。
- 在实际开发之中往往在一个*.java源代码文件里面只会提供有一个程序类,而这个程序类一般都是用public class定义。
程序类中定义的包名称必须采用小写的形式定义。
问题1:
这时候会有一个新的问题产生,有些时候可能会使用某一个包中的很多类,于是这样分开进行类的导入会比较麻烦,为了解决这样的问题也可以使用通配符。
package cn.mldn.test;
import cn.mldn.util.*;//类名用通配符代替
public class TestMessage
{
public static void main(String[] args){
Message msg = new Message(); //实例化类对象
System.out.println(msg.getContent());
}
}
即便此时使用了“包.*”的导入形式,也不表示要进行全部的加载,它会根据自己的需要加载所需要的程序类,其他类不会被加载。所以是使用"*"还是使用具体的类,其最终的性能是完全相同的。
问题2:
但是如果在开发之中采用的是“包.*”的形式进行包的导入时,那么有一点会比较麻烦,有可能两个不同的包中有相同的类名称,例如:假设TestMessage类由于某种需要要导入两个包:cn.mldn.util、org.demo,这两个包里都有Message类。
//第一个类
package cn.mldn.util;
public class Message
{
public String getContent()
{
return "我是Message类";
}
}
//第二个类
package org.demo;
public class Message
{
public String getInfo()()
{
return "我也是Message类";
}
}
两者包名不同,由于某种需要,在TestMessage导入了两个包。
package cn.mldn.test;
import cn.mldn.util.*;
import org.demo.*;
public class TestMessage
{
public static void main(String[] args){
Message msg = new Message(); //实例化类对象
System.out.println(msg.getContent());
}
}
这个时候发现类名称相同的时候就会出现不明确的引用处理,所以此时最简单的处理形式就是直接写上类的完整名称。
package cn.mldn.test;
import cn.mldn.util.*;
import org.demo.*;
public class TestMessage
{
public static void main(String[] args){
cn.mldn.util.Message msg = new cn.mldn.util.Message(); //实例化类对象,加上完整包名称
System.out.println(msg.getContent());
}
}
在日后的开发过程中,经常会见到大量的重名的类(包不重名),此时为了更好的解决问题,往往会使用类的完整名称进行操作。