Java基础总结

来源:互联网 发布:淘宝详情页ps怎么切片 编辑:程序博客网 时间:2024/06/14 12:33
Java基础总结 - 包(package)
这篇文章只是把大学记的笔记整理到博客,方便自己查看,不保证权威性(•̀ᴗ•́)و ̑̑

1.为什么需要包(package):

如果所有源文件都写在当前目录下,如果出现同名的文件就会出错,所以我们使用包package将他们层次分开

2.编译带包的java原文件后怎么运行编译出的.class文件

当我编译一个带包声明class A,即使我们cd到包目录下也无法运行这个编译后的字节码文件,这是因为在编译后这个类名字已经不再是A 而是带包申明的A,例如cn.jxau.cl.A;当我们cd到包下运行java A;这样名字名字类A与cn.jxau.cl.A不匹配就找不到,

而我们在包下运行java cn.jxau.cl.A,也是不行的,因为这个是名字的同时也是一个路径,java回去包目录下的/cn/jxau/cl找字节码文件它总的路径变成了/cn/jxau/cl/cn/jxau/cl,这下面并没有A字节码文件。

所以我么只能在跟目录下运行java cn.jxau.cl.A,这样既通过路径找到A字节码文件,切里面存放的又是名为cn.jxau.cl.A的类符合这两个条件。

3. 学习过程中碰到过这样一个问题,在源文件存在的情况下,使用import cn.jxau.cl.A是可以的,而使用import cn.jxau.cl.*可能会出错

这个原因要从这两种导包的原理说起:

Java中有两种包的导入机制:

单类型导入(single-type-import),例如import java.io.File:因为包名和文件名都已经确定,可以一次性查找定位到。

按需类型导入(type-import-on-demand),例如import java.io.*:编译器会把包名和文件名进行排列组合,然后对所有的可能性进行类查找定位。

例如:package com;

import java.io.*;

import java.util.*;

当你的类文件中使用到了File类,那么File可能会出现在以下几个地方:

1 File   File没有package语句,编译器首先搜索无名包。问题就出现在这里,它找到了与类名相同的.java文件就会报不是.class文件错误

2 com.File   File类属于当前包。

3 java.lang.File   自动导入

4 java.io.File  

5 java.util.File  

另外需要注意的是,上面的第4种情况下,编译器找到java.io.File后并不会停止下一步的搜寻,而是把所有的可能性都查找完以确定没有类冲突,如果有类冲突,则会报错,删除不用的类后再编译。假使此时的顶层路径有3个,编译器则会进行3*5=15次查找