关于package,import,和“找不到可以加载的主类”报错之间的关系

时间:2021-11-27 07:41:16

正在回顾java基础

目录结构如下:

  关于package,import,和“找不到可以加载的主类”报错之间的关系

一  

  以下代码,进入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~