??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.1 Z么要有编码规?Why Have Code Conventions) ~码规范对于E序员而言ؓ重要Q有以下几个原因Q?/p>
- 一个Y件的生命周期中,80%的花费在于维?br />
- 几乎没有M一个YӞ在其整个生命周期中,均由最初的开发h员来l护 Z执行规范Q每个Y件开发h员必M致遵守编码规范。每个h?/p>
本文档反映的是Sun MicroSystems公司QJava语言规范中的~码标准部分。主要A献者包括:Peter KingQPatrick NaughtonQMike DeMoneyQJonni KanervaQKathy Walrath以及Scott Hommel?/p>
本文档现由Scott Hommell护Q有兌论意见请发至shommel@eng.sun.com q部分列Z常用的文件名及其后缀?/p>
JavaE序使用下列文g后缀Q?/p>
{
//关于素数计算.采用for循环
int calPrimeNumber(int i)
{
for(int j = 2; j <= (i/2 +1); j++)
{
if(i % j == 0)
{
return -1;
}
}
return i;
}
}
import java.io.*;
public class PrimeNumberCal
{
public static void main(String[] args)
{
int primeNumber = 0;
int iNum = 0;
int k = 0;
String primeInRandom = "";
String stringPrimeNumber = " 以上q些是素数";//变量的初始化
Random rand = new Random();
CalPrime calPrime = new CalPrime(); //对象的创?br />
//随机数的产生以及素数计算Ҏ调用
for(int i = 0; i < 100; i++)
{
iNum = rand.nextInt(1000) + 1;
k = calPrime.calPrimeNumber(iNum);
if(k != -1)
{
primeNumber = k;
String str = " " + Integer.toString(primeNumber);//整数{化ؓ字符串型
stringPrimeNumber = str + stringPrimeNumber;//字W串联接
}
}
try//异常捕获
{
//生的素数写入文g
FileWriter primeFile = new FileWriter("c:\\primeInRandom.txt");
primeFile.write(stringPrimeNumber);
primeFile.close();
}
catch(Exception e)
{
System.out.println(e);
}
System.out.println("素数已计出?文g已保存在C盘中.文g名ؓ:primeInRandom.txt");
}
}
]]>
2 {
3 public static void main(String[] args)
4 {
5 double randnum = Math.random();
6 System.out.println("你成功的几率?" + randnum);
7 System.out.println("请问是否l箋?[y/n]:");
8 try
9 {
10 char i =(char)System.in.read();
11 while (i != 'y' && i != 'n' && i != 'Y' && i !='N')
12 {
13 System.out.println("输入有误");
14 System.out.println("请问是否l箋?[y/n]:");
15 try
16 {
17 i = (char)System.in.read();
18 }
19 catch(Exception e)
20 {}
21 }
22
23 if (i == 'y' || i == 'Y')
24 {
25 System.out.print("?");
26 if (Math.random() <= randnum)
27 {
28 System.out.println("success!!");
29 }
30 else
31 {
32 System.out.println("fail!!");
33 }
34 }
35 else
36 {
37 System.out.println("退出吧?/span>");
38 }
39 }
40 catch(Exception e)
41 {};
看thinking in java时想到的一个代?.实现了以前看到的一个小程 序的一个功?.嘿嘿..不过q里面的蛮多要改?....下次?
]]>
1 介绍(Introduction)
- ~码规范可以改善软g的可L,可以让程序员快而彻底地理解新的代码
- 如果你将源码作ؓ产品发布Q就需要确d是否被很好的打包q且清晰无误Q一如你已构建的其它M产品
文gcd
文g后缀
Java源文?/td>
.java
Java字节码文?/td>
.class
常用的文件名包括Q?/p>
文g?/td> | 用?/td> |
GNUmakefile | makefiles的首选文件名。我们采用gnumake来创建(buildQY件?/td> |
README | 概述特定目录下所含内容的文g的首选文件名 |
一个文件由被空行分割而成的段落以及标识每个段落的可选注释共同组成。超q?000行的E序难以阅读Q应该尽量避免?Java源文件范?提供了一个布局合理的JavaE序范例?/p>
3.1 Java源文?Java Source Files)
每个Java源文仉包含一个单一的公q或接口。若U有cd接口与一个公q相关联,可以它们和公共cL入同一个源文g。公q必须是这个文件中的第一个类或接口?/p>
Java源文件还遵@以下规则Q?/p>
- 开头注释(参见"开头注?/font>"Q?br /> - 包和引入语句Q参?包和引入语句"Q?br /> - cd接口声明Q参?cd接口声明"Q?
所有的源文仉应该在开头有一个C语言风格的注释,其中列出cd、版本信息、日期和版权声明Q?/p>
/* * Classname * * Version information * * Date * * Copyright notice */
3.1.2 包和引入语句(Package and Import Statements)
在多数Java源文件中Q第一个非注释行是包语句。在它之后可以跟引入语句。例如:
package java.awt; import java.awt.peer.CanvasPeer;
3.1.3 cd接口声明(Class and Interface Declarations)
下表描述了类和接口声明的各个部分以及它们出现的先后次序。参?Java源文件范?/font>"中一个包含注释的例子?/p>
c?接口声明的各部分 | 注解 | |
1 | c?接口文档注释(/**……*/) | 该注释中所需包含的信息,参见"文档注释" |
2 | cL接口的声?/td> | |
3 | c?接口实现的注?/*……*/)如果有必要的?/td> | 该注释应包含M有关整个cL接口的信息,而这些信息又不适合作ؓc?接口文档注释?/td> |
4 | cȝ(静?变量 | 首先是类的公共变量,随后是保护变量,再后是包一U别的变?没有讉K修饰W,access modifier)Q最后是U有变量?/td> |
5 | 实例变量 | 首先是公q别的Q随后是保护U别的,再后是包一U别?没有讉K修饰W?Q最后是U有U别的?/td> |
6 | 构造器 | |
7 | Ҏ | q些Ҏ应该按功能,而非作用域或讉K权限Q分l。例如,一个私有的cL法可以置于两个公有的实例Ҏ之间。其目的是ؓ了更便于阅读和理解代码?/td> |
4个空格常被作为羃q排版的一个单位。羃q的切解释q未详细指定(I格 vs. 制表W?。一个制表符{于8个空?而非4??/p>
量避免一行的长度过80个字W,因ؓ很多l端和工具不能很好处理之?/p>
注意Q用于文档中的例子应该用更短的行长Q长度一般不过70个字W?/p>
当一个表辑ּ无法容纳在一行内Ӟ可以依据如下一般规则断开之:
- 在一个逗号后面断开
- 在一个操作符前面断开
- 宁可选择较高U别(higher-level)的断开Q而非较低U别(lower-level)的断开
- 新的一行应该与上一行同一U别表达式的开头处寚w
- 如果以上规则D你的代码混ؕ或者你的代码都堆挤在双Q那׃之以~进8个空根{?
以下是断开Ҏ调用的一些例子:
someMethod(longExpression1, longExpression2, longExpression3, longExpression4, longExpression5); var = someMethod1(longExpression1, someMethod2(longExpression2, longExpression3));
以下是两个断开术表达式的例子。前者更好,因ؓ断开处位于括可辑ּ的外边,q是个较高别的断开?/p>
longName1 = longName2 * (longName3 + longName4 - longName5) + 4 * longname6; //PREFFER longName1 = longName2 * (longName3 + longName4 - longName5) + 4 * longname6; //AVOID
以下是两个羃q方法声明的例子。前者是常规情Ş。后者若使用常规的羃q方式将会ɽW二行和W三行移得很靠右Q所以代之以~进8个空?/p>
//CONVENTIONAL INDENTATION someMethod(int anArg, Object anotherArg, String yetAnotherArg, Object andStillAnother) { ... } //INDENT 8 SPACES TO AVOID VERY DEEP INDENTS private static synchronized horkingLongMethodName(int anArg, Object anotherArg, String yetAnotherArg, Object andStillAnother) { ... }
if语句的换行通常使用8个空格的规则Q因为常规羃q?4个空?会语句体看h比较费劲。比如:
//DON’T USE THIS INDENTATION if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { //BAD WRAPS doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS } //USE THIS INDENTATION INSTEAD if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); } //OR USE THIS if ((condition1 && condition2) || (condition3 && condition4) ||!(condition5 && condition6)) { doSomethingAboutIt(); }
q里有三U可行的Ҏ用于处理三元q算表达式:
alpha = (aLongBooleanExpression) ? beta : gamma; alpha = (aLongBooleanExpression) ? beta : gamma; alpha = (aLongBooleanExpression) ? beta : gamma;
JavaE序有两cL释:实现注释(implementation comments)和文档注?document comments)。实现注释是那些在C++中见q的Q?*...*/?/界定的注释。文档注?被称?doc comments")是Java独有的,q由/**...*/界定。文档注释可以通过javadoc工具转换成HTML文g?/p>
实现注释用以注释代码或者实现细节。文档注释从实现自由(implementation-free)的角度描qC码的规范。它可以被那些手头没有源码的开发h员读懂?/p>
注释应被用来l出代码的LQƈ提供代码自n没有提供的附加信息。注释应该仅包含与阅d理解E序有关的信息。例如,相应的包如何被徏立或位于哪个目录下之cȝ信息不应包括在注释中?/p>
在注释里Q对设计决策中重要的或者不是显而易见的地方q行说明是可以的Q但应避免提供代码中己清晰表辑և来的重复信息。多余的的注释很Ҏq时。通常应避免那些代码更新就可能q时的注释?/p>
注意Q频J的注释有时反映Z码的低质量。当你觉得被q要加注释的时候,考虑一下重写代码其更清晰?/p>
注释不应写在用星h其他字符d来的大框里。注释不应包括诸如制表符和回退W之cȝҎ字符?/p>
5.1 实现注释的格?Implementation Comment Formats)
E序可以?U实现注释的风格Q块(block)、单?single-line)、尾?trailing)和行?end-of-line)?/p>
块注释通常用于提供ҎӞҎQ数据结构和法的描q。块注释被置于每个文件的开始处以及每个Ҏ之前。它们也可以被用于其他地方,比如Ҏ内部。在功能和方法内部的块注释应该和它们所描述的代码具有一L~进格式?/p>
块注释之首应该有一个空行,用于把块注释和代码分割开来,比如Q?/p>
/* * Here is a block comment. */
块注释可以以/*-开_q样indent(1)可以将之识别ؓ一个代码块的开始,而不会重排它?/p>
/*- * Here is a block comment with some very special * formatting that I want indent(1) to ignore. * * one * two * three */
注意Q如果你不用indent(1)Q就不必在代码中使用/*-Q或Z人可能对你的代码q行indent(1)作让步?/p>
参见"文档注释"
5.1.2 单行注释(Single-Line Comments)
短注释可以显C在一行内Qƈ与其后的代码h一L~进层。如果一个注释不能在一行内写完Q就该采用块注释(参见"块注?/font>")。单行注释之前应该有一个空行。以下是一个Java代码中单行注释的例子Q?/p>
if (condition) { /* Handle the condition. */ ... }
极短的注释可以与它们所要描q的代码位于同一行,但是应该有够的I白来分开代码和注释。若有多个短注释出现于大D代码中Q它们应该具有相同的~进?/p>
以下是一个Java代码中尾端注释的例子Q?/p>
if (a == 2) { return TRUE; /* special case */ } else { return isPrime(a); /* works only for odd a */ }
5.1.4 行末注释(End-Of-Line Comments)
注释界定W?//"Q可以注释掉整行或者一行中的一部分。它一般不用于q箋多行的注释文本;然而,它可以用来注释掉q箋多行的代码段。以下是所有三U风格的例子Q?/p>
if (foo > 1) { // Do a double-flip. ... } else { return false; // Explain why here. } //if (bar > 1) { // // // Do a triple-flip. // ... //} //else { // return false; //}
5.2 文档注释(Documentation Comments)
注意Q此处描q的注释格式之范例,参见"Java源文件范?/font>"
若想了解更多Q参?How to Write Doc Comments for Javadoc"Q其中包含了有关文档注释标记的信?@return, @param, @see)Q?/p>
http://java.sun.com/javadoc/writingdoccomments/index.html
若想了解更多有关文档注释和javadoc的详l资料,参见javadoc的主:
http://java.sun.com/javadoc/index.html
文档注释描述Java的类、接口、构造器Q方法,以及字段(field)。每个文档注释都会被|于注释定界W?**...*/之中Q一个注释对应一个类、接口或成员。该注释应位于声明之前:
/** * The Example class provides ... */ public class Example { ...
注意层(top-level)的类和接口是不羃q的Q而其成员是羃q的。描q类和接口的文档注释的第一?/**)不需~进Q随后的文档注释每行都羃q??使星L向对?。成员,包括构造函数在内,其文档注释的W一行羃q?|随后每行都羃q?根{?/p>
若你想给出有关类、接口、变量或Ҏ的信息,而这些信息又不适合写在文档中,则可使用实现块注??.1.1)或紧跟在声明后面的单行注??.1.2)。例如,有关一个类实现的细节,应放入紧跟在cd明后面的实现块注释中Q而不是放在文档注释中?/p>
文档注释不能攑֜一个方法或构造器的定义块中,因ؓJava会将位于文档注释之后的第一个声明与其相兌?/p>
推荐一行一个声明,因ؓq样以利于写注释。亦卻I
int level; // indentation level int size; // size of table
要优于,
int level, size;
不要不同类型变量的声明攑֜同一行,例如Q?/p>
int foo, fooarray[]; //WRONG!
注意Q上面的例子中,在类型和标识W之间放了一个空|另一U被允许的替代方式是使用制表W:
int level; // indentation level int size; // size of table Object currentEntry; // currently selected table entry
量在声明局部变量的同时初始化。唯一不这么做的理由是变量的初始g赖于某些先前发生的计?/p>
只在代码块的开始处声明变量。(一个块是指M被包含在大括?{"?}"中间的代码。)不要在首ơ用到该变量时才声明之。这会把注意力不集中的程序员搞糊涂,同时会妨代码在该作用域内的可移植性?/p>
void myMethod() { int int1 = 0; // beginning of method block if (condition) { int int2 = 0; // beginning of "if" block ... } }
该规则的一个例外是for循环的烦引变?/p>
for (int i = 0; i < maxLoops; i++) { ... }
避免声明的局部变量覆盖上一U声明的变量。例如,不要在内部代码块中声明相同的变量名:
int count; ... myMethod() { if (condition) { int count = 0; // AVOID! ... } ... }
6.4 cd接口的声?Class and Interface Declarations)
当编写类和接口是Q应该遵守以下格式规则:
- 在方法名与其参数列表之前的左括号"("间不要有I格
- 左大括号"{"位于声明语句同行的末?br />
- 叛_括号"}"另v一行,与相应的声明语句寚wQ除非是一个空语句Q?}"应紧跟在"{"之后
class Sample extends Object { int ivar1; int ivar2; Sample(int i, int j) { ivar1 = i; ivar2 = j; } int emptyMethod() {} ... }- Ҏ与方法之间以I分隔
每行臛_包含一条语句,例如Q?/p>
argv++; // Correct argc--; // Correct argv++; argc--; // AVOID!
复合语句是包含在大括号中的语句序列,形如"{ 语句 }"。例如下面各Dc?/p>
- 被括其中的语句应该较之复合语句羃q一个层?br /> - 左大括号"{"应位于复合语句v始行的行;叛_括号"}"应另起一行ƈ与复合语句首行对齐?br /> - 大括号可以被用于所有语句,包括单个语句Q只要这些语句是诸如if-else或for控制l构的一部分。这样便于添加语句而无需担心׃忘了加括可引入bug?
一个带q回值的return语句不用小括号"()"Q除非它们以某种方式使返回值更为显见。例如:
return; return myDisk.size(); return (size ? size : defaultSize);
7.4 ifQif-elseQif else-if else语句(if, if-else, if else-if else Statements)
if-else语句应该h如下格式Q?/p>
if (condition) { statements; } if (condition) { statements; } else { statements; } if (condition) { statements; } else if (condition) { statements; } else{ statements; }
注意Qif语句L?{"?}"括v来,避免使用如下Ҏ引v错误的格式:
if (condition) //AVOID! THIS OMITS THE BRACES {}! statement;
一个for语句应该h如下格式Q?/p>
for (initialization; condition; update) { statements; }
一个空的for语句(所有工作都在初始化Q条件判断,更新子句中完成)应该h如下格式Q?/p>
for (initialization; condition; update);
当在for语句的初始化或更新子句中使用逗号Ӟ避免因用三个以上变量,而导致复杂度提高。若需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子?使用单独的语句?/p>
一个while语句应该h如下格式
while (condition) { statements; }
一个空的while语句应该h如下格式Q?/p>
while (condition);
7.7 do-while语句(do-while Statements)
一个do-while语句应该h如下格式Q?/p>
do { statements; } while (condition);
7.8 switch语句(switch Statements)
一个switch语句应该h如下格式Q?/p>
switch (condition) { case ABC: statements; /* falls through */ case DEF: statements; break; case XYZ: statements; break; default: statements; break; }
每当一个case着往下执行时(因ؓ没有break语句)Q通常应在break语句的位|添加注释。上面的CZ代码中就包含注释/* falls through */?/p>
7.9 try-catch语句(try-catch Statements)
一个try-catch语句应该h如下格式Q?/p>
try { statements; } catch (ExceptionClass e) { statements; }
一个try-catch语句后面也可能跟着一个finally语句Q不论try代码块是否顺利执行完Q它都会被执行?/p>
try { statements; } catch (ExceptionClass e) { statements; } finally { statements; }
I逻辑相关的代码段分隔开Q以提高可读性?/p>
下列情况应该L使用两个IQ?/p>
- 一个源文g的两个片D?section)之间
- cd明和接口声明之间
下列情况应该L使用一个空行:
- 两个Ҏ之间
- Ҏ内的局部变量和Ҏ的第一条语句之?br />
- 块注释(参见"5.1.1"Q或单行注释Q参?5.1.2"Q之?br />
- 一个方法内的两个逻辑D之_用以提高可读?
下列情况应该使用I格Q?/p>
- 一个紧跟着括号的关键字应该被空格分开Q例如:
while (true) { ... }注意Q空g应该|于Ҏ名与其左括号之间。这有助于区分关键字和Ҏ调用?br /> - I白应该位于参数列表中逗号的后?br /> - 所有的二元q算W,除了"."Q应该用空格将之与操作数分开。一元操作符和操作数之间不因该加I格Q比如:负号("-")、自?"++")和自?"--")。例如:
a += c + d; a = (a + b) / (c * d); while (d++ = s++) { n++; } printSize("size is " + foo + "\n");- for语句中的表达式应该被I格分开Q例如:
for (expr1; expr2; expr3)- 强制转型后应该跟一个空|例如Q?
myMethod((byte) aNum, (Object) x); myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
命名规范使程序更易读Q从而更易于理解。它们也可以提供一些有x识符功能的信息,以助于理解代码,例如Q不论它是一个常量,包,q是cR?/p>
标识W类?/td> | 命名规则 | 例子 |
?Packages) | 一个唯一包名的前~L全部写的ASCII字母q且是一个顶U域名,通常是comQeduQgovQmilQnetQorgQ或1981qISO 3166标准所指定的标识国家的英文双字W代码。包名的后箋部分Ҏ不同机构各自内部的命名规范而不相同。这cd名规范可能以特定目录名的l成来区分部?department)Q项?project)Q机?machine)Q或注册?login names)?/td> | com.sun.eng com.apple.quicktime.v2 edu.cmu.cs.bovik.cheese |
c?Classes) | 命名规则Q类名是个一名词Q采用大写混合的方式,每个单词的首字母大写。尽量你的cdz而富于描q。用完整单词,避免~写?除非该羃写词被更q泛使用Q像URLQHTML) | class Raster; class ImageSprite; |
接口(Interfaces) | 命名规则Q大写规则与类名相?/td> | interface RasterDelegate; interface Storing; |
Ҏ(Methods) | Ҏ名是一个动词,采用大小写合的方式Q第一个单词的首字母小写,其后单词的首字母大写?/td> | run(); runFast(); getBackground(); |
变量(Variables) | 除了变量名外Q所有实例,包括c,cd量,均采用大写混合的方式,W一个单词的首字母小写,其后单词的首字母大写。变量名不应以下划线或美元符号开_管q在语法上是允许的?br /> 变量名应短且富于描述。变量名的选用应该易于记忆Q即Q能够指出其用途。尽量避免单个字W的变量名,除非是一ơ性的临时变量。时变量通常被取名ؓiQjQkQm和nQ它们一般用于整型;cQdQeQ它们一般用于字W型?/td> | char c; int i; float myWidth; |
实例变量(Instance Variables) | 大小写规则和变量名相|除了前面需要一个下划线 | int _employeeId; String _name; Customer _customer; |
帔R(Constants) | cd量和ANSI帔R的声明,应该全部大写Q单词间用下划线隔开?量避免ANSI帔RQ容易引起错? | static final int MIN_WIDTH = 4; static final int MAX_WIDTH = 999; static final int GET_THE_CPU = 1; |
10 ~程惯例(Programming Practices)
10.1 提供对实例以及类变量的访问控?Providing Access to Instance and Class Variables)
若没有够理由,不要把实例或cd量声明ؓ公有。通常Q实例变量无需昑ּ的设|?set)和获?gotten)Q通常q作为方法调用的边缘效应 (side effect)而生?/p>
一个具有公有实例变量的恰当例子Q是cM作ؓ数据l构Q没有行为。亦卻I若你要用一个结?struct)而非一个类(如果java支持l构的话)Q那么把cȝ实例变量声明为公有是合适的?/p>
10.2 引用cd量和cL?Referring to Class Variables and Methods)
避免用一个对象访问一个类的静态变量和Ҏ。应该用cd替代。例如:
classMethod(); //OK AClass.classMethod(); //OK anObject.classMethod(); //AVOID!
位于for循环中作数器值的数字帔RQ除?1,0?之外Q不应被直接写入代码?/p>
10.4 变量赋?Variable Assignments)
避免在一个语句中l多个变量赋相同的倹{它很难L。例如:
fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
不要赋D符用在Ҏ与相{关p运符h的地斏V例如:
if (c++ = d++) { // AVOID! (Java disallows) ... }
应该写成
if ((c++ = d++) != 0) { ... }
不要使用内嵌(embedded)赋D符试图提高q行时的效率Q这是编译器的工作。例如:
d = (a = b + c) + r; // AVOID!
应该写成
a = b + c; d = a + r;
10.5 其它惯例(Miscellaneous Practices)
一般而言Q在含有多种q算W的表达式中使用圆括h避免q算W优先问题Q是个好Ҏ。即使运符的优先对你而言可能很清楚,但对其他人未必如此。你不能假设别的E序员和你一h楚运符的优先?/p>
if (a == b && c == d) // AVOID! if ((a == b) && (c == d)) // RIGHT
设法让你的程序结构符合目的。例如:
if (booleanExpression) { return true; } else { return false; }
应该代之以如下方法:
return booleanExpression;
cM圎ͼ
if (condition) { return x; } return y;
应该写做Q?/p>
return (condition ? x : y);
10.5.3 条gq算W??"前的表达?Expressions before '?' in the Conditional Operator)
如果一个包含二元运符的表辑ּ出现在三元运符" ? : "??"之前Q那么应该给表达式添上一对圆括号。例如:
(x >= 0) ? x : -x;
在注释中使用XXX来标识某些未实现(bogus)的但可以工作(works)的内宏V用FIXME来标识某些假的和错误的内宏V?/p>
11.1 Java源文件范?Java Source File Example)
下面的例子,展示了如何合理布局一个包含单一公共cȝJava源程序。接口的布局与其怼。更多信息参?cd接口声明"以及"文挡注释"?/p>
/* * @(#)Blah.java 1.82 99/03/18 * * Copyright (c) 1994-1999 Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A. * All rights reserved. * * This software is the confidential and proprietary information of Sun * Microsystems, Inc. ("Confidential Information"). You shall not * disclose such Confidential Information and shall use it only in * accordance with the terms of the license agreement you entered into * with Sun. */ package java.blah; import java.blah.blahdy.BlahBlah; /** * Class description goes here. * * @version 1.82 18 Mar 1999 * @author Firstname Lastname */ public class Blah extends SomeClass { /* A class implementation comment can go here. */ /** classVar1 documentation comment */ public static int classVar1; /** * classVar2 documentation comment that happens to be * more than one line long */ private static Object classVar2; /** instanceVar1 documentation comment */ public Object instanceVar1; /** instanceVar2 documentation comment */ protected int instanceVar2; /** instanceVar3 documentation comment */ private Object[] instanceVar3; /** * ...constructor Blah documentation comment... */ public Blah() { // ...implementation goes here... } /** * ...method doSomething documentation comment... */ public void doSomething() { // ...implementation goes here... } /** * ...method doSomethingElse documentation comment... * @param someParam description */ public void doSomethingElse(Object someParam) { // ...implementation goes here... } }