微信公众号【程序员江湖】java
做者黄小斜,斜杠青年,某985硕士,阿里研发工程师,于2018 年秋招拿到 BAT 头条、网易、滴滴等 8 个大厂 offer程序员
我的擅长领域 :自学编程、技术校园招聘、软件工程考研(关注公众号后回复”资料“便可领取 3T 免费技术学习资源)编程
问题:一个".java"源文件中是否能够包括多个类(不是内部类)?有什么限制?数组
答案:能够有多个类,但只能有一个public的类,而且public的类名必须与文件名相一致。一个文件中能够只有非public类,若是只有一个非public类,此类能够跟文件名不一样。
为何一个java源文件中只能有一个public类?微信
在java编程思想(第四版)一书中有这样3段话(6.4 类的访问权限):app
1.每一个编译单元(文件)都只能有一个public类,这表示,每一个编译单元都有单一的公共接口,用public类来表现。该接口能够按要求包含众多的支持包访问权限的类。若是在某个编译单元内有一个以上的public类,编译器就会给出错误信息。2.public类的名称必须彻底与含有该编译单元的文件名相同,包含大小写。若是不匹配,一样将获得编译错误。函数
3.虽然不是很经常使用,但编译单元内彻底不带public类也是可能的。在这种状况下,能够随意对文件命名。学习
总结相关的几个问题:优化
一、一个”.java”源文件中是否能够包括多个类(不是内部类)?有什么限制?spa
答:能够有多个类,但只能有一个public的类,而且public的类名必须与文件名相一致。
二、为何一个文件中只能有一个public的类
答:编译器在编译时,针对一个java源代码文件(也称为“编译单元”)只会接受一个public类。不然报错。
三、在java文件中是否能够没有public类
答:public类不是必须的,java文件中能够没有public类。
四、为何这个public的类的类名必须和文件名相同
答: 是为了方便虚拟机在相应的路径中找到相应的类所对应的字节码文件。
主函数:是一个特殊的函数,做为程序的入口,能够被JVM调用
主函数的定义:
public:表明着该函数访问权限是最大的static:表明主函数随着类的加载就已经存在了
void:主函数没有具体的返回值
main:不是关键字,可是一个特殊的单词,可以被JVM识别
(String[] args):函数的参数,参数类型是一个数组,该数组中的元素师字符串,字符串数组。main(String[] args) 字符串数组的 此时空数组的长度是0,但也能够在 运行的时候向其中传入参数。
主函数时固定格式的,JVM识别
主函数能够被重载,可是JVM只识别main(String[] args),其余都是做为通常函数。这里面的args知识数组变量能够更改,其余都不能更改。
一个java文件中能够包含不少个类,每一个类中有且仅有一个主函数,可是每一个java文件中能够包含多个主函数,在运行时,须要指定JVM入口是哪一个。例如一个类的主函数能够调用另外一个类的主函数。不必定会使用public类的主函数。
外部类只能用public和default修饰。
为何要对外部类或类作修饰呢?
1.存在包概念:public 和 default 能区分这个外部类能对不一样包做一个划分 (default修饰的类,其余包中引入不了这个类,public修饰的类才能被import)2.protected是包内可见而且子类可见,可是当一个外部类想要继承一个protected修饰的非同包类时,压根找不到这个类,更别提几层了
3.private修饰的外部类,其余任何外部类都没法导入它。
//Java中的文件名要和public修饰的类名相同,不然会报错
//若是没有public修饰的类,则文件能够随意命名
public class Java中的类文件 {
}
//非公共开类的访问权限默认是包访问权限,不能用private和protected
//一个外部类的访问权限只有两种,一种是包内可见,一种是包外可见。
//若是用private修饰,其余类根本没法看到这个类,也就没有意义了。
//若是用protected,虽然也是包内可见,可是若是有子类想要继承该类可是不一样包时,
//压根找不到这个类,也不可能继承它了,因此干脆用default代替。
class A{
}
以 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 import以及Java类的搜索路径 若是你但愿使用Java包中的类,就必须先使用import语句导入 语法为:
import package1[.package2…].classname;
package 为包名,classname 为类名。例如:
import java.util.Date; // 导入 java.util 包下的 Date 类
import java.util.Scanner; // 导入 java.util 包下的 Scanner 类
import javax.swing.*; // 导入 javax.swing 包下的全部类,* 表示全部类
</pre>
注意:
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 语句:
import p1.Test;
该语句代表要导入 p1 包中的 Test 类。 安装JDK时,咱们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为 .;%JAVAHOME%lib,而 JAVAHOME 又为 D:Program Filesjdk1.7.071,因此 CLASSPATH 等价于 .;D:Program Filesjdk1.7.071lib。若是在第一个路径下找到了所需的类文件,则中止搜索,不然继续搜索后面的路径,若是在全部的路径下都未能找到所需的类文件,则编译或运行出错。
你能够在CLASSPATH变量中增长搜索路径,例如 .;%JAVA_HOME%lib;C:javalib,那么你就能够将类文件放在 C:javalib 目录下,Java运行环境同样会找到。
用户本身写的类能够经过IDE指定编译后的class文件的输出目录,appclassloader会到指定目录进行类的加载
下面是一个import两种访问权限的类的实例:
package com.javase.Java中的类.一个包;
public class 全局访问 {
}
package com.javase.Java中的类.一个包;
class 包访问权限 {
}
package com.javase.Java中的类;
//import能够导入基础包以及公开的类,须要使用类名的全路径
//而且在导入某个包.*时,是不会把子包的类给导进来的,这样能够避免导入错误。
//注意
//import com.javase.Java中的类.一个包.包访问权限;
//这个导入会报错,由于这个类没有用public修饰,没法用import导入。
import com.javase.Java中的类.一个包.全局访问;//能够导入。