在
Java的编写过程中我们需要对一些程序进行注释,除了自己方便阅读,更为别人更好理解自己的程序,所以我们需要进行一些注释,可以是编程思路或者是程序的作用,总而言之就是方便自己他人更好的阅读。
主要种类
对于Java注释我们主要了解三种:
1, // 注释一行
2, /* ...... */ 注释若干行
3, /**……*/文档注释
说明
/** ...... */ 注释若干行,并写入 javadoc文档通常这种注释的多行写法如下:
/**
* .........
* .........
*/
javadoc提取注释的工具/**注释内容*/ (其余两种和C++注释一样).
注:注释内容即不会被编译的内容,只是解释说明
注释例子
import java.awt.*; //调用awt包
import java.applet.*;
import java.awt.Color; //调用awt中的Color类
public class extends Applet implements Runnable {
Image buffer;// 定义图像对象
Graphics gContext;// 定义
图形上下文Thread animate;// 定义一个线程
int w, h, x, y, size = 12; // 定义整形变量并赋值
/**
*
* @see java.applet.Applet
* @return 无
*/
public void init() {
w = getWidth();// 返回组件的当前宽度。
h = getHeight();// 返回组件的当前高度。
buffer = createImage(w, h);// 创建一个宽W高H的图形区域。 (创建一幅用于
双缓冲的、可在屏幕外绘制的图像)
gContext = buffer.getGraphics();// 获得图像使用的
图形上下文gContext.setColor(Color.blue);// 设置图形上下文的当前颜色为蓝色
}
/**
* Thread 线程启动操作
*/
public void start() {
// 开始animate线程
if (animate == null) {
animate = new Thread(this);
animate.start();
}
}
/**
* Thread 线程终止时的处理操作 以释放资源
*/
public void stop() {
// 结束animate线程
if (animate != null)
animate = null;
}
/**
* Runnable接口的实现
* 执行所需的操作
*/
public void run() {
while (true) {
//X,Y的坐标设定
x = (w - s.length() * size) / 2;
y = (h + size) / 2;
gContext.drawString(s, x, y);//绘制一串
字符s内容的文本
repaint();//重画图形
try {
animate.sleep(50);//线程休眠50ms
} catch (InterruptedException e) {// 捕获异常
}
gContext.clearRect(0, 0, w, h);//通过使用当前绘图表面的背景色进行填充来清除指定的矩形.0 - 要清除矩形的x 坐标。0 - 要清除矩形的 y 坐标。w - 要清除矩形的宽度。h - 要清除矩形的高度。
if (++size > 40)
size = 12;
}
}
/**
* Applet画图操作方法
*
* @see java.applet.Applet
*/
public void paint(Graphics g) {
g.drawImage(buffer, 0, 0, this);//绘制指定的buffer的图像
}
/**
* Applet刷新操作,重新绘制图形
*
* @see java.applet.Applet
*/
public void update(Graphics g) {
paint(g);//重新调用paint函数绘制图形
}
}
作用
通过注释提高Java
源程序代码的可读性;使得Java程序条理清晰,易于区分代码行与注释行。另外通常在程序开头加入作者,时间,版本,要实现的功能等内容注释,方便后来的维护以及程序员的交流。
速算游戏
规则如下
1、点击“开始游戏”按钮,游戏开始,系统会发出四张牌
2、并把组合的
表达式(四张牌的四则混合运算表达式)输入到输入框里(最终结果=24)
3、点击“确定”按钮,游戏将会计算你输入的表达式是否正确,并且给出提示
4、如果输入的表达式不正确,则会让用户重新输入,如果输入的表达式正确,则重新开始游戏
猜数字
模块注释
1、源文件注释
源文件注释采用 /** …… */,在每个源文件的头部要有必要的注释信息,包括:文件名;文件编号;版本号;作者;创建时间;文件描述包括本文件历史修改记录等。中文注释模版:
/**
* 文 件 名 :
* CopyRright
* 文件编号:
* 创 建 人:
* 日 期:
* 修 改 人:
* 日 期:
* 描 述:
* 版 本 号:
*/
类(模块)注释:
类(模块)注释采用 /** …… */,在每个类(模块)的头部要有必要的注释信息,包括:工程名;类(模块)编号;命名空间;类可以运行的JDK版本;版本号;作者;创建时间;类(模块)功能描述(如功能、主要算法、内部各部分之间的关系、该类与其类的关系等,必要时还要有一些如特别的软硬件要求等说明);主要函数或过程清单及本类(模块)历史修改记录等。
英文注释模版:
/**
* CopyRright
* Project:
* Module ID:
* Comments:
* JDK version used:
* Namespace:
* Author:
* Create Date:
* Modified By:
* Modified Date:
* Why & What is modified
* Version:
java注解
Annotation(注解)是JDK5.0及以后版本引入的。它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查。注解是以‘@注解名’在代码中存在的,根据注解参数的个数,我们可以将注解分为:标记注解、单值注解、完整注解三类。它们都不会直接影响到程序的语义,只是作为注解(标识)存在,我们可以通过
反射机制编程实现对这些元数据的访问。另外,你可以在编译时选择代码里的注解是否只存在于源代码级,或者它也能在class文件中出现。
元数据的作用
如果要对于元数据的作用进行分类,大致可分为三类:
编写文档:通过代码里标识的元数据生成文档。
代码分析:通过代码里标识的元数据对代码进行分析。
编译检查:通过代码里标识的元数据让编译器能实现基本的编译检查
内置注解
@Override
Java代码
packagecom.iwtxokhtd.annotation;
/**
* 测试Override注解
*@authorAdministrator
*
*/
publicclassOverrideDemoTest {
//@Override
publicString tostring(){
return
}
}
@Deprecated的作用是对不应该在使用的方法添加注解,当编程人员使用这些方法时,将会在编译时显示提示信息,它与javadoc里的@deprecated标记有相同的功能,准确的说,它还不如javadoc @deprecated,因为它不支持参数,使用@Deprecated的示例代码示例如下:
Java代码
packagecom.iwtxokhtd.annotation;
/**
* 测试Deprecated注解
*@authorAdministrator
*
*/
publicclassDeprecatedDemoTest {
publicstaticvoidmain(String[] args) {
//使用DeprecatedClass里声明被过时的方法
DeprecatedClass.DeprecatedMethod();
}
}
classDeprecatedClass{
@Deprecated
publicstaticvoidDeprecatedMethod() {
}
}
@SuppressWarnings,其参数有:
deprecation,使用了过时的类或方法时的警告
unchecked,执行了未检查的转换时的警告
fallthrough,当 Switch 程序块直接通往下一种情况而没有 Break 时的警告
path,在类路径、
源文件路径等中有不存在的路径时的警告
serial,当在可序列化的类上缺少serialVersionUID 定义时的警告
finally ,任何 finally 子句不能正常完成时的警告
all,关于以上所有情况的警告
Java代码
packagecom.iwtxokhtd.annotation;
importjava.util.ArrayList;
importjava.util.List;
publicclassSuppressWarningsDemoTest {
publicstaticListlist=newArrayList();
publicvoidadd(String data){
list.add(data);
自定义
它类似于新创建一个接口类文件,但为了区分,我们需要将它声明为@interface,如下例:
Java代码
packagecom.iwtxokhtd.annotation;
public@interfaceNewAnnotation {
}
使用自定义的注解类型
Java代码
packagecom.iwtxokhtd.annotation;
publicclassAnnotationTest {
@NewAnnotation
publicstaticvoidmain(String[] args) {
}
}
为自定义注解添加变量
Java代码
packagecom.iwtxokhtd.annotation;
public@interfaceAnnotation {
String value();
}
Java代码
publicclassAnnotationTest {
publicstaticvoidmain(String[] args) {
saying();
}
publicstaticvoidsaying() {
}
}
定义一个枚举类型,然后将参数设置为该枚举类型,并赋予默认值
public@interfaceGreeting {
publicenum
FontColor {
BLUE,RED,GREEN
};
String name();
FontColor fontColor()defaultFontColor.RED;
}
这里有两种选择,其实变数也就是在赋予默认值的参数上,我们可以选择使用该默认值,也可以重新设置一个值来替换默认值
Java代码
publicclassAnnotationTest {
publicstaticvoidmain(String[] args) {
saying();
sayHelloWithDefaultFontColor();
sayHelloWithRedFontColor();
}
publicstaticvoidsaying() {
}
// 此时的fontColor为默认的RED
publicstaticvoidsayHelloWithDefaultFontColor() {
}
BLUE)
publicstaticvoidsayHelloWithRedFontColor() {
}
高级应用
1.1. 限制注解的使用范围
用@Target指定ElementType属性
Java代码(jdk)
packagejava.lang.annotation;
public enum ElementType {
TYPE,
// 用于类,接口,枚举但不能是注解
FIELD,
METHOD,
PARAMETER,
// 方法的参数
CONSTRUCTOR,
//构造方法
LOCAL_VARIABLE,
// 本地变量或catch语句
ANNOTATION_TYPE,
// 注解类型(无数据)
PACKAGE
// Java包
}
1.2. 注解保持性策略
Java代码
//限制注解使用范围
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR})
public @interface Greeting {
//使用枚举类型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
在Java
编译器编译时,它会识别在源代码里添加的注解是否还会保留,这就是RetentionPolicy。下面是Java定义的RetentionPolicy枚举:
编译器的处理有三种策略:
将注解保留在编译后的类文件中,并在第一次加载类时读取它
将注解保留在编译后的类文件中,但是在运行时忽略它
按照规定使用注解,但是并不将它保留到编译后的类文件中
Java代码
packagejava.lang.annotation;
public enum RetentionPolicy{
SOURCE,
CLASS,
// 此类型注解会保留在class文件中,但JVM会忽略它
RUNTIME
// 此类型注解会保留在class文件中,JVM会读取它
}
Java代码
//让保持性策略为运行时态,即将注解编码到class文件中,让
虚拟机读取
@Retention(RetentionPolicy.RUNTIME)
public @interface Greeting {
//使用枚举类型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.3. 文档化功能
Java提供的Documented元注解跟Javadoc的作用是差不多的,其实它存在的好处是开发人员可以定制Javadoc不支持的文档属性,并在开发中应用。它的使用跟前两个也是一样的,简单代码示例如下:
Java代码
//让它定制文档化功能
//使用此注解时必须设置RetentionPolicy为RUNTIME
@Documented
public @interface Greeting {
//使用枚举类型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
1.4. 标注继承
Java代码
//让它允许继承,可作用到子类
@Inherited
public @interface Greeting {
//使用枚举类型
public enum FontColor{
BLUE,RED,GREEN
};
String name();
FontColor fontColor() defaultFontColor.RED;
}
2. 读取注解信息
属于重点,在系统中用到注解权限时非常有用,可以精确控制权限的粒度
注意:要想使用反射去读取注解,必须将Retention的值选为Runtime
Java代码
packagecom.iwtxokhtd.annotation;
importjava.lang.annotation.Annotation;
importjava.lang.reflect.Method;
//读取注解信息
publicclassReadAnnotationInfoTest {
publicstaticvoidmain(String[] args)throws Exception {
// 测试AnnotationTest类,得到此类的类对象
Class c = Class.forName
// 获取该类所有声明的方法
Method[] methods =c.getDeclaredMethods();
// 声明注解集合
Annotation[] annotations;
// 遍历所有的方法得到各方法上面的注解信息
for(Method method : methods) {
// 获取每个方法上面所声明的所有注解信息
annotations =method.getDeclaredAnnotations();
// 再遍历所有的注解,打印其基本信息
System.out.println(method.getName());
for(Annotation an :annotations) {
System.out
+an.annotationType().getSimpleName());
Method[] meths =an.annotationType().getDeclaredMethods();
// 遍历每个注解的所有变量
for(Method meth :meths) {
System.out
注解注释
注释有三种:// /* */ /** */ 前两种编译器直接跳过,从来不阅读,第三种编译器是可以看懂的,当你使用javadoc这样的命令时会用到,用来生成API时用的。
注解:这东东完全就是给编译器看的。 比如@Ovrride表示这个方法是重写了父类中的方法,而不是自定义的,所以这个时候编译器会去检查你的方法名是否和父类一样,是否写错了。
以上是不同的概念