Java中的包

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

Java中的包

Java中的包是封装一组类,子包和接口的机制。软件包用于:

  • 防止命名冲突。例如,可以有两个名称分别为Employee的类,college.staff.cse.Employee和college.staff.ee.Employee
  • 更轻松地搜索/定位和使用类,接口,枚举和注释
  • 提供受控访问:受保护和默认有包级别访问控制。受保护的成员可以通过同一个包及其子类中的类访问。默认成员(没有任何访问说明符)只能由同一个包中的类访问。
  • 包可以被视为数据封装(或数据隐藏)。

我们所需要做的就是将相关类放入包中。之后,我们可以简单地从现有的软件包中编写一个导入类,并将其用于我们的程序中。一个包是一组相关类的容器,其中一些类可以访问,并且其他类被保存用于内部目的。
我们可以在程序中尽可能多地重用包中的现有类。

java包是如何工作的?

软件包名称和目录结构密切相关。例如,如果包名是college.staff.cse,那么有三个目录,大学,工作人员和cse,使得cse存在于工作人员和工作人员在大学中。此外,目录college可通过CLASSPATH变量访问,即CLASSPATH中存在大专的父目录路径。这个想法是确保类很容易找到。
包命名约定:软件包以与域名相反的顺序命名,即org.geeksforgeeks.practice。例如,在一所大学里,推荐的大学是college.tech.cse,college.tech.ee,college.art.history等。

将一个类添加到包中:我们可以通过使用程序顶部的包名称并将其保存在包目录中,将更多的类添加到已创建的包中。我们需要一个新的java文件来定义公共类,否则我们可以将新类添加到现有的.java文件并重新编译它。

子包:在另一个包内的包是子包。这些默认情况下不会导入,它们必须明确导入。另外,子包的成员没有访问权限,即它们被认为是受保护和默认访问说明符的不同包。
示例:

import java.util。*;

util是在java包内创建的一个子包。

 

访问java包内的类

考虑以下两条语句:

//从util包导入Vector类。
import java.util.vector; 

//从util包中导入所有的类
import java.util。*; 


第一条语句用于从java中包含的util包中导入Vector类。
第二条语句从util包导入所有类。

//这个包的所有类和接口
//将可访问但不包含子包。
import package.*;

//只提到这个包的类会被访问。
import package.classname;

//类名通常在两个包相同时使用
// 班级名称。例如在下面的代码中,两个包都有
//日期类,因此使用完全限定名称来避免冲突
import java.util.Date;
import my.packag.Date;
</pre>
<pre title="">// Java program to demonstrate accessing of members when
// a corresponding classes are imported and not imported.
import java.util.Vector;
 
public class ImportDemo
{
   public ImportDemo()
   {
      // java.util.Vector is imported, hence we are
      // able to access directly in our code.
      Vector newVector = new Vector();
 
      // java.util.ArrayList is not imported, hence 
      // we were referring to it using the complete 
      // package.
      java.util.ArrayList newList = new java.util.ArrayList();
   }
 
   public static void main(String arg[])
   {
      new ImportDemo();
   }
}

java软件包的类型

软件包的类型有内置的软件包和用户定义的软件包内置软件包
这些软件包由大量的类组成,这些类是Java API的一部分。一些常用的内置软件包有:
1)java.lang:包含语言支持类(例如分类,用于定义基本数据类型,数学运算)。该软件包会自动导入。
2) java.io:包含分类以支持输入/输出操作。
3) java.util:包含实现像链接列表,字典和支持等数据结构的实用类; 用于日期/时间操作。
4) java.applet:包含用于创建Applets的类。
5) java.awt:包含用于实现图形用户界面组件的类(如按钮,菜单等)。
6) java.net:包含支持网络操作的类。

用户定义的软件包
这些是由用户定义的软件包。首先我们创建一个目录myPackage(名称应该与包的名称相同)。然后在第一个语句是包名称的目录中创建MyClass。

//包的名称必须与目录相同
//在这个文件下面保存
package myPackage;

publice MyClass
{
    public void getNames(String s)
    {        
        的System.out.println(一个或多个);        
    }
}

现在我们可以在我们的程序中使用MyClass类。

/ *从'names'中导入'MyClass'类myPackage * /
import myPackage.MyClass;

public PrintName 
{
   public static void main(String args []) 
   {       
      //初始化String变量 
      //带值 
      String name =“GeeksforGeeks”;
      
      //在类中创建一个MyClass类的实例 
      //包。
      MyClass obj = new MyClass();
      
      obj.getNames(name);
   }
}

注意: MyClass.java必须保存在myPackage目录中,因为它是包的一部分。

 

java包使用静态导入

静态导入是Java编程语言(版本5和更高版本)中引入的一项功能,它允许将在类中定义为public static的成员(字段和方法)用于Java代码中,而无需指定定义该字段的类。
以下程序演示静态导入:

