Java源文件中多个类的限制:为什么只能有一个public类?解析与规则详解

*.Java 文件

Java源文件中多个类的限制:为什么只能有一个public类?解析与规则详解

问题:“.java”源文件可以包含多个类(不是内部类)吗?有什么限制?

答:可以有多个类,但只能有一个公共类,且公共类名必须与文件名一致。文件中只能有非公共类。如果只有一个非公共类,则该类可以与文件名不同。

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

《Java编程思想(第四版)》(6.4类访问权限)一书中有这样三段话:

1、每个编译单元(文件)只能有一个公共类,这意味着每个编译单元有一个公共接口,由一个公共类来表示。该接口可以包含支持包访问所需的任意数量的类。如果一个编译单元中存在多个公共类,编译器将给出错误信息。

2、公共类的名称必须与包含编译单元的文件名完全一致,包括大小写。如果它们不匹配,您还会收到编译错误。

3.虽然不是很常用,但是编译单元中根本没有公共类也是有可能的。在这种情况下,您可以随意命名该文件。

总结一些相关问题:

1. 一个“.java”源文件可以包含多个类(不是内部类)吗?有什么限制?

答:可以有多个类,但只能有一个公共类,且公共类名必须与文件名一致。

2、为什么一个文件中只能有一个公共类?

答:编译时,编译器只会接受一个Java源代码文件的一个公共类(也称为“编译单元”)。否则报错。

3. java文件中可以没有public类吗?

答:公开课不是必须的。 java 文件中不需要公共类。

4、为什么这个public类的类名必须和文件名一样?

答:是为了方便虚拟机在对应的路径下找到对应的类对应的字节码文件。

主要方法

Main函数:是一个特殊的函数,作为程序的入口点,可以被JVM调用。

主要函数定义:

public:表示该函数拥有最大的访问权限

static:表示主函数在类加​​载时已经存在。

void:main函数没有具体的返回值

main:不是关键字,而是JVM可以识别的特殊单词

(String[] args):函数的参数。参数类型是数组。数组中的元素是字符串和字符串数组。在main(String[] args)的情况下,对于字符串数组来说,空间数组的长度为0,但也可以在运行时向其中传递参数。

main函数的格式是固定的,并且能够被JVM识别。

main函数可以被重载,但是JVM只识别main(String[] args),其他的都被当作一般函数处理。这里的args知识数组变量可以改变,但其他的都不能改变。

一个java文件可以包含很多类,每个类只有一个main函数。然而,每个java文件可以包含多个主要函数。在运行时,您需要指定哪个 JVM 条目。例如,一个类的main函数可以调用另一个类的main函数。没有必要使用公共类的main函数。

外部类的访问权限

外部类只能修改为public和default。

为什么要修改外部类或者类呢?

1.有一个包的概念:public和default可以区分这个外部类,划分不同的包(default修饰的类不能引入到其他包中,public修饰的类可以引入)

2、protected在包内可见,对子类也可见,但是当外部类想要继承一个被protected修饰的非同包类时,根本找不到该类,更不用说几层了。

3.私有修饰的外部类,其他外部类不能导入它。

//Java中的文件名必须与public修饰的类名相同,否则会报错 //如果没有public修饰的类,文件可以任意命名 public class Java中的类文件 {} //非公开开放类的访问权限默认为包访问权限。不能使用private和protected。//外部类只有两种访问权限,一种是包内可见,一种是包外可见。 //如果修改为private,其他类就根本看不到这个类,也就没有意义了。 //如果使用了protected,虽然在包中也是可见的,但是如果有子类想要继承该类但是在不同的包中, //根本找不到该类,也就无法继承,所以只需使用默认值即可。 A 类{}

Java包的命名规则

以java.*开头的是Java的核心包,所有程序都会使用这些包中的类;

