龙空技术网

java 核心技术-12版 卷Ⅰ- 4.8.4 在包中增加类

CC躺平混吃 57

前言:

眼前你们对“java文件后缀名获取”可能比较重视,各位老铁们都想要了解一些“java文件后缀名获取”的相关资讯。那么小编同时在网上网罗了一些有关“java文件后缀名获取””的相关内容,希望各位老铁们能喜欢,兄弟们一起来了解一下吧!

原文4.8.4 在包中增加类

要想将类放入包中,就必须将报名放在源文件的开头,即放在定义这个包中各个类的代码之前。例如,程序4-8 中的文件Employee.java 开头是这样的:

package com.horstmann.corejavapublic class Employee{	// ... 类代码}

如果没有在源文件中放置package 语句,那么这个原文件中的类就属于无报名(unnamed package)。无名包没有包名。到目前为止,我们定义的所有类都在无名包中。

将源文件放到与完整包名匹配的子目录中。例如,com.horstmann.corejava包中的所有源文件应该放置在子目录 com/horstmann/corejava中(Windows 中则是 com\horstmann\corejava)。编译器将类文件也放在相同的目录结构中。

程序清单4-7 和程序清单4-8 中的程序分别放在两个包中:PackageTest 类属于无名包;Employee 类属于 com.horstmann.corejava 包。因此,Employee.java 文件必须在子目录 com/horstmann/corejava中。换句话说,目录结构如下所示:

. (baseDirectory) 当前根目录

—PackageTest.java

—PackageTest.class

—com/

———horstmann/

————————corejava/

————————————Employee.java

————————————Employee.class

要想编译这个程序,只需要切换到基目录,并运行以下命令

javac PackageTest.java

编译器就会自动地查找文件 com/horstmann/corejava/Employee.java 并进行编译

下面看一个更加实际的例子。在这里没有使用无名包,而是将类分别放在不同的包中(com.horstmann.corejava 和 com.mycompany)

. (baseDirectory) 当前根目录

—com/

———horstmann/

————————corejava/

————————————Employee.java

————————————Employee.class

———mycompany/

—————————PayrollApp.java

—————————PayrollApp.class

在这种情况下,仍然要从基目录编译和运行类,即包含com目录的目录:

javac com/mycompany/PayrollApp.java

java com.mycompany.PayrollApp

再次强调,编译器处理文件(带有文件分隔符和扩展名 .java的文件),而Java解释器加载类(带有 . 分隔符)

提示:从下一章开始,我们将对源代码使用包。这样一来,就可以为各章建立一个IDE项目,而不是各小节分别建立项目。

警告:编译器在编译源文件的时候不检查目录结构。例如,假设一个源文件开头有以下指令

package com.mycompany;

即使这个源文件不在于子目录 com/mycompany 下,这个文件也可以编译。如果它不依赖于其他包,就可以通过编译而不会出现编译错误。但是,最终的程序将无法运行,除非先将所有类文件转移到正确的位置上。如果包与目录不匹配,虚拟机就找不到这些类。

程序清单 4-7 PackageTest.java

import com.horstmann.corejava.*;// the Employee class is defined in that packageimport static java.lang.System.*;/** * This program demonstrates the use of packages. * @version 1.11 2004-02-19 * @author Cay Horstmann */public class PackageTest{   public static void main(String[] args)   {      // because of the import statement, we don't have to use       // com.horstmann.corejava.Employee here      var harry = new Employee("Harry Hacker", 50000, 1989, 10, 1);      harry.raiseSalary(5);      // because of the static import statement, we don't have to use System.out here      out.println("name=" + harry.getName() + ",salary=" + harry.getSalary());   }}

程序清单 4-8 PackageTest/com/horstmann/corejava/Employee.java

package com.horstmann.corejava;// the classes in this file are part of this packageimport java.time.*;// import statements come after the package statement/** * @version 1.11 2015-05-08 * @author Cay Horstmann */public class Employee{   private String name;   private double salary;   private LocalDate hireDay;   public Employee(String name, double salary, int year, int month, int day)   {      this.name = name;      this.salary = salary;      hireDay = LocalDate.of(year, month, day);   }   public String getName()   {      return name;   }   public double getSalary()   {      return salary;   }   public LocalDate getHireDay()   {      return hireDay;   }   public void raiseSalary(double byPercent)   {      double raise = salary * byPercent / 100;      salary += raise;   }}

标签: #java文件后缀名获取