正在回顾java基础
目录结构如下:
一
以下代码,进入Example所在的文件夹, javac和java都不会报错
public class Example{ public static void main(String[] args){ System.out.println("test1"); } }
二
以下代码,进入Example1所在的文件夹,javac不会报错,java会提示找不到主类
package com.test; public class Example1{ public static void main(String[] args){ System.out.println("test1"); } }
D:ookcom est>javac Example1.java D:ookcom est>java Example1 错误: 找不到或无法加载主类 Example1
三
二部分的报错的原理:
编译器在编译源文件时,不检查目录结构。如果编译的类中不依赖于其他包,就不会出现编译错误。但是最终程序无法运行,因为虚拟机找不到类文件。
将二部分的代码不做任何修改,修改进入的类的名称,在类名前加上package,javac和java都可以正常执行
D:ook>javac com/test/Example1.java D:ook>java com.test.Example1 test1
四
修改Example和Example1的代码,在Example中引用Example1这个类;
import com.test.Example1; public class Example{ public static void main(String [] args){ System.out.println("test"); Example1 ex = new Example1(); ex.sayHello(); } }
package com.test; class Example1{ public void sayHello(){ System.out.println("hello~"); } }
执行时会报错,说Example1不是公共的
D:ook>javac Example.java Example.java:1: 错误: Example1在com.test中不是公共的; 无法从外部程序包中对其进行访问 import com.test.Example1;
五,
四报错的原因,是包的作用域。public可以被任意类使用,private只能被定义他们的类使用,不指定的可以被同一个保重的所有方法访问。
但是不同package之间,需要声明public字段,才可以跨包使用。
在Example1的代码中,将类定义为public,这样com.test包以外的类才可以引用
package com.test; public class Example1{ public void sayHello(){ System.out.println("hello~"); } }
执行是OK的
D:ook>javac Example.java D:ook>java Example test hello~