java-a / syllabus

课程材料、讨论区
10 stars 1 forks source link

关于Java主类结构 #20

Open raocaijia opened 8 years ago

raocaijia commented 8 years ago

在微课Java语法基础3中有一个部分,就是关于Java主类结构的,其中讲到有以下几种: package import public class Definition interface Definition 这些没太看懂,老师今天也没有讲到,故来求教

wenuanhappy commented 8 years ago

第3部分还早呢,课堂上还会介绍的。现在还都只在一个类里面,实际上一个java文件中可以定义多个类。留待下回分解。

rapidhere commented 8 years ago

public class

通常来说,一个java文件定义一个java类,这个java类必须和java文件有相同的名字,同时类可见性被声明为public,这是最基本的java代码的组织方式。

interface

可以认为接口(interface)是特殊的类,在javac编译后,interfaceclass一样会产生一个class文件。接口的概念在学习了抽象类后才能搞得比较清楚,这里列举接口和类的区别作为了解:

其他和class地位相同的java结构还有enumannotation

package

以文件方式组织的java代码是平面的,没有层次结构。为了解决这个问题程序员们考虑把关联性比较强的一些java文件放在一个目录下,利用操作系统的文件系统为java代码提供了一个树状的结构,对应到java上,一个java文件所在的目录就被称为一个包(package)。

在java文件的开头使用语句package a.b.c;就是声明这个java文件下的类属于a.b.c这个包,同时也意味着这个java文件位于操作系统上的某个a/b/c目录,这是个相对路径,java会在CLASS_PATH配置下的每个目录去匹配对应的包和类。

引入了包后,java类的名字实际上得到了扩展,比如a.b.c.ClassAa.b.d.ClassA会被认为是两个类。

import

以包的方式组织java代码隐含地为java语言引入了另外一种可见性:包可见性。位于不同包的java类和接口默认是不可见的,import的作用就是引进一个包下的某些内容,使得引入的内容在当前java文件可见。

比如位于package a.b.c的类ClassA需要位于package d.eClassB,那么就需要在ClassA.java中写明import d.e.ClassB;,这样在ClassA.java中ClassB就变成了可见的。

import语句的作用其实只在编译时有用,只是引导编译器去相应包下查找class定义的一种声明,jvm字节码中并没有对应的import指令,所以在java中不能运行时import,import语句必须在类外写明。

非public class

前面老师也提到了,一个java文件可以包含多个java class和interface。但是要注意,在一个文件中只有一个class或者interface(互斥)能被声明为public,并且必须和java文件同名。

非public class实际具有包可见性,在编译的时候也会产生单独的class文件,但是不能被包外的java文件import。非public class编译后的class文件会有特殊的可见性标识,使得应用程序在运行时通过类加载器动态加载不属于自己包的非public class也是非法的。