正在回顾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:\book\com\test>javac Example1.java D:\book\com\test>java Example1
错误: 找不到或无法加载主类 Example1
三
二部分的报错的原理:
编译器在编译源文件时,不检查目录结构。如果编译的类中不依赖于其他包,就不会出现编译错误。但是最终程序无法运行,因为虚拟机找不到类文件。
将二部分的代码不做任何修改,修改进入的类的名称,在类名前加上package,javac和java都可以正常执行
D:\book>javac com/test/Example1.java D:\book>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:\book>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:\book>javac Example.java D:\book>java Example
test
hello~