Java包机制
初识Java包
包的本质:包其实就是文件夹
包的用途:主要用来管理类的,当项目做大的时候肯定要写很多的类,如果都放在同一个文件夹下面,就看到得很乱,使用包类整理一下,就看得比较清晰。然后包也可以解决一些类的同名情况,把相同的类放在不同的包,那这两个类就是不一样的。
包的由来:其实也是为了防止重复造轮子,所以Java就把已经写好的类放在一个文件夹中,下次要使用的时候直接导入包然后就直接使用包里面的类就好,这样就不用每次都要写同样的类了。
Java包的关键字 package
包的定义
定义包的格式:
package 包名;
包名的命名规则:
一般包名是按照公司域名起的(倒置)。比如百度:com.baidu.www
个人的话也可以是按博客命名,同样也是倒置。com.Cukor.blog
使用起名的时候用小写。
package关键字要放在类的首行,在它之前不能有其他的语句,否则会报错。
命令行创建包
现在把java源文件写一下:
package com.zhong.www; //定义包的格式
public class Hello{
public static void main(String[] args){
System.out.println("Hello");
System.out.println("This is test of create package");
}
}
然后进入命令行去编译Hello.java文件。注意使用的命令
编译后出现了com文件夹。进入com文件夹中看看:
里面存放的是Hello.class文件
然后运行程序看看:
命令行的代码格式是
java 包名.类名
其中.具有分割包的作用,就相当于路径。最后到达.class文件的时候就使用类名就可以了。
- 对命令行代码的解释:
- -d 表示的是要生成一个目录,而目录的结构就是package定义的结构
- . 表示的就是在当前目录下
- 所以上面的代码表示的意思就是在当前的目录下生成一个子目录
Intellij IDEA中创建包
现在有几个类已经写好了,没有一个包管理一下,现在就几个那还好,如果是多了就难受了,所以建立一个包来管理一下。
给包起个名字:
再在com包中创建包,同样的方法:
最后创建包到blog:
在IDEA中直接鼠标拖动.java文件到com.Cukor.blog中,弹出窗口直接点重构。
然后在com.Cukor.blog包中就会多出一些东西:
这个就是在IDEA中创建包,操作简单,只用鼠标点点点就完事了。
包的导入
导入的关键字是import
再创建一个test包
然后在test包中写测试代码,想要使用到com.Cukor.blog包中的类(MM、GG等类),那就使用import语句将该包中的东西导入到test包中的测试类中:
直接看代码:
//MM类中
package com.Cukor.blog; //MM类在com.Cukor.blog中,已经写好,代码如下
public class MM {
private String name;
int age;
int faceScore;
public MM(String name,int age,int faceScore){
this.name=name;
this.age=age;
this.faceScore=faceScore;
}
public void printInfo(){
System.out.println(this.name+"\t"+this.age+"\t"+this.faceScore);
}
}
//在TestCode类中
package test;
import com.Cukor.blog.MM; //导入com.Cukor.blog包中的MM类
public class TestCode {
public static void main(String[] args) {
MM mm=new MM("Alice",20,100);
mm.printInfo();
}
}
输出结果:
Alice 20 100
如果在com.Cukor.blog包中还有很多类,testCode类中也都想使用com.Cukor.blog包中的类就必须将com.Cukor.blog包导入进来,有两种方案:
- 按照上面的方式:包名.类名 一个个导入
- 使用新方式:包名.* 使用了通配符“*”,告诉JDK,自己去找相应的类导进来。很方便。
上面两种方式,效果和性能都是一样的,当包中的类很多的时候使用第一种方法就不太合适了,因为要写很多代码。
看看代码实现:
现在个包com.Cukor.blog,里面有MM类和GG类
package com.Cukor.blog;
public class MM{
private String name;
private int age;
private int faceScore;
public MM(String name,int age,int faceScore){
this.name=name;
this.age=age;
this.faceScore=faceScore;
}
public void printInfo(){
System.out.println(this.name+"\t"+this.age+"\t"+this.faceScore);
}
}
package com.Cukor.blog;
public class GG{
private String name;
private int age;
private int money;
public MM(String name,int age,int money){
this.name=name;
this.age=age;
this.money=money;
}
public void printInfo(){
System.out.println(this.name+"\t"+this.age+"\t"+this.money);
}
}
测试类:(在test包中)
package test;
import com.Cukor.blog.MM; //导入com.Cukor.blog包中的MM类
import com.Cukor.blog.GG; //导入com.Cukor.blog包中的GG类
public class TestCode {
public static void main(String[] args) {
MM mm=new MM("Alice",20,100);
mm.printInfo();
GG gg=new GG("Jack",21,8888);
gg.printInfo();
}
}
输出结果:
Alice 20 100
Jack 21 8888
把测试代码改改:
package test;
import com.Cukor.blog.*; //让JDK自己去找
public class TestCode {
public static void main(String[] args) {
MM mm=new MM("Alice",20,100);
mm.printInfo();
GG gg =new GG("Jack",21,8888);
gg.printInfo();
}
}
输出结果:
Alice 20 100
Jack 21 8888
通过测试后发现两个代码的效果是一样的。
包的静态导入
当一个类中的全部方法都使用了static修饰,可以采用静态导入的操作。
现在有一个类,类中的方法都使用static修饰,意味着这些方法可以直接调用不需要对象来调用。
package com.Cukor.blog;
public class HaveStatic {
public static int sum(int a,int b){
return a+b;
}
public static int max(int a,int b){
return a>b?a:b;
}
}
然后在测试类中静态导入
package test;
import static com.Cukor.blog.HaveStatic.*; //静态导入的写法
public class TestCode {
public static void main(String[] args) {
int result=sum(99,55);
System.out.println(result);
result=max(99,55);
System.out.println(result);
}
}
输出结果:
154
99