1、定义两个public类
创新互联是一家专业提供讷河企业网站建设,专注与成都网站制作、成都做网站、HTML5建站、小程序制作等业务。10年已为讷河众多企业、政府机构等服务。创新互联专业网站制作公司优惠进行中。
1)TestA.java
1
2
3
4
public class TestA{//定义一个类TestA,并存成TestA.java文件
public void tb(){//定义类TestA的一个方法tb
}
}
2)TestB.java
1
2
3
4
public class TestB{//定义一个类TestB,并存成TestB.java文件
public void t1(){//定义类TestB的一个方法t1
}
}
2、TestA.java文件中的类TestA调用TestB.java中的类TestB
1
2
3
4
public void tb(){//类TestA的方法
TestB tb = new TestB();//实例化TestB
tb.t1();//调用TestB的方法,实现调用另一个文件中的类
1. 那么包名和实际物理路径有什么关系?
答: 包名必须出现在实际路径中的一部分, 只是一段, 不可能是绝对路径. 而这个段的起点, 就是包含了classpath目录的一个.
可以看到如下代码, 是eclipse 自动生成的 .classpath文件, 其中classpath就包含了testsrc, src, 而这两个目录下都有个子目录 coolUnit, 这个就是包名的开始.
?xml version="1.0" encoding="UTF-8"?
classpath
classpathentry kind="src" path="src"/
classpathentry kind="src" path="testsrc"/
classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/
classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/
classpathentry kind="output" path="bin"/
/classpath
2. 相同包名 如果可以存储在不同物理路径下, java 编译器如何找到对应的类 ?
答: 当然可以存储在不同的物理路径下, 只不过这两个路径中, 有一部分必须相同, 即包名包括的部分. 置于java编译器如何找到, 简单, 就是把从包名的起点的上层目录添加到classpath中了, 这样就可以找到对应了类了. 类似上边的testsrc, src, 这两个目录都被添加进了classpath(当然这个工作是eclipse替我们完成的, 如果是我们自己编译, 不借助eclipse, 就需要指定 javac –classpath 把这两个目录加进去)
3. 这里肯定跟classpath 有关, 不可能你随便写个java类, java 编译器都能找到, 那么如何引入自己写的类呢?
如何引用自己的类的, 就是将自己的类的包名的起点的上层目录作为 javac –classpath参数传入, 这样的目的是让java编译器找到你的类所在的位置.
综上: 包名是抽象出来的类的空间, 虽然在物理上存储需要文件夹配合层次, 但是关键, 这个层次不是绝对路径, 只是路径中的一部分, 所以, 我们完全可以将代码放在不同路径下, 只要路径中对应包名的部分相同就可以了.
包
为了更好地组织类,Java提供了包机制。包是类的容器,用于分隔类名空间。如果没有指定包名,所有的示例都属于一个默认的无名包.
Java中的包一般均包含相关的类,例如,所有关于交通工具的类都可以放到名为Transportation的包中.
包语句格式:
package pkg1[.pkg2[.pkg3…]];
程序中如果有package语句,该语句一定是源文件中的第一条可执行语句,它的前面只能有注释或空行。另外,一个文件中最多只能有一条package语句.
包的名字有层次关系,各层之间以点分隔。包层次必须与Java开发系统的文件系统结构相同(并非绝对路径)。通常包名中全部用小写字母,这与类名以大写字母开头,且各字的首字母亦大写的命名约定有所不同。
当使用包说明时,程序中无需再引用(import)同一个包或该包的任何元素。import语句只用来将其他包中的类引入当前名字空间中。而当前包总是处于当前名字空间中.
如果文件声明如下:
package java.awt.image
则此文件必须存放在Windows的java\awt\image目录下或unix的java/awt/image目录下。
问题出现了: 因为路径不可能是绝对的, 即从根目录开始一直向下, 所以目录的开始位置, 只需要是classpath包含的位置就可以了.
这才是问题解决的关键. 从这点说, 包名是抽象的.
如果在的是同一目录,类是不用导入的。直接使用就行。
java中 如果想导入其他包中的类,可以用 import关键字导入;例:import com.A;(导入com包中的A类)
如果用的是(myeclipse 或者eclipse工具的话 ,)可以使用快捷键 Ctrl+shift+o就会自动导入了。
放到任意文件夹都可以,看你的管理方式。
1、放到和程序目录下的某个文件夹中。
// 假设图片放到程序运行目录的img目录下
BufferedImage img = ImageIO.read(new File("img/my.png"));
2、放到源文件中,和读取类在同一目录,使用时图片要按包名打包到jar中
// 假设图片放到src下,和MyImages在一个目录
BufferedImage img = ImageIO.read(MyImages.class.getResource("my.png"));
3、放到源文件中,但在独立文件夹中,使用时图片要按包名打包到jar中
// 假设图片放到src下的img目录中
BufferedImage img = ImageIO.read(MyImages.class.getResource("res/my.png"));