包
概念:包是java提供的一种的组织管理相关类和接口的机制,它还提供了访问权限和命名的管理机制。标准的java包具有一个层次结构。所有的java包都处于java和javax包层次中
为什么要使用包呢?
1.把功能相近的类放在同一个包中,方便查找和使用
2.避免命名冲突。java使用了包的机制,可以在不同的包中定义同名的类
3.在java中,访问权限可以使用包为单位
类的导入(编译器完成):一个类可以使用所属包中的所有类以及其他包中的公有类(public class)
1.在类名前添加完整的包名(太繁琐,很少用,但是某些情况下必须这样用),如:
java.time.LocalDate d1=java.time.LocalDate.now();
System.out.println(d1);
2.使用 import 语句(包含在包中的类的简明描述的引用)导入一个特定的类或者整个包
import java.util.*; //导入java.util包中所有的类
import java.util.Random; //导入一个包中特定的类
public class PackageDemo
{
public static void main(String[] args)
{
Scanner scanf=new Scanner(System.in);
String str=scanf.nextLine();
System.out.println();
}
}
注:1.import 语句应该位于源文件的顶部(但位于package语句的后面)
2.只能使用(*)号导入一个包。即不能 类似 import java.*.*; import java.*; 这样使用。
冲突情况:
如在java.util和java.sql包中都含有Date类,一旦某个程序中导入了这两个包,且程序中使用了Date类就会出现编译错误
import java.util.*;
import java.sql.*;
public class PackageDemo
{
public static void main(String[] args)
{
Date d1=new Date();
}
}
编译结果
解决办法:在源文件头部添加一个特定的import语句,如下:
import java.util.*;
import java.sql.*;
import java.util.Date;
public class PackageDemo
{
public static void main(String[] args)
{
Date d1=new Date();
}
}
如果在程序中两个类都要使用呢?
解决办法:使用第一种导入类的方法,在每个类的前面加上完整的包名
java.util.Date d1=new java.util.Date();
java.sql.Date s1=new java.sql.Date(...);
静态导入
java可以导入静态类和静态方法,一旦导入了某个静态方法或静态域,调用时就可以不使用类名前缀。如下
import static java.lang.System.*; //导入System类的所有静态域和静态方法
import static java.lang.System.out; //导入类的特定的域或方法
import static java.lang.Math.*;
public class PackageDemo
{
public static void main(String[] args)
{
int a=3,b=4;
int c;
//c=(int)Math.sqrt(Math.pow(a,2)+Math.pow(b,2)); //使用类名的情况
c=(int)sqrt(pow(a,2)+pow(b,2));
//System.out.println("c="+c); //使用类名的情况
out.println("c="+c);
}
}
将类加入到包中
格式: package 包名;
……
package语句必须放在源文件的开头(第一句),如果在源文件中没有package语句,这个源文件中的类就会被放置在一个默认包(defaulf package)中,(这个包没有名字,一般就是当前目录,)。假设有如下几个类:
package cn.yeye.tool;
public class Student
{
public static void main(String[] args)
{
System.out.println("学生类");
}
}
package cn.yeye;
public class Phone
{
……
}
//默认包
package Aniaml
{
……
}
命令行运行
由上可以看出,编译器在编译源文件的时候是不检查目录结构的,如Phone.java中有
package cn.yeye;
即使这个源文件没有在子目录cn.yeye下,也可以进行编译。但是最终的程序将无法运行,除非先将所有类文件移动到正确的位置。
另一种编译方式
1.先将各源文件放到与包名匹配的子目录中,如下(DAY4是基目录)
2。编译各源文件
这种情况下,解释执行一个类仍要从基目录编译和运行类 ,否则会出现错误
注: 编译器对文件(带有文件分隔符和扩展名.java的文件)进行操作,而java解释器加载类(带有 . 分隔符)
包作用域
使用默认访问修饰符修饰的(类、变量和方法)可以被同一个包中的所有方法访问。