那些以 javax 开头的。是扩展包,x表示extension,表示扩展。虽然javax.是java.的优化和扩展,因为javax.用的越来越多,很多程序都依赖javax.,所以javax.也是核心的一部分,也是随JDK一起发布的。

以 org.* 开头的软件包是由各个机构或组织发布的软件包。由于这些组织影响力很大,代码质量也很高,所以他们开发的一些常用的类也和JDK一起发布。

在包命名方面,为了防止重名,有一个约定:大家对自己开发的包进行命名,以自己域名的倒写形式作为开头。例如,百度发布的包将以com.baidu.开头,由w3c组织发布。包会以org.w3c.开头,而魏学渊发布的包会以net.weixueyuan.*开头...

组织机构的域名后缀一般为org,公司的域名后缀一般为com。可以认为以 org 开头的包。是由非营利组织发布的软件包。它们一般都是开源的,可以在自己的产品中免费使用,无需考虑。侵权问题,以及以 com 开头的包。通常由营利性公司发布,可能存在版权问题,因此使用时要小心。

使用进口

Java 导入和 Java 类的搜索路径。如果要使用Java包中的类,首先必须使用import语句导入,语法为:

import package1[.package2…].classname;package 是包名,classname 是类名。例如:导入java.util.Date; // 导入java.util包下的Date类 import java.util.Scanner; // 导入java.util包下的Scanner类 import javax.swing.*; // 导入 javax. swing包下的所有班级,*表示所有班级

注意:

import只能导入包中包含的类,不能导入包。为了方便,我们一般不会导入单个类,而是导入包下的所有类,比如import java.util.*;。

Java编译器默认为所有Java程序导入JDK的java.lang包中的所有类(import java.lang.*;),其中定义了一些常用的类,如System、String、Object、Math等,所以我们您可以直接使用这些类,而无需显式导入它们。但使用其他类必须先导入。

前面提到的“Hello World”程序使用了System.out.println();陈述。 System 类位于 java.lang 包中。虽然我们没有显式导入这个包中的类,但是Java编译器已经默认为我们导入了它们。 ,否则程序将无法执行。

java类的搜索路径 当Java程序运行时,必须导入相应的类,也就是加载.class文件的过程。假设有以下 import 语句:

导入p1.测试;

该语句表示要导入p1包中的Test类。在安装JDK的时候,我们已经设置了环境变量CLASSPATH来表示类库的路径。它的值为.;%JAVAHOME%lib,而JAVAHOME为D:Program Filesjdk1.7.071,所以CLASSPATH相当于.;D:Program Filesjdk1.7.071lib。

如果在第一个路径中找到了所需的类文件,则停止搜索,否则继续搜索后面的路径。如果在所有路径中都找不到所需的类文件,就会出现编译或运行错误。

可以将搜索路径添加到CLASSPATH变量中,例如;%JAVA_HOME%lib;C:javalib,那么就可以将class文件放在C:javalib目录下,Java运行环境也会找到它。

对于用户编写的类,可以通过IDE指定编译后的类文件的输出目录,appclassloader会加载指定目录下的类。

以下是导入两个访问权限的类的示例:

com.javase.Java 中的包类。一个包裹; com.javase.Java 中的公共类全局访问{}包类。一个包裹; class包访问权限{}package class in com.javase.Java;//import可以导入基本包和公共类。需要使用类名的完整路径 // 导入包.*时,不会导入子包的类。这可以避免导入错误。 //注意 //Java 中导入 com.javase.Class。一个包裹。包访问权限; //这个import会报错,因为这个类没有用public修改,无法用import导入。在 Java 中导入 com.javase.Class。一个包裹。全球访问; //可以导入。

最后,我是一名从事开发多年的老JAVA程序员。今年年初,我花了一个月的时间整理了一份2019年最适合学习的Java学习技巧清单,送给每一个喜欢Java的人。如果你想获取,可以关注我的头条号,后台私信我:交流一下,即可免费获取。

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

26阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

26阅读