文章目录
- 一、package关键字的使用
- 1. 说明
- 2. 包的作用
- 3. JDK中主要的包
- 二、import关键字的使用
一、package关键字的使用
1. 说明
- package:包
- package用于指明该文件中定义的类、接口等结构所在的包。
- 语法格式
举例:pack1\pack2\PackageTest.java
package pack1.pack2; //指定类PackageTest属于包pack1.pack2public class PackageTest{public void display(){System.out.println("in method display()");}
}
比如随便写的一个文件:
package Object6;/*** ClassName: Person* Package: Object6* Description:*案例:** (1)创建Person类的对象,设置该对象的name、age和gender属性,* 调用study方法,输出字符串“studying”;* 调用showAge()方法,返回age值;* 调用addAge(int addAge)方法给对象的age属性值增加addAge岁。比如:2岁。** (2)创建第二个对象,执行上述操作,体会同一个类的不同对象之间的关系。* @Author 雨翼轻尘* @Create 2023/9/25 0025 10:45*/
public class Person {String name;int age;char gender;public void study(){System.out.println("studying");}public int showAge(){return age;}public void addAge(int addAge){age+=addAge;}}
类和包:
类就相当于每个学生,包就相当于班级。
将不同功能的类放在不同的包下面,方便检查和调用。
也有一些文件直接写在src目录下,没有从属的包,叫无名包
:(包没有名字,类也没有具体的包从属)
💬注意
-
一个源文件只能有一个声明包的package语句
-
package语句作为Java源文件的第一条语句出现(前面若有空行也算第一条语句)。若缺省该语句,则指定为无名包。
-
包名,属于标识符,满足标识符命名的规则和规范(全部小写,若大写并不会报错,但最好遵守规范)、见名知意
-
包通常使用所在公司域名的倒置:com.atguigu.xxx。(XXX是根据包具体的功能来写的)
-
大家取包名时不要使用"
java.xx"
包(不要java开头,可以java结尾)
若此时创建了一个java.at的包:
并创建了一个类:
随便输出一下:
运行一下就会报错:
运行代码的时候要执行main方法,执行main方法需要类加载,类加载的时候需要知道包在哪儿。
类加载的时候使用类加载器,专门加载类,将它放在方法区。在加载的时候需要看到这个类是属于哪个包的,它可看到java开头的包特别敏感,它会认为是JDK提供的API(安全机制的问题),就去那里面找,没有找到此时的包,就会报错啦。
- 包对应于文件系统的目录,package语句中用 “
.
” 来指明包(目录)的层次,每.
一次就表示一层文件目录。
随便一个文件,右键点击“打开于Explorer”:
文件目录:
- 同一个包下可以声明多个结构(类、接口),但是不能定义同名的结构(类、接口)。不同的包下可以定义同名的结构(类、接口)。
2. 包的作用
- 包可以包含类和子包,划分项目层次,便于管理
比如:
-
帮助管理大型软件系统:将功能相近的类划分到同一个包中。比如:MVC的设计模式
-
解决类命名冲突的问题
-
控制访问权限
3. JDK中主要的包
java.lang
----包含一些Java语言的核心类,如String、Math、Integer、 System和Thread,提供常用功能
java.net
----包含执行与网络相关的操作的类和接口。
java.io
----包含能提供多种输入/输出功能的类。
java.util
----包含一些实用工具类,如定义系统特性、接口的集合框架类、使用与日期日历相关的函数。
java.text
----包含了一些java格式化相关的类
java.sql
----包含了java进行JDBC数据库编程的相关类/接口
java.awt
----包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。【不重要】
二、import关键字的使用
- import : 导入
为了使用定义在其它包中的Java类,需用import语句来显式引入指定包下所需要的类。
- 语法格式
举例:
import pack1.pack2.Test; //import pack1.pack2.*;表示引入pack1.pack2包中的所有结构
public class PackTest{public static void main(String args[]){Test t = new Test(); //Test类在pack1.pack2包中定义t.display();}
}
-
import语句来显式引入指定包下所需要的类。相当于
import
语句告诉编译器到哪里去寻找这个类。 -
import语句,声明在包的声明和类的声明之间。
比如:
- 如果需要导入多个类或接口,那么就并列显式多个import语句即可。
比如:
- 如果使用
a.*
导入结构,表示可以导入a包下的所有的结构。举例:可以使用java.util.*的方式,一次性导入util包下所有的类或接口。
比如这三个都是util包下的:
那么可以这样来写:
/*import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;*/import java.util.*; // *表示util包下所有的类/接口
- 如果导入的类或接口是
java.lang
包下的(使用频繁),或者是当前包下的,则可以省略此import语句。
比如:
package Object17;import java.lang.String; //可以不用写
import java.lang.System; //可以不用写public class PackageImport {public static void main(String[] args) { String str="hello";System.out.println(str);}
}
若在同一个包下面,也可以省略import语句。比如此时在同一个Object17包下面,就不需要导包:
- 如果已经导入java.a包下的类,那么如果需要使用a包的子包下的类的话,仍然需要导入。
比如要使用java.lang就不需要导包,若是要使用java.lang下面的子包里面的某个类,比如java.lang.reflect就需要导包。
现在咱们声明一个Fild
类(java.lang.reflect下的某个类),先置成null:
这里会提示,好多包下面都有这个类。
点击一下Field并将光标放在Field上,按Alt+Enter
,会弹出一个框,选择需要的包即可:
此时系统会自动导包:
import java.lang.reflect.Field;
再举个例子:
比如现在正在cat包下的nose类中,想创建一个dog包下的people类的对象,那么就需要导包:import dog.people;
将这个位置改成*
:import dog.*;
(现在可以调用dog包下的所有类):
此时若还想使用dog包下的子包one里面的Leo类,还需要重新调包import dog.one.Leo;
:
- 如果在代码中使用不同包下的同名的类,那么就需要使用类的全类名的方式指明调用的是哪个类。
比如Date类在很多包里面都有,现在我在一个文件中想用它们两个:
先使用它:
目前这个Date就使用的是util下的:
现在又写了一个date1,想要使用的是sql下的类:
但是它目前默认是util下面的:
若此时手动导包
import java.sql.Date
是不行的,date和date1都变成sql下的了。
现在想要的是:date是util包下的,date1是sql包下的。
那如何指明date1是java.sql下的呢?
只能这样:
java.sql.Date date1=null;
看一下全部代码:
package cat;import java.util.Date;public class nose {//使用import的方式指明Date date=new Date();//使用全类名的方式(把类所在的包都加上)java.sql.Date date1=new java.sql.Date(1332);
}
同样,date也可以全类名定义,这样就不需要在上面再导包了。
以下是两种方式:
其实,只要用到具体的类,都要写明“全类名”(是哪个包下的哪个类),只不过这样会使得代码可读性太差,所以才出现了import导入,再使用这个包下面的类的时候就不用再写全类名了。
若是在同一个文件中,要使用不同包下的同一个名字的类,那就需要写完整全类名以示区分。
- (了解)
import static
组合的使用:调用指定类或接口下的静态的属性或方法。
以前都需要拿对象来调用,这里却可以用类(System)调用:
System.out.println();
其实类也可以调用,只不过调用的结构需要有static
修饰。
按住Ctrl键点击out
:
可以看到被static
修饰了:
如果在上面指明了out的所在包:import static java.lang.System.out;
,在下面就可以直接调用out
:
import static java.lang.System.out;
public class nose {public static void main(String[] args) {out.println("hel");}
}
运行结果:
再举个例子:
public static void main(String[] args) {System.out.println(Math.PI*3*3);
}
按住Ctrl键点击PI
:(可以看到PI也被static修饰)
如果在上面指明了out的所在包:import static java.lang.Math.PI;
,在下面就可以直接调用PI
:
import static java.lang.System.out;
import static java.lang.Math.PI;
public class nose {public static void main(String[] args) {out.println(PI);}
}
运行结果:
这里主要是方便以后看别人写的代码不至于稀里糊涂,具体使用按照自己的习惯。