关于Java类和包的那些事

*.java

一个*.java源文件中是否可以包含多个类?有什么限制

    可以有多个类,但是只能有一个public的类,并且public的类名必须和文件名一致。 一个文件中可以只有非public类,如果只有一个非public类,此类可以和文件名不同

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

    编译器在编译时,针对一个java源文件(编译单元)只会接受一个public类,否则报错

在java文件中是否可以没有public类

    public类不是必须的,java文件中可以没有public类。

为什么这个public的类的类名必须与文件名相同

    是为了方便虚拟机在响应的路径中找到响应的类所对应的字节码文件

main

主函数: 一个特殊的函数,作为程序的入口,可以被JVM调用
主函数的定义 public:代表着该函数的访问权限是最大的 static:代表主函数随着类的加载就已经存在了 void:主函数没有具体的返回值 main:不是关键字,但是是一个特殊的单词,能够被JVM识别 (String[] args): 函数的参数,参数类型是一个数组,该数组中的元素师字符串,字符串数组。main(String[] args) 字符串数组的 此时空数组的长度是0,但也可以在 运行的时候向其中传入参数。
主函数是固定格式的,JVM识别
主函数可以被重载,但是JVM只识别main(String[] args),其他的都是作为一般函数

一个java文件中可以包含多个类,每个类中有且仅有一个主函数,但是每个java文件中可以包含多个主函数,在运行时,需要指定JVM入口是哪个。例如一个类的主函数可以调用另一个类的主函数。不一定会使用public类的主函数

外部类的访问权限

外部类只能被public和default修饰

为什么要对外部类或者类做修饰呢?

    存在包概念:public和default能够区分这个外部类能对不同包作一个划分(default修饰的类,其他包引入不了这个类,public修饰的类才能被import) protected是包内可见并且子类可以见,但是当一个外部类想要继承一个protected修饰的非同包类时,压根找不到这个类,更别提几层了 private修饰的外部类,其他任何外部类都无法导入它。

Java包的命名规则

import的使用

    如果你希望使用Java包中的类,就必须先使用import语句导入 import 只能导入包所包含的类,而不能导入包。 Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*😉,其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。

java类的搜索路径

    java程序运行时要导入相应的类,也就是加载.class文件的过程。

安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVA_HOME%/lib,而 JAVA_HOME 又为 D:Program Filesjdk1.7.0_71,所以 CLASSPATH 等价于 .;D:Program Filesjdk1.7.0_71/lib。

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

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

用户自己写的类可以通过IDE指定编译后的class文件的输出目录,appclassloader会到指定目录进行类的加载

经验分享 程序员 微信小程序 职场和发展