关于Java源文件中public类的问题

结论:

一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必须与之一致,否则无法编译;

如果源文件中没有一个public类,则文件名与类中没有一致性要求;

至于main()不是必须要放在public类中才能运行程序。

实验如下:
Test3.java源文件:
class Test1
{
     int i = 1;

}

class Test2
{
     int i = 2;
     public static void main(String[] args)
    {
         System.out.println("main method");
    }
}

C:/javatest>javac Test3.java

C:/javatest>java Test2
main method

注:编译不会出错,注意是运行的Test2 因为没有Test3.class文件生成。如果运行Test3则报错

找不到该类
C:/javatest>java Test3
Exception in thread "main" java.lang.NoClassDefFoundError: Test3
Caused by: java.lang.ClassNotFoundException: Test3
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: Test3.  Program will exit.
这个错误原因很简单:JVM中的类加载器找不到Test3.class ,同时这里也说明了包含main()的类如果想运行则不一定要是public的。

《深入jvm第二版》中有这样一句话:
java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public static void 并接收一个字符串数组作为参数,任何拥有这样一个main()的类都可以作为java程序的起点。
并没有说拥有main()方法的类一定要是public类。

Test7.java源文件:
class Test5
{
     int i = 1;

}

public class Test6
{
     int i = 2;
     public static void main(String[] args)
    {
          System.out.println("main method");
    }
}

如果运行Test7.java 报错:
C:/javatest>javac Test7.java
Test7.java:8: 类 Test6 是公共的,应在名为 Test6.java 的文件中声明
public class Test6
        ^1 错误
这里说明了文件名必须与public类的类名一致,(如果文件中有public类)

这里可以看出如果有多个public类,那么文件名应该是哪个public类的呢?显然一个java源文件只能有一个public类。

通过上述实验,故能得出开始的结论!

参考:http://blog.csdn.net/bareheadzzq/article/details/6562211

时间: 2024-10-16 12:52:26

关于Java源文件中public类的问题的相关文章

浅谈为什么一个java源文件中只能有一个public类?

声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为public类型,但编译器报错:后来将public去掉,也即文件中没有一个public类,程序正常运行,有些困惑,最后通过本文章找到答案,为以后方便查找,转载,感谢作者. 结论: 一个Java源文件中最多只能有一个public类,当有一个public类时,源文件名必 须与之一致,否则无法编译,如果源文件中

第7章 一个java源文件中只能有一个public类

一个Java源文件中最多只能有一个public类, 1)当有一个public类时,源文件名必须与之一致,否则无法编译, 2)如果源文件中没有一个public类,则文件名与类中没有一致性要求. 至于main()不是必须要放在public类中才能运行程序. 备注: 第一: Test7.java源文件: class Test5{ int i = 1; } public class Test6{ int i = 2; public static void main(String[] args){ Sys

为什么一个java源文件中只能有一个public类

问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件中可以只有非public类,如果只有一个非public类,此类可以跟文件名不同. 为什么一个java源文件中只能有一个public类? 在java编程思想(第四版)一书中有这样3段话(6.4 类的访问权限): 1.每个编译单元(文件)都只能有一个public类,这表示,每个编译单元都有单一的公共接口,用pub

一个java源文件中为什么只能有一个public类。

我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个public类时,源文件名必须与之一致,否则无法编译,如果源文件中没有一个public类,则文件名与类中没有一致性要求. java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public static void 并接收一个字符串数组作为参数,任何拥有这样一个main(

1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?-Java面试题答案

以下内容来自:https://blog.csdn.net/ssyes123/article/details/50839612 一个.java类中是可以有多个类. 但是,在多个类中,有且只有一个public类,且public类的类名必须与*.java的文件名相一致. ------------------------------------------ JVM虚拟机实例通过调用某个类的main()来执行程序,这个main()必须时public static void 并接受一个字符串作为参数,但是该

java编程中Properties类的具体作用和使用!

如果不熟悉 java.util.Properties类,那么现在告诉您它是用来在一个文件中存储键-值对的,其中键和值是用等号分隔的.(如清单 1 所示).最近更新的java.util.Properties 类现在提供了一种为程序装载和存储设置的更容易的方法: loadFromXML(InputStreamis) 和 storeToXML(OutputStream os, String comment) 方法. 一下是详细的说明,希望能给大家带来帮助. 清单 1. 一组属性示例 foo=barfu

JAVA编程中的类和对象

1:初学JAVA,都知道JAVA是面向对象的编程.笔者这节开始说说类和对象.(实例仅供参考,如若复制粘贴记得修改包名和类名,避免出错) 学习JAVA的快捷键,Alt+/代码补全功能,其实此快捷键启动了Eclipse代码辅助菜单,Shift+Ctrl+o快捷键导入包 Ctrl+F可以快速查找API,中文版API,百度云链接:http://pan.baidu.com/s/1slQWhCL 密码:cfxo 首先 对象的创建:类名  对象名=new 类名();也许大多数学习java的都会写,但是理解方面

java数组中Arrays类

使用Arrays类之后要先导入包,即在开头添加这行: import.java.util.Arrays 1,排序:Arrays.sort(数组名) 排序后为数组升序. 2,将数组转换成字符串:Arrays.toString(数组名)

Java集合中那些类是线程安全的

线程安全类 在集合框架中,有些类是线程安全的,这些都是jdk1.1中的出现的.在jdk1.2之后,就出现许许多多非线程安全的类. 下面是这些线程安全的同步的类: vector:就比arraylist多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用.在web应用中,特别是前台页面,往往效率(页面响应速度)是优先考虑的. statck:堆栈类,先进后出 hashtable:就比hashmap多了个线程安全 enumeration:枚举,相当于迭代器 除了这些之外,其他的都是非线程安全