1.提出问题

为什么java源文件中只允许一个public类存在?

2.分析问题

问题涉及到的条件:源文件的名字    public类     main方法

一般我们在编写一个源文件的时候:

一个public类   一个main方法    public类名和源文件名字相同     main方法写在public类中

3.验证

3.1 源文件中不存在public类

1.源文件中没有public只是提供一个main方法

class Test2{
int i=2;
} class Test3{
int i=3;
} class Test1{
public static void main(String[] args){
System.out.println("当前类名为:Test1");
}
}

执行结果:

编译通过

     执行有main方法的类Test1.class的时候成功

执行没有main方法的类Test2.class的时候没有成功

结论:public不是编译和执行必须的;main方法是执行必须的

3.2源文件中存在public类

由上面的实验中可以得知执行程序必须执行有main方法的类;那么在此基础上令public类分别满足一下条件来做实验。

1.与源文件名字不相同(main方法在类中)

public class Test2{
public static void main(String[] args){
System.out.println("当前类名为:Test1");
} } class Test3{
int i=3;
} class Test1{
int i=2;
}

运行结果:

编译不通过

2.与源文件名字相同(main方法在类中)

 class Test2{
int i=2;
} } class Test3{
int i=3;
} public class Test1{
public static void main(String[] args){
System.out.println("当前类名为:Test1"); }

运行结果:

结论:public如果存在,public类的类名必须和源文件名字相同;

这个也就是解释了为什么只能够有一个public类,我们的源文件名字只有一个如果拥有很多的public类那么源文件就没有办法起名字了。

3.main方法不在public类中

class Test2{
public static void main(String[] args){
System.out.println("当前类名为:Test2"); } } class Test3{
int i=3;
} public class Test1{
int i=2;
}

运行结果:编译和执行都通过



结论:public类中不必要存在main函数

4.总结


《深入jvm第二版》中有这样一句话:java虚拟机实例通过调用某个类的main()来运行一个Java程序,而这个main()必须是public

static void 并接收一个字符串数组作为参数,任何拥有这样一个main()的类都可以作为java程序的起点。并没有说拥有main()方法的类一定要是public类。

从上面的实验中得出的结论:程序分为编译和执行两个阶段。

4.1编译阶段

public类存在的时候,程序编译和public类有关系。和main()函数无关。

如果存在public类,那么一个源文件中只能够存在一个而且要与源文件的名字相同。----------否则编译会报错

如果不存在public类,那么程序也可以成功编译。

4.2执行阶段

只有存在main()方法程序就可以执行,和public类无关。

为什么java源文件中只允许一个public类存在的更多相关文章

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

    问题:一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 答案:可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致.一个文件 ...

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

    声明,本篇文章为转载 转载 http://blog.csdn.net/bareheadzzq/article/details/6562211 最近在一个java文件中实现了几个类,其中一个声明为pub ...

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

    一个Java源文件中最多只能有一个public类, 1)当有一个public类时,源文件名必须与之一致,否则无法编译, 2)如果源文件中没有一个public类,则文件名与类中没有一致性要求. 至于ma ...

  4. 一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?

    一个.java源文件中可以有多个类吗?(内部类除外)有什么条件?带着这个疑惑,动手建几个测试类, 揭开心中的疑惑.以下是解开疑惑过程: package test;/** * 一个.java源文件中可以 ...

  5. java---面试题---.java"源文件中可以包括多个类(不是内部类)

    答题时,先答是什么,再答有什么作用和要注意什么 一个".java"源文件中可以有多个类,但只能有一个public的类,并且public的类名必须与文件名相一致,main方法只能写在 ...

  6. JAVA源文件中可以包含多个类

    可以的,一个“.java”源文件里面可以包含多个类,但是只允许有一个public类,并且类名必须和文件名一直:例如: package test; public class test { } class ...

  7. .java 文件中只能定义一个public class 且与文件名相同

  8. java源文件中是否必须要有一个public类?

    java源文件中不必有一个public类,如果没有public类的话,那么文件名可以是任意合法名称,且编译完成之后如果该源文件中有多个独立的类,则会生成多个对应的.class文件.

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

    我们都遇到过一个源文件中有多个java类,但当第一个类使用public修饰时,如果下面还有类使用public修饰,会报错.也就是是说一个java源文件最多只能有一个public类. 当有一个publi ...

随机推荐

  1. Java Project部署到Tomcat服务器上

    所有的JAVA程序员,在编写WEB程序时,一般都通过工具如 MyEclipse,编写一个WEB Project,通过工具让这个WEB程序和Tomcat关联.其实在我们可以通过JAVA程序部署到Tomc ...

  2. C#实现时间戳转化

    /// <summary> /// 时间戳转为C#格式时间 /// </summary> /// <param name=”timeStamp”></para ...

  3. 为什么希捷选择了8GB作为标准的闪存容量呢?答案就在下面(新的驱动器可以实现一定程度上的写入缓存)

    与前两代Momentus XT产品不同,希捷称第三代混合硬盘所使用的技术更接近真正的SSHD(Solid State Hybrid Disk?),而不是HHD.也就是说更偏向于固态硬盘.首先它不会属于 ...

  4. nodejs--express开发个人博客(-)

    写完了入门笔记,开始进入开发阶段吧.基于上一节的内容,现在着手开发个人博客系统.先划分一下功能吧 /:首页 /login:登陆 /reg:注册 /post:发表文章 /logout:退出 首先规划一下 ...

  5. 数据类型及其空间大小,vs2012实测

    #include "stdafx.h" #include <stdio.h> #include "common.h" #include " ...

  6. sqlplus

    以超级管理员登录 sqlplus sys/123 as sysdba 解锁用户 alter user xutianhao account unlock

  7. 新浪微博中tableview中头部信息

    摘自http://www.cnblogs.com/gcb999/p/3151665.html #import <UIKit/UIKit.h> @class User; @protocol ...

  8. 三个API:开启、关闭、关闭线程重定向

    C:\Windows\sysnative\ 这个目录是作什么用的?来源:互联网 责任编辑:小易 时间:2015/11/13 0:17:19用户提出问题:C:\Windows\sysnative\ 这个 ...

  9. 在不同编译环境中如何使用sleep()函数

    今天在学习有关时间函数时,想让程序暂时挂起,一段时间后在继续执行! 用到了系统函数sleep(): 在vc下sleep函数是以毫秒为单位,如果想让其停留3秒,需要这样做  sleep(3*1000); ...

  10. 机器时代的中国字幕(Automata.2014.720p.WEB-DL.DD5.1.H264-RARBG.srt)

    看字幕.再也看不下去.自己翻译的位 评价的探讨 1 00:01:58,452 --> 00:02:02,088 人工增雨 期限为32分钟16第二 2 00:02:02,089 --> 00 ...