源文件结构

java源文件可能包含以下内容:

  • 包声明语句
  • 包引入语句
  • 类声明
  • 接口声明

这些内容都不是必须的。此外要注意只能有一个类或接口是public的(一般也是private)。

包声明语句

包声明语句把类放到特定的包中。例如

package com.abc.dollapp;
public calss appmain{...};
class doll{...};

在这个例子中appmain和doll都在com.abc.dollapp包中。

在一个java文件中,只能有一个package语句。如果没有提供package,那么就表明在系统默认的包中。

包的作用
  1. 用于区分名字相同的类。例如定义了两中车类名都叫car,一种实际上是奔驰,一种是宝马。把他们丢在不同的包中就可以区分他们,相当于使用了不同的命名空间1

1:命名空间实际上就是在函数前的一些附加消息。因为可能同时引入了多个库,库文件中可能某些函数名字相同,这个时候只有通过前面添加一些信息来辨别。典型例子就是using namespace std;这个含义就是使用标准命名空间。不然就要写std::cout来进行辨别。

  1. 有助于访问权限的控制。但不同包之间进行访问时,就会受到访问权限的控制。
  2. 有助于组织划分各个类。
包的命名规范

包的名字通常用小写,一般包含以下信息:

  1. 类的创建者信息
  2. 类所属软件信息
  3. 类在具体项目中所处的位置

jdk提供了一些基本包

  • java.lang包,包含线程类(Thread),异常类(Exception),系统类(System),整数类(Integer),字符串类(String)等。这个包系统会自动引入。
  • java.awt。抽象窗口工具包。用于构建GUI界面和绘图类
  • java.io 输入输出包。例如文件输入类(FileInputStream类)
  • java.util 实用类,例如日期类(Date)集合类(Collection)
  • java.net 支持TCP/IP网络协议。
包引入

如果一个类访问了另一个包的类,那么一定要引入这个类(就像c++中的库引入一样)。

语法: import 包名.类名

如果想引入一个包中所有类, 可以 import 包名.*

要注意最好使用第一种语法,因为第二种不仅耗时大并且还可能带来类名重复的问题,这个时候每写一个类都要写它的包名。

并且如果包中还有包的话,第二种语法是不会把内层包的类引入的。之所以可以包中有包是为了保证层次结构。例如前面提到的com.abc其实就是包中有包,com是外层,abc是内层。

package语句必须在import前

方法(函数)声明

返回值 函数名(参数)
{
主体
}

这里的函数和c++大致相同

main方法

main方法和c++不一样了,要包含几个要素

  • 访问限制 public
  • 静态方法 static
  • 参数 main(String args[])
  • 返回类型 void

所以合起来就是 static public void main(String args[])

给main传递参数

格式: java classname [args…]

classname指的是类名

例如: java com.abc.dollapp.main.MainApp parameter0 parameter1

也就是c++中的argc,argv

注释

第一种 //

第二种 /*...*/

第三种 /**...*/,当这种注释出现在类的声明时,会作为javadoc的内容

标识符和关键字

关键字之后慢慢就会知道

标识符命名规则:

  • 首字母必须是字母,下划线(_),符号¥或符号$。
  • 除开首字母其他字符可以用数字
  • 没有长度限制

用jdk管理java应用

java常用目录(防止以后看到这些目录都不知道是干什么的)

src 存放源文件
classes 存放编译生成的java文件
lib 存放第三方java软件的JAR文件(不要问我这是什么)
doc 存放帮助文档
doc\api 存放javadoc文档
deploy 存放打包文件,jar文件

使用javadoc文档

java中有一个程序,可以识别类中的注释并将其转化成html文件。只有满足规范的文件才可以转化。

首先的规范就是注释要/**...*/才可以。里面可以有普通文件,html标记和javadoc标记。

范围:javadoc命令只处理类声明,接口声明,成员方法声明,成员变量声明,以及构造方法之前声明的注释。也就是说要在函数或类等的外面去声明。

javadoc标记

标记 说明
@version 版本
@since 指定最早出现在哪个版本
@author 作者
@see 生成参考其他javadoc的链接
@link 生成链接,但是还可以添加其他的话
@deprecated 表示某些类或方法不提倡使用,之后可能会被废弃
@param 描述方法参数
@return 返回值
@throws 描述方法抛出的异常,指出抛出异常的条件

@see用于生成到其他文档的链接。例如@see #setWord生成到setWord的链接。一共有三种格式

  • set com.abc.dollapp.doll 生成到其他类的javadoc文档
  • set #setWord 生成当前类不同方法的javadoc文档
  • set com.abc.dollapp.doll#speak 生成到其他类的某一个方法的javadoc文档

至于link在语法上与set大致相同,但是他可以用大括号插入到某一句话中,例如

/**
* 如果{@link #word word成员变量}不为NULL;
*/

输出: 如果word成员变量不为NULL;

javadoc命令用法:

-public 仅为public级别的类建立文档
-protected 进位publicprotected建立文档 默认选项
-package
-private
-version 解析version标记,默认情况会忽略
-author
-sourcepath<path> 指定源文件路径
-classpath
-d <directory> 指定javadoc的输出目录

语法: javadoc [options] [packagenames] [sourcefiles]

java虚拟机运行java的基本原理

过程:先进行编译,之后进入虚拟机中变成机器指令。具体过程就不解释了,但是这里有一步就是根据操作系统进行运行。而java程序使运行在虚拟机上的。所以编译出来的文件可以在任何平台上运行。

系统会先给虚拟机分配一个空间。虚拟机又会把这个空间分成若干个部分。主要包括堆区,栈区,方法区等等。堆中存放对象,方法区中存放类的类型信息,方法信息和静态变量等等。

运行程序时,先要把程序的二进制加载到内存,然后对程序进行验证(包括初始化),之后再执行。

当生成一个实例时,虚拟机会先搜索方法区,如果方法区没有,那么就会先加载这个类。之后在堆区分配一片内存用来存放实例,实例有一个指向方法区的指针。这个实例用一个局部指针指向它(也就是实例名,和数组很像,不是说java不提供指针吗)。

所以运行一个java方法的过程是:先由类名到堆区,然后堆指向方法区的指针把对应的方法取出来(机器指令)。