java初探
源文件结构
java源文件可能包含以下内容:
- 包声明语句
- 包引入语句
- 类声明
- 接口声明
这些内容都不是必须的。此外要注意只能有一个类或接口是public的(一般也是private)。
包声明语句
包声明语句把类放到特定的包中。例如package com.abc.dollapp;
public calss appmain ;
class doll ;
在这个例子中appmain和doll都在com.abc.dollapp包中。
在一个java文件中,只能有一个package语句。如果没有提供package,那么就表明在系统默认的包中。
包的作用
- 用于区分名字相同的类。例如定义了两中车类名都叫car,一种实际上是奔驰,一种是宝马。把他们丢在不同的包中就可以区分他们,相当于使用了不同的命名空间1。
1:命名空间实际上就是在函数前的一些附加消息。因为可能同时引入了多个库,库文件中可能某些函数名字相同,这个时候只有通过前面添加一些信息来辨别。典型例子就是using namespace std;这个含义就是使用标准命名空间。不然就要写std::cout来进行辨别。
- 有助于访问权限的控制。但不同包之间进行访问时,就会受到访问权限的控制。
- 有助于组织划分各个类。
包的命名规范
包的名字通常用小写,一般包含以下信息:
- 类的创建者信息
- 类所属软件信息
- 类在具体项目中所处的位置
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级别的类建立文档 |
语法: javadoc [options] [packagenames] [sourcefiles]
java虚拟机运行java的基本原理
过程:先进行编译,之后进入虚拟机中变成机器指令。具体过程就不解释了,但是这里有一步就是根据操作系统进行运行。而java程序使运行在虚拟机上的。所以编译出来的文件可以在任何平台上运行。
系统会先给虚拟机分配一个空间。虚拟机又会把这个空间分成若干个部分。主要包括堆区,栈区,方法区等等。堆中存放对象,方法区中存放类的类型信息,方法信息和静态变量等等。
运行程序时,先要把程序的二进制加载到内存,然后对程序进行验证(包括初始化),之后再执行。
当生成一个实例时,虚拟机会先搜索方法区,如果方法区没有,那么就会先加载这个类。之后在堆区分配一片内存用来存放实例,实例有一个指向方法区的指针。这个实例用一个局部指针指向它(也就是实例名,和数组很像,不是说java不提供指针吗)。
所以运行一个java方法的过程是:先由类名到堆区,然后堆指向方法区的指针把对应的方法取出来(机器指令)。