课时101:包的导入
摘要:
1. 包的导入操作及示例
2. public class 与 class 的区别
3. 使用通配符 * 导入包
4. 解决类名冲突问题
01. 包的导入操作及示例
利用包可以将不同功能的类保存在不同的包之中,然而,这些类彼此之间常常存在互相调用的关系,为了实现类之间的调用,需要使用 Import 语句导入其他包中的类。
范例1:定义一个程序类 “ cn.mldn.util.Massage ”
注:这个类负责进行一个消息数据获取。
1.1新建 Massage.java 文件
代码如下:
package cn.mldn.util; public class Massage { public String getContent(){ return "www.mldn.cn"; } }
1.2新建 TestMassage.java 文件,
注:包名需要全部相同才是同一个包。
代码如下:
package cn.mldn.test; import cn.mldn.util.Message; //程序需要导入其他包的类 public class TestMassage { public static void main(String[] args) { Message meg = new Message(); //实例化类对象,使用这个类 System.out.println(msg.getContent() ) ;//实现语句 } }
注:此时按照使用顺序来讲,肯定要先编译 Massage.java ,而后编译 TestMassage.java 。但是如果现在写一个程序代码里面有大概一百个类,彼此之间互相引用严格,该如何区分?此时最好的做法不是区分顺序,而是直接交给 Java 自己完成。
编译的命令 : javac -d.*.java;
运行结果如下:
02. public class 与 class 的区别
范例:把 Massage 里面的 public 删除,与文件 cn 删掉
代码如下
package cn.mldn.util; class Massage { public String getContent(){ return "www.mldn.cn"; } }
编译结果如下, TestMassage 报错,
注意:public class 与 class 定义的区别?
(1) 在实际开发中,通常在一个 *.java 源代码文件中只提供一个程序类,并且这个程序类一般使用 public class 定义。 包名通常使用小写字母形式定义,例如 cn.mldn.util。
(2) public class : 类名称必须与文件名称保持一致,一个 *.java文件中只允许有一个 public class ,如果一个类需要被其他的包所使用,那么这个类一定要定义为 public class;
(3) class :类名称可以与文件名称不一致,并且在一个 *.java 文件里里面可以提供多个 class 定义,编译后将形成不同的*.class文件,但是这些类只能够被本包所访问,外包无法访问
03. 使用通配符 “ *“
当需要使用一个包中的多个类时,可以使用通配符 * 导入整个包,从而避免逐个导入类。
package cn.mldn.test; import cn.mldn.util.*; // 导入其他包的类,将具体内容变为 “ * ” public class TestMassage { public static void main(String[] args) { Message meg = new Message(); // 实例化类对象 System.out.println(msg.getContent()); } }
修改代码后运行结果如下
注:即便使用了“ 包.*“ 的导入形式,也并不意味着要加载包中的所有类。 编译器会根据实际需要加载所需的程序类,而不会加载不需要的类。 因此,使用 * 和使用具体的类名在最终性能上是相同的。
04. 类名冲突问题
在开发中采用的是“ 包.* ”的形式进行包的导入时,可能会遇到类名冲突的问题即有可能两个不同的包中存在有相同的包名称,例如,现在假设 TestMessage 类由于某种需要导入两个包:cn.mldn.util、org.demo,这两个包里面都有 Message 类。
范例:cn.mldn.util.Massage 与 org.demo.Massage
把 message.java 类修改为
package org.demo; public class Massage { public String getInfo (){ return "人名万岁!"; } } 注:与之前的 message.java 不同 package cn.mldn.util; public class Massage { public String getContent(){ return "www.mldn.cn"; } }
TestMassage.java 内代码为
package cn.mldn.test; import cn.mldn.util.*; // 导入其他包的类 import org.demo.*;//要导入两个不同的包,且都有 Message public class TestMassage { public static void main(String[] args) { Message meg = new Message(); //实例化类对象 System.out.println(msg.getContent()); } }
此时进行程序编译,输入 : javac -d . Message.java , javac -d . TestMessage.java 结果为:
结果显示,两个 Message 类都匹配,引用不明确
这个时候就会发现类名称相同时,会出现不明确的引用处理,为了解决类名冲突问题,最简单的方法是使用类的完整名称(包括包名)来引用类。 例如:
cn.mldn.util. Message meg = new cn.mldn.util. Message();
再次编译,程序可以正常运行:
注:在实际开发中,经常会遇到大量重名的类(包名不重名)。 为了更好地解决类名冲突问题,通常建议使用类的完整名称进行操作。