##################################################
搞清源文件与类
——————————
声明与定义
在说类之前 先搞明白声明是什么 定义又是什么?
以 C 语言来举例说明
声明/declaration 和 定义/definition 是两个容易混淆的概念
声明只是给 变量、函数、结构体、联合体 命名
表明程序有该 变量、函数、结构体、联合体定义是具体给变量分配存储空间、给出函数的具体实现、指明结构体和联合体成员
如果程序中仅仅有声明,缺少定义实现
最终无法生成可执行的程序,因为信息不完整,无法完成编译全过程。
声明可以出现多次 而定义有且只能出现一次
定义必须有,且只能出现一次
声明和定义可以同时出现
抽象图:
声明函数类型以及标识符 (参数数量类型) {
/* 定义就是具体的实现 */
}
——————————
声明一个公开类
%%%%%
死记:
一个 Java 源文件中只能有一个 public 修饰类且 Java 源文件中若只有一个类则源文件名必须与该类名一致
%%%%%
首先我们这个程序文件
main.java
是一个文件
第一句:
public class main { }
字面翻译一下:
公开的 类 自定义类名 { 代码块 }
很显然 就是说我定义了一个公开的 main 类
我们在这个文件中声明了一个 main类:
如何声明的?语法格式是:
类型修饰符 关键字 类名 { }
现在 我们这样说:
文件 main.java 中
有一个 main 类
一般来说 都是这种情况 一个文件一个类
而且类名绝对不能随便命名 要见名知意
%%%%%
Java 中的所有程序代码都必须存在于一个类中
用 class 关键字定义类
在 class 前面可以有一些修饰符
格式如下:
修饰符 class 类名 {
/* 程序代码 */
}
——————————
CentOS 工作目录
[lilian@CentOS ~]$ mkdir javaTest /* 建立目录 javaTest */
[lilian@CentOS ~]$ cd javaTest/ /* 进入工作目录 */
[lilian@CentOS javaTest]$ pwd /* 查看当前路径 */
/home/lilian/javaTest
[lilian@CentOS javaTest]$ ls /* 查看目录内容 */
[lilian@CentOS javaTest]$ touch main.java /* 创建 main.java 空文件 */
[lilian@CentOS javaTest]$ ls /* 再次查看目录内容 */
main.java
[lilian@CentOS javaTest]$
创建了源文件 main.java
——————————
类的三个问题
根据上面死记的准则:
一个 Java 源文件中可以定义多个类
同一个源文件中定义的类最多只能有一个类可以被 public 关键字修饰
若源文件中有被 public 修饰所修饰的类那么源文件名必须与 public 所修饰的类同名
可以提出以下问题:
源文件中如果没有 public 所修饰的类,源文件该如何命名?
一个源文件中如果定义了多个类,编译之后会形成几个 .class 字节码文件?
main() 这个主方法必须定义在 public 类当中吗?
%%%%%
源文件中如果没有 public 所修饰的类,源文件该如何命名?
如果源文件中没有任何一个类被 public 关键字所修饰
那么我们可以用任意名称来命名这个源文件
只要源文件的名称符合命名规范就可以了!
%%%%%
一个源文件中如果定义了多个类,编译之后会形成几个 .class 字节码文件?
源文件与编译后的字节码文件的名称和数量其实没有一一对应关系
字节码文件的名称和数量其实是由源文件中类的名称和数量决定的
main.java code:
public class main {
/* 空类 */
}
class first {
public static void main ( String[] args ) {
System.out.println ( "你好,世界!" );
}
}
class second {
/* 空类 */
}
编译之后发现产生了三个字节码文件:
且每个 .class 字节码文件的命名与源文件中的每个类名相对应
%%%%%
main() 这个主方法必须定义在 public 类当中吗?
有一种说法,认为主方法必须被定义到 public 类当中才能运行,其实这也是一种讹传
可以试试上面那个例子 主方法并没有被定义到 public 类当中 但是我们照样能通过相应的命令执行这个主方法:
[lilian@CentOS javaTest]$ ls
first.class main.class main.java second.class
[lilian@CentOS javaTest]$ java first
你好,世界!
[lilian@CentOS javaTest]$
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)