黑马程序员技术交流社区

标题: 一个.java文件里面只能有一个public [打印本页]

作者: 张帅    时间: 2011-12-19 10:10
标题: 一个.java文件里面只能有一个public
本帖最后由 张帅 于 2011-12-19 11:59 编辑

java程序是从一个public类的main函数开始执行的,被jvm所识别
所以如果有多个public,那么它将不知道从哪个类开始执行,
这是我的理解,不知道对不对
作者: 刘基军    时间: 2011-12-19 10:17
我认为可以这么理解。
作者: 刘博    时间: 2011-12-19 10:20
java程序是从一个public类的main函数开始执行的,(其实是main线程),就像C程序是从main()函数开始执行一样。     只能有一个public类是为了给类装载器提供方便。     一个public   类只能定义在以它的类名为文件名的文件中。

每个编译单元(文件)都只有一个public   类。因为每个编译单元都只能有一个公共接口,用public类来表现。该接口可以按照要求包含众多的支持包访问权限的类。如果有一个以上的public   类,编译器就会报错。  并且public类的名称必须与文件名相同(严格区分大小写)。  当然一个编译单元内也可以没有public类。

在一个源文件.JAVA文件中可以有很多类,只有一个PUBLIC类其他的都不能是.   
在PUBLIC类中找程序的入口   main函数  你想想如果很多PUBLIC   类,那程序从何运行呢?
作者: 常兆鹏    时间: 2011-12-19 10:25
public static void main(String[] args)
主函数是一个特殊的函数,作为程序的入口,可以被jvm调用。
主函数的定义:
public:代表着该函数访问权限是最大的。
static:代表着主函数随着类的加载就已经存在了。
void:主函数没有具体的返回值。
main:不是关键字,但是一个特殊的单词,可以被jvm识别。
(String[] args):函数的参数,参数类型是一个数组,该数组中的元素类型是字符串类型。
主函数是固定格式的,jvm识别。
public只是代表访问权限,可以有多个。同样地还有private
作者: 刘旭    时间: 2011-12-19 10:29
java中不允许定义多个public类。当虚拟机执行程序时,会首先找到public类,然后从这个类中寻找主方法,执行程序。如果主方法没有定义在public类中,编译可以通过,但是执行时会抛出异常。所以,我认同你的看法。
作者: 张帅    时间: 2011-12-19 11:55
说的有道理,常兆鹏 只是把视频的东西讲了下,孤独的人 和 刘旭 谈了下自己的看法,很好,受教了,
一个如果一个想独立运行的类,他必须得有main函数,否则  会  Exception in thread "main" java.lang.NoSuchMethodError: main,很好
最后,能不能也给我点分,求分。。。
作者: 郭繁森    时间: 2011-12-19 12:01
public 和 private一样,是权限修饰符。一个放大权限,一个缩小权限。
JVM通过main关键字 寻找入口,只要类中没有多个main都是可以的,都能被JVM识别,如果main多了,也
就是入口多了,编译器会报错的
作者: 为梦而战    时间: 2011-12-19 15:26
其实也可以一个public类也没有,这时就没有必要非的保证类名和java文件名一致了


jAVA中类的修饰几也就几个


public     公共类
默认类  (即class前什么都不假)
abstract   抽象类
fanal      不能被继承的类
static     静态类
private    只能修饰内部类
被public修饰的类是JVM的入口,也就是包含main函数的类,一但类被public修饰后,JAVA文件名就必须和类名一致

作者: 窦超    时间: 2011-12-19 16:44
public类是java程序执行main函数的起始点,在后台是识别到他才开始继续运行的,所以为了类装载器不会出现不知道运行哪个的问题只能有一个public类,他的定义要和文件名一致
作者: 梁俊    时间: 2011-12-19 17:56
  1. public class RegexDemo
  2. {
  3.         public static void checkQQ(String tel)
  4.         {
  5.         }

  6. }
  7. class ss
  8. {
  9.         public static void main(String[] args)
  10.         {
  11.                 RegexDemo.checkQQ("18600019999");
  12.         }
  13. }
复制代码
我保存在RegexDemo.java里也正确编译啊,
main函数的 类,不用必须是public的吧
作者: 张冬冬    时间: 2011-12-19 18:19
本帖最后由 张冬冬 于 2011-12-19 18:20 编辑

你这么理解不对!
函数是从main函数开始运行的,并不是找public类中的main方法,
一个java文件即使没有公共类也是可以运行的,只要有main主函数就能运行,所以和是不是公共类没关系!
只不过public的类,java文件的名字要和类一致,只有这点不同。
作者: 舒远    时间: 2011-12-19 18:58
张冬冬说的很对。
作者: 张冬冬    时间: 2011-12-21 10:54
舒远 发表于 2011-12-19 18:58
张冬冬说的很对。

:#  谢谢夸奖!
作者: 房宝彬    时间: 2011-12-21 11:11
11楼正解
作者: 张帅    时间: 2011-12-21 11:48
房宝彬 发表于 2011-12-21 11:11
11楼正解

是滴,这点我原来确实不知道
作者: 黄战胜    时间: 2011-12-21 11:59
首先说明你的理解大错特错。
在理解此问题上首先要明确各个关键字的含义,及在程序中的作用。我说明两点。
1,在Java程序中,对成员的修饰一共有四种。public private protected 默认 :这几个关键字是决定成员变量和成员方法的访问权限。跟虚拟机开始执行哪个程序没有直接关系。
2,在开发Java虚拟机的时候,就是默认了main关键字标志的程序为程序的开始。这个有虚拟机决定的,如果当时在开发Java虚拟机的时候把关键字hei作为程序的开头的话,那么虚拟机在执行程序的时候它就会把hei关键字作为程序的开头。而不是main。程序编译,汇编之后体现给虚拟机的就是一个二进制文件,虚拟机具体从那里开始执行要有一个约定,在二进制中体现出来的也就是一个i标号的地址。
作者: 张帅    时间: 2011-12-21 12:09
hzs_android 发表于 2011-12-21 11:59
首先说明你的理解大错特错。
在理解此问题上首先要明确各个关键字的含义,及在程序中的作用。我说明两点。
...

嗯,说的对,我确实在这迷糊了
作者: 房宝彬    时间: 2011-12-21 20:49
一个类里面 好象是 必须要有一个或多个public吧?张东东?
作者: 奔→跑    时间: 2011-12-21 22:08
public 是权限修饰符;
包与包之间必须由public修饰才能访问;
作者: 张冬冬    时间: 2011-12-22 18:45
房宝彬 发表于 2011-12-21 20:49
一个类里面 好象是 必须要有一个或多个public吧?张东东?

有public的类,可以被别的包调用,而没有public的不能被别的包调用。
如果一个类就是单独运行的,和别的类没有关系,就不需要有public类。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2