面向对象--包和导入


package

Oracle公司的JDK,各种系统软件厂商,众多的软件开发商,他们会提供成千上万,具有各种用途的类,不同软件公司在开发过程中也要提供大量的类,这些类会不会发生同名的

情形呢?答案是肯定的。那么如何处理这种重名问题呢?Oracle也允许在类名前增加一个前缀来限定这个类。

Java引入了包机制,提供了类的多层命名空间,用于解决类的命名冲突,类文件管理等问题

Java允许将一组功能相关的类放在同一个package下,从而组成逻辑上的类库单元。

如果希望把一个类放在指定的包结构下,应该在Java源程序的第一个非注释行放置如下格式的代码:

package packageName;
一旦在Java源文件中使用了这个package语句,就意味着该源文件里定义的所有类都属于这个包。

package test;

/**
 * 在Java源文件的第一行非注释行用package引入包
 * 
 * @author LinkinPark
 *
 */
public class Linkin
{

}
位于包中的每个类的完整类名都应该是包名和类名的组合,如果其他人需要使用该包下的类,也应该使用包名加类名的组合

/**
 * 包下类的使用
 * 
 * @author LinkinPark
 *
 */
public class LinkinTest
{
	public static void main(String[] args)
	{
		// 需要包含在某个包下的类,应该使用包名加类名的组合
		test.Linkin linkin = new test.Linkin();
	}
}

Java规定,位于包中的类,在文件系统中也必须有与包名层次相同的目录结构

1),使用javac -d . Linkin.java命令来编译一个包含包的源文件,当前路径下会先生成一个包的文件夹,然后在该文件夹下包含一个Linkin.class文件。

1),more Linkin.java 
package test;

/**
 * 在Java源文件的第一行非注释行用package引入包
 * 
 * @author LinkinPark
 *
 */
public class Linkin
{
        public static void main(String[] args)
        {
                System.out.println("test.Linkin类被执行。。。");
        }
}
2),javac -d . Linkin.java
3),ls -tl
-rw-r--r--     1 LinkinPark  staff    243  5 14 19:34 Linkin.java
drwxr-xr-x     3 LinkinPark  staff    102  5 14 19:30 test
4),java test.Linkin
test.Linkin类被执行。。。

2),直接使用Javac Linkin.java命令来编译一个包含包的源文件,将会在当前路径下生成一个Linkin.class文件,而不会生成相关的文件夹。

推荐编译Java文件时总是使用-d选项,即使想把生成的class文件放在当前路径下,也应该使用-d.选项,而不忽略-d选项

1),more Linkin.java 
package test;

/**
 * 在Java源文件的第一行非注释行用package引入包
 * 
 * @author LinkinPark
 *
 */
public class Linkin
{
        public static void main(String[] args)
        {
                System.out.println("test.Linkin类被执行。。。");
        }
}
2),javac Linkin.java
3),ls -l
-rw-r--r--     1 LinkinPark  staff    443  5 14 19:24 Linkin.class
-rw-r--r--     1 LinkinPark  staff    244  5 14 19:24 Linkin.java
4),java Linkin
错误: 找不到或无法加载主类 Linkin

3),当虚拟机要装载test.Linkin类时,它会依次搜索CLASSPATH环境变量所指定的系统路径,查找这些路径下是否包含test路径,并来test路径下查找是否包含Linkin.class文件。

虚拟机在装载带包名的类时,会先搜索CLASSPATH环境变量指定的目录,然后在这些目录中按与包层次对应的目录结构去查找class文件。

4),同一个包中的类不必位于相同的目录下,他们完全可以位于不同的位置下,只要让CLASSPATH环境变量里包含着两个路径即可。

虚拟机会自动搜索CLASSPATH下的子路径,把它们当成同一个包下的类来处理。

虽然如此,也应该把Java源文件放在与包名一致的目录结构下,这样可以解决源文件在文件系统中的存储冲突


包名的书写

Java语法只要求包名是有效的标识符即可,但从可读性规范角度来看,包名应该全部是小写字母,而且应该由一个或多个有意义的单词连缀而成。

企业开发的命名规则:域名反过来写,例如:cn.linkin.test.Linkin。

全用小写字母,避免使用与系统发生冲突的名字,如不能定义java.lang,java.swing等。

很多初学者以为只要把生成的class文件放在某个目录下,这个目录名就成了这个类的包名了,这是错的。

java的包机制需要2方面保证:

1),源文件里使用package语句指定包名

2),class文件必须放在对应的路径下。

一个Java源文件中使用package来定义一个包,在使用该类时就需要使用该类的全名,包名+类名,比如test.Linkin。

package确实解决了类的命名冲突,但是问题来了:如果需要使用不同包的其他类时,总是要写该类的全名,这是一件很繁琐的事情

这个时候import关键字派上用场了:import是导入类,我觉得这样描述不合理,我觉得import是找类,而不是导入类。


import

为了简化编程,Java引入了import关键字,import可以向某个Java文件中导入指定包层次下某个类或全部类,import语句应该出现在package语句之后,类定义之前。

一个Java源文件只能包含一个package语句,但可以包含多个import语句,多个import语句用于导入多个包层次下的类。

使用import语句导入单个类的用法如下:

import package.subpackage...ClassName;
当然也可以使用import语句导入指定包下全部类,用法如下:
import package.subpackage...*;

一旦在Java源文件中使用import语句来导入指定类,在该源文件中施工这些类时就可以忽略包前缀,不再需要使用类全名

使用import导入包注意下面3点:

1),通过使用import语句可以简化编程,但import语句并不是必须的,只要坚持在类里使用其他类的全名,则可以无须使用import语句

2),Java默认为所有源文件导入Java.lang包下的所有类,因此前面在Java程序中使用String,System类都无须使用import语句来导入这些类

3),手工导入需要使用的类和由JVM自动加载需要使用的类在性能上是一样的。比如下面2次导入性能上没区别:

import java.util.List;
import java.util.*;


import static

JDK1.5以后更是增加了一种静态导入的语法,它用于导入指定类的某个静态属性,方法或全部的静态属性,方法

1),导入指定类的单个静态属性,方法

import static package.subpackage...ClassName.filedName|methodName;
import static java.lang.Math.PI;
2),导入指定类的全部静态属性,方法
import static package.subpackage...ClassName.*;
import static java.lang.Math.*; 
3),使用import可以忽略写包名,而使用import static则可以连类名都省略。

import static java.util.Arrays.*;
import java.util.Arrays;

/**
 * import导入包
 * import static导入类
 * 
 * @author LinkinPark
 *
 */
public class Linkin
{
	public static void main(String[] args)
	{
		int[] arr = { 1, 2, 3 };
		sort(arr);
		System.out.println(Arrays.toString(arr));
	}
}

java源文件的大体结构

1),package 语句(0个或1个,必须放在文件开始)

2),import | import static 语句(0个或多个,必须放在所有类定义之前)

3),public classDefinition (0个或1个类定义,和源文件同名)

4),classDefinition(0个或多个类定义)


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值