Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于Java主类结构 #20

Open
raocaijia opened this issue Sep 21, 2016 · 2 comments
Open

关于Java主类结构 #20

raocaijia opened this issue Sep 21, 2016 · 2 comments

Comments

@raocaijia
Copy link

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

@wenuanhappy
Copy link

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

@rapidhere
Copy link

public class

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

interface

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

  • 类通常描述一个实体,而接口描述一种协议
  • java不允许类多重继承,但是一个类可以实现多个接口;这很好理解,你只能有一个爹,但是可以拿很多证书
  • 接口成员必须是静态成员,其成员变量自动隐含public static final
  • 接口的方法必须是抽象的而且是非静态的,但在java1.8后,你可以为接口方法定义默认实现,也可以为接口定义静态方法
  • 接口中不能含有static语句块
  • jvm规范中,加载时期类和接口的策略有轻微区别——对于类,加载类前会先加载父类,而对于接口不会加载其父接口,只会在真正需要父接口的时候才会触发加载

其他和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也是非法的。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants