阿里云【名师课堂】Java面向对象开发82 ~ 84:包的定义及使用


包实际上就是文件夹。在实际的项目开发中很难避免重复的类名称的出现(因为有很多开发者)。而如果所有的*.class文件放在同一个目录之中,那么就有可能出现覆盖的情况。而这样就会造成项目整体的开发困难。
为了解决这样的冲突,所有的Java程序都应该保存在各自的目录中。而这个目录就称为包。

82:包的定义

只需要在Java源码的第一行编写:package 包名 ;
范例:定义包

package TestDemo.hello ; // .表示子目录

public class TestDemo {
	public static void main(String args[]) {
		System.out.println("hello world") ;
	}
}

一旦程序出现有包名称,那么*.class文件就会存放在相应的目录之。不过目录如果手工创建的话非常麻烦,所以可以在编译java程序时追加一些配置参数:

  • 打包编译:javac -d . 类.java
    • -d:表示根据package生成目录;
    • .:在当前所在目录中生成目录。

按打包编译的方式编译之后,可以发现在当前目录中自动生成相应的文件夹以及保存各自的*.class文件。
在这里插入图片描述


一旦程序类上带有包名称,执行的时候就要带上包名称,而不是进入对应的目录中去执行,这时完整的类名称是包.类
在这里插入图片描述
在以后的开发过程中,所有的*.java文件都一定要定义包。

83:包的导入

开发过程中,一旦使用了包的定义之后,实际上就相当于把一个大的项目分别按照一定的要求保存在不同的包(文件夹)里面。但是这些程序类彼此之间一定会发生互相调用的情况,所以这种时候就需要采用导入包的处理方式。

  • import 包.类 ;

范例:编写一个简单的程序类,本类将被其他程序所导入

package TestDemo.util ;

public class Message { // 注意public关键字
	public void print() {
		System.out.println("【Message】hello world!") ;
	}
}

注意:这里Message的权限是public,public class与class的区别是?

  • public class:文件名称必须与类名称保持一致。如果希望一个类被其他包所访问,则必须定义为public class;
  • class:文件名称可以与类名称不一致,在一个*.java中可以定义多个class,但是这些类不允许被其他包所访问。

范例:希望通过另一个不同的包导入以上程序

package TestDemo.test ;

import TestDemo.util.Message ; // 导入Message类

public class PackageDemo {
	public static void main(String args[]) {
		Message msg = new Message() ;
		msg.print() ;
	}
}

那么这两个程序的执行顺序是怎么样的?

  • PackageDemo类引用了Message类,所以应该先编译Message类,然后再编译PackageDemo类。
  • 但是如果每次编译都要去记住顺序,在项目复杂时是不现实的。因此,可以让java自己去匹配先后顺序。
  • 改进打包编译:javac -d . *.java
    在这里插入图片描述

另外需要注意,在上述程序进行导入包的时候采用的是import 包.类 ;形式,这样只能一次导入一个类。如果想呀一次性导入所有需要的类,可以使用通配符*完成。

  • import TestDemo.util.* ;
  • *并不意味着要将包中的全部类都进行导入,而是根据需求进行导入。

但是在开发过程中也有可能出现不同包但是相同类的情况。假设:现在定义一个Demo.msg包中的Message类。
范例:观察代码

package Demo.msg ;

public class Message {
	public void info() {
		System.out.println("【Message】HELLO WORLD!") ;
	}
}

在这里插入图片描述
现在,要求Package类中需要同时导入这两个包中的Message类,这时如果直接使用Message类就会造成编译上的歧义:对Message的引用不明确

package TestDemo.test ;

import TestDemo.util.* ; // 导入Message类
import Demo.msg.* ;

public class PackageDemo {
	public static void main(String args[]) {
		Message msg = new Message() ;
		msg.print() ;
	}
}

在这里插入图片描述
这时可以通过在使用类时使用全名来定义。
范例:正确代码

package TestDemo.test ;

import TestDemo.util.* ; // 导入Message类
import Demo.msg.* ;

public class PackageDemo {
	public static void main(String args[]) {
		TestDemo.util.Message msg1 = new TestDemo.util.Message() ;
		msg1.print() ;
		Demo.msg.Message msg2 = new Demo.msg.Message() ;
		msg2.info() ;
	}
}

在这里插入图片描述

84:系统常用包(了解)

  • java.lang:系统常用的基础类,例如:StringObject······此包从JDK1.1开始自动导入;
  • java.lang.reflect:Java反射编程包;
  • java.math:数学支持包,但是支持有限;
  • java.net:进行网络编程的开发包;
  • java.aql:进行数据库开发的支持包;
  • java.util:Java提供的工具程序包;
  • java.io:进行IO编程的开发包;
  • java.applet:进行Applet程序的开发包,Applet程序现在已被淘汰;
  • java.awtjavax.swing:UI开发包,主要进行UI界面的编写,当然现在也淘汰了;
posted @ 2020-06-20 22:57  溺水的情书  阅读(177)  评论(0编辑  收藏  举报