文章目录
- 一、package关键字的使用
- 1. 说明
- 2. 包的作用
- 3. JDK中主要的包
- 二、import关键字的使用
一、package关键字的使用
1. 说明
- package:包
- package用于指明该文件中定义的类、接口等结构所在的包。
- 语法格式
举例:pack1\pack2\PackageTest.java
package pack1.pack2; //指定类PackageTest属于包pack1.pack2
public 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);
}
}
运行结果:
这里主要是方便以后看别人写的代码不至于稀里糊涂,具体使用按照自己的习惯。