上一篇:一文带你迅速搞懂包是什么 | 带你学《Java面向对象编程》之六十七
【本节目标】
通过阅读本节内容,你将了解到如何使用import导入其他包实现跨包调用类、如何处理多个包中存在同名类的情况、静态导入纯静态类可以实现方法的直接调用等内容。
包的导入
利用包的定义实际上就可以将不同功能的类保存在不同的包之中,但是这些类彼此之间也一定会存在有互相调用的关系,那么在这种情况下就需要使用import语句来导入其它包中的程序类。
范例:定义一个程序类“cn.mldn.util.Message”,这个类负责进行一个消息数据的获取
package cn.mldn.util ;
public class Message {
public String getContent() {
return "www.mldn.cn" ;
}
}
范例:定义一个测试类使用Message类“cn.mldn.test.TestMessage”。
package cn.mldn.test ;
import cn.mldn.util.Message ; //导入其它包的类
public class TestMessage {
public static void main(String args[]) {
Message msg = new Message() ; //实例化类对象
System.out.println(msg.getContent()) ; //www.mldn.cn
}
}
此时按照使用顺序来讲肯定是要先编译Message.java,而后再编译TestMessage.java,但是请思考一个问题:如果有一个程序代码,里面有100个类,彼此之间互相引用严格,此时怎么区分呢?那么这个时候最好的做法不是区分顺序,而是直接交给Java自己去完成:javac -d . *.java;
特别需要注意的是:关于public class 与class定义的区别?
- public class:类名称必须与文件名称保持一致,一个*.java文件里面只允许有一个public class,同时如果一个类需要被其它的包所使用,那么这个类一定要定义为public class;
- class:类名称可以与文件名称不一致,并且在一个.java文件里面可以提供有多个class定义,编译后将形成不同的.class文件,但是这些类只能被本包所访问,外包无法访问。
- 在实际的开发之中往往在一个*.java源代码文件里面只会提供有一个程序,而这个程序类一般都使用public class定义;
程序类中定义的包名称必须采用小写字母的形式定义,例如:cn.mldn.util;
但是这个时候会有一个新的问题产生,有些时候可能会使用某一个包中的很多类,于是这样分开进行类的导入会比较麻烦,为了解决这样的问题,也可以使用通配符“*”来进行处理。
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()) ; //www.mldn.cn
}
}
即便此时使用了“包.”的导入形式,那么也不表示要进行全部的加载,它会根据自己的需要加载所需要的程序类,而不需要的程序类是不会被加载的,所以是使用“”还是使用具体的类其最终性能是完全相同的。
但是如果在开发中采用的是“包.*”的形式进行包的导入时,那么会有一点比较麻烦:有可能两个不同的包中存在有相同的类名称。例如,现在假设TestMessage类由于某种需要要导入两个包:cn.mldn.util、org.demo,但是这两个包里面都有Message类。
cn.mldn.util.Message:
package cn.mldn.util ;
public class Message {
public String getContent() {
return "www.mldn.cn" ;
}
}
org.demo.Message:
package org.demo;
public class Message {
public String getInfo() {
return "人民万岁!";
}
}
由于某种需要在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()) ; //www.mldn.cn
}
}
程序编译:
javac-d . TestMessage.java
org.demo中的类org.demo.Message和cn.mldn.util中的类cn.mld n.util.Message都匹配Test Message.java:6:错误:对Message的引用不明确
Message msg=new Message() ; //实例化类对象
org.demo中的类org.demo.Message和cn.mld n.util中的类cn.mld n.util.Message都匹配2个错误
这个时候就会发现类名称相同的时候就会出现不明确的引用处理,所以此时最简单的处理形式就是直接写上类的完整名称。
cn.mldn.util.Message msg = new cn.mldn.util.Message() ;
在日后的开发过程之中经常会见到大量的重名的类(包不重名),此时为了更好的解决问题,往往会使用类的完整名称进行操作。
包的静态导入
假如说现在有一个类,这个类中的全部方法都是static方法,那么按照原始做法肯定要导入程序所在的“包.类”,然后才可以通过类名称调用这些静态方法;
范例:定义一个MyMath数学类
package cn.mldn.util ;
public class MyMath {
public static int add(int ... args) {
int sum = 0 ;
for (int temp : args) {
sum += temp ;
}
return sum ;
}
public static int sub(int x , int y) {
return x - y ;
}
}
如果此时按照原始的方式进行导入处理,那么此时就需要导入包.类,而后通过类名称调用方法。
范例:原始方式使用
package cn.mldn.test ;
import cn.mldn.util.MyMath ;
public class TestMath {
public static void main(String args[]) {
System.out.println(MyMath.add(10 , 20 ,30)) ;
System.out.println(MyMath.sub(30 ,20)) ;
} //执行结果:60 10
}
从JDK1.5开始,对于类中全部由静态方法提供的特殊类是可以采用静态导入处理形式的。
范例:静态导入处理
package cn.mldn.test ;
import static cn.mldn.util.MyMath.* ;
public class TestMath {
public static void main(String args[]) {
System.out.println(add(10 , 20 ,30)) ;
System.out.println(sub(30 ,20)) ;
} //执行结果:60 10
}
当使用了静态导入处理之后就好比该方法是直接定义在主类中的,可以由主方法直接调用。
想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。
本内容视频来源于阿里云大学