java学习(九)——包

概念:包是java提供的一种的组织管理相关类和接口的机制,它还提供了访问权限和命名的管理机制。标准的java包具有一个层次结构。所有的java包都处于javajavax包层次中
为什么要使用包呢?

  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解释器加载类(带有 分隔符)

包作用域

 使用默认访问修饰符修饰的(类、变量和方法)可以被同一个包中的所有方法访问。

 

 

返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值