// Note static keyword after import.
import static java.lang.System.*;
 
class StaticImportDemo
{
   public static void main(String args[])
   {      
        // We don't need to use 'System.out' 
        // as imported using static.
        out.println("GeeksforGeeks");
   }
}

输出:

 GeeksforGeeks

java package处理名称冲突

我们唯一需要关注软件包的时候就是当我们遇到名称冲突时。例如,java.util和java.sql包都有一个名为Date的类。所以如果我们在程序中导入两个包,如下所示:

import java.util.*;
import java.sql.*;

//然后使用Date类,那么我们将得到一个编译时错误:

Date today ; //ERROR-- java.util.Date or java.sql.Date?

编译器将无法找出我们想要的日期类。这个问题可以通过使用特定的导入语句来解决:

import java.util.Date;
import java.sql.*;

如果我们同时需要两个Date类,那么每次我们声明该类的新对象时,都需要使用完整的包名。
例如:

java.util.Date deadLine = new java.util.Date();
java.sql.Date today = new java.sql.Date();

目录结构

包名与用于存储类的目录结构紧密相关。属于特定包的类(和其他实体)一起存储在相同的目录中。此外,它们存储在由其包名指定的子目录结构中。例如,com.zzz.project1.subproject2包的Circle类存储为“$ BASE_DIR \ com \ zzz \ project1 \ subproject2 \ Circle.class”,其中$ BASE_DIR表示包的基本目录。显然,包名称中的“点”对应于文件系统的子目录。

基本目录($ BASE_DIR)可以位于文件系统的任何位置。因此,Java编译器和运行时必须被通知$ BASE_DIR的位置以便定位这些类。这由一个名为CLASSPATH的环境变量完成。CLASSPATH类似于另一个环境变量PATH,它被命令shell用来搜索可执行程序。

设置CLASSPATH:
CLASSPATH可以通过以下任何方式进行设置:

  • CLASSPATH可以在环境中永久设置:在Windows中,选择控制面板?系统?高级?环境变量 ?选择“系统变量”(针对所有用户)还是“用户变量”(仅限当前登录用户)?选择“编辑”(如果CLASSPATH已经存在)或“新建”?输入“CLASSPATH”作为变量名称?输入所需的目录和JAR文件(以分号分隔)作为值(例如,“。; c:\ javaproject \ classes; d:\ tomcat \ lib \ servlet-api.jar”)。请注意,您需要在CLASSPATH中包含当前工作目录(用'。'表示)。
    要检查CLASSPATH的当前设置,请发出以下命令:

    > SET CLASSPATH
    
  • 可以通过发出以下命令临时为该特定CMD shell会话设置CLASSPATH:
    > SET CLASSPATH = .; c:\ javaproject \ classes; d:\ tomcat \ lib \ servlet-api.jar
    
  • 例如,您可以使用javac和java命令的命令行选项-classpath或-cp来代替使用CLASSPATH环境变量,
    > java -classpath c:\ javaproject \ classes com.abc.project1.subproject2.MyClass3
    

用户定义包的示例:
创建我们的第一个包:
文件名 - ClassOne.java

package package_name;

public class ClassOne {
    public void methodClassOne() {
        System.out.println("Hello there its ClassOne");
    }
}

创建我们的第二个包:
文件名 - ClassTwo.java

package package_one;

public class ClassTwo {
    public void methodClassTwo(){
        System.out.println("Hello there i am ClassTwo");
    }    
}

利用两个创建的包:
文件名--Test.java

import package_one.ClassTwo;
import package_name.ClassOne;

public class Testing {
    public static void main(String[] args){
        ClassTwo a = new ClassTwo();
        ClassOne b = new ClassOne();
        a.methodClassTwo();
        b.methodClassOne();
    }
}

输出:

Hello there i am ClassTwo
Hello there its ClassOne

现在查看包和测试类文件的目录结构:
Java中的包

重要的一点:

  1. 每个class都是一些软件包的一部分。
  2. 如果没有指定包,则文件中的类将进入一个特殊的未命名包(对于所有文件都是相同的未命名包)。
  3. 文件中的所有类/接口都是同一个包中的一部分。多个文件可以指定相同的包名称。
  4. 如果指定了包名称,则该文件必须位于名为name的子目录中(即目录名称必须与包名称匹配)。
  5. 我们可以使用package-name.class-name访问另一个(named)包中的公共类

一些常见的Java包

Java中的Java.io包

Java中的Java.lang包

Java中的Java.util包

  •   本文标题:Java中的包 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/4260.html
      微信返利机器人
      免费:淘宝,京东,拼多多优惠券
      腾讯,爱奇艺,优酷的VIP视频免费解析,免费看
      即刻扫描二维码,添加微信机器人!

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注