注释是为了方便自己或代码维护方更容易地读懂代码的用处.
第一段:背景?
①.、当我们第一次接触某段代码,但又被要求在极短的时间内有效地分析这段代码,我们需要什么样的注释信息?
第二段:意义?
程序中的注释是程序设计者与程序阅读者之间通信的重要手段.应用注释规范对于软件本身和软件开发人员而言尤为重要.并且在流行的敏捷开发思想中已经提出了将注释转为代码的概念.好的注释规范可以尽可能的减少一个软件的维护成本?,?并且几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护.好的注释规范可以改善软件的可读性,可以让开发人员尽快而彻底地理解新的代码.好的注释规范可以最大限度的提高团队开发的合作效率.长期的规范性编码还可以让开发人员养成良好的编码习惯,甚至锻炼出更加严谨的思维能力.?
第三段:注释的原则?
①.、注释形式统一?
在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其他项目组发现他们的注释规范与这份文档不同,按照他们的规范写代码,不要试图在既成的规范系统中引入新的规范.?
内容要简单、明了、含义准确,防止注释的多义性,错误的注释不但无益反而有害.?
在写代码之前或者边写代码边写注释,因为以后很可能没有时间来这样做.另外,如果有机会复查已编写的代码,在今天看来很明显的东西六周以后或许就不明显了.通常描述性注释先于代码创建,解释性注释在开发过程中创建,提示性注释在代码完成之后创建.修改代码的同时修改相应的注释,以保证代码与注释的同步.?
保证注释与其描述的代码相邻,即注释的就近原则.对代码的注释应放在其上方相邻或右方的位置,不可放在下方.避免在代码行的末尾添加注释;行尾注释使代码更难阅读.不过在批注变量声明时,行尾注释是合适的;在这种情况下,将所有行尾注释要对齐.?
在代码交付或部署发布之前,必须删掉临时的或无关的注释,以避免在日后的维护工作中产生混乱.?
如果需要用注释来解释复杂的代码,请检查此代码以确定是否应该重写它.尽一切可能不注释难以理解的代码,而应该重写它.尽管一般不应该为了使代码更简单便于使用而牺牲性能,但必须保持性能和可维护性之间的平衡.?
描述程序功能和程序各组成部分相互关系的高级注释是最有用的,而逐行解释程序如何工作的低级注释则不利于读、写和修改,是不必要的,也是难以维护的.避免每行代码都使用注释.如果代码本来就是清楚、一目了然的则不加注释,避免多余的或不适当的注释出现.?
典型算法必须有注释.在代码不明晰或不可移植处必须有注释.在代码修改处加上修改标识的注释.在循环和逻辑分支组成的代码中添加注释.为了防止问题反复出现,对错误修复和解决方法的代码使用注释,尤其是在团队环境中.?
①.0、注释在编译代码时会被忽略,不编译到最后的可执行文件中,所以注释不?
会增加可执行文件的大小.?
第四段:JAVA注释技巧?
①.、空行和空白字符也是一种特殊注释.利用缩进和空行,使代码与注释容易区?
别,并协调美观.?
结束处加注释(在闭合的右花括号后注释该闭合所对应的起点),注释不能?
写得很长,只要能表示是哪个控制语句控制范围的结束即可,这样便于阅读.?
这样做会使注释很明显且容易被找到.?
这样虽然麻烦,但是在做屏蔽调试时不用查找配对的"/*......*/".?
试想一下,一个没有一句注释的程序源码,怎么读,一个程序要上万条代码不可能全部记得住哪一块是什么用,而且一个项目也不会是一个人独自完成,那样效率太低,多人合作就要给别人说明,每一块是什么用,方便他人使用,方便自己更正,而这些说明文字就是注释,注释不会被执行,不影响运行结果.
Java中代码的注释有三种:
// 注释一行?
/* ...... */ 注释若干行?
/** ...... */ 注释若干行,并写入 javadoc 文档
前两种比较容易理解,至于第三种,你学习Java看的api文档就是javadoc程序根据第三种的注释生成的.
扩展资料
注释就是对代码的解释和说明,其目的是让人们能够更加轻松地了解代码.注释是编写程序时,写程序的人给一个语句、程序段、函数等的解释或提示,能提高程序代码的可读性.
Java代码注释写的多,会影响到编译效率,但是不会影响到执行效率.
Java代码是先编译成字节码,然后被JVM解释执行的.
我做了个实验
TimeDemo 类
import?java.util.ArrayList;
public?class?TimeDemo?{
public?static?void?main(String[]?args)?{
long?start?=?System.currentTimeMillis();
ArrayListInteger?list?=?new?ArrayListInteger();
for?(int?i?=?0;?i?1000000;?i++)?{
list.add(i);
}
long?end?=?System.currentTimeMillis();
System.out.println("本次执行耗费了"+(end-start)+"毫秒");
//用java.io生成了很多行的注释,
//注释
运行结果
当注释行数是1~1万行的时候. 能较快的编译
当注释行数达到1百万的时候,编译稍微慢一点
当注释行数达到1千万行的时候, CPU占用100%,卡了进1分钟也没有编译完成,只好强行关闭
结论:
简单明了的注释有助于程序猿对代码的读写
?只有当注释行数极大的时候,才会严重的影响编译速度. 但不会影响执行速度
多注了些控制流程,希望我的注释能够对你有帮助:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GoodLucky extends JFrame implements ActionListener{
JTextField tf = new JTextField(); //实例化一个文本域
//设置两个按钮
JButton b1 = new JButton("开始");
boolean isGo = false;
//构造函数
public GoodLucky(){
b1.setActionCommand("start");//在开始按钮上设置一个动作监听 start
JPanel p = new JPanel(); //实例化一个可视化容器
//将两个按钮添加到可视化容器上面,用add方法
p.add(b1);
//在两个按钮上增加监听的属性,自动调用下面的监听处理方法actionPerformed(ActionEvent e),如果要代码有更好的可读性,可用内部类实现动作
//监听处理.
b1.addActionListener(this);
this.getContentPane().add(tf,"North"); //将上面的文本域放在面板的北方,也就是上面(上北下南左西右东)
this.getContentPane().add(p,"South"); //将可视化容器pannel放在南边,也就是下面
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置用户在此窗体上发起 "close" 时默认执行的操作,参数EXIT_ON_CLOSE是使用 System exit 方法退出应用程序.仅在应用程序中使用
Cursor cu = new Cursor(Cursor.HAND_CURSOR); //用指定名称创建一个新的定制光标对象,参数表示手状光标类型
this.setCursor(cu); //为指定的光标设置光标图像,即设置光标图像为上面所创建的手状光标类型
this.setVisible(true); //将面板可视化设置为true,即可视,如果为false,即程序运行时面板会隐藏
tf.setText("welcome you! "); //设置面板的标题为欢迎
this.go(); //调用go方法
public void go(){
if(isGo == true){ //上面所定义的isGo的初始值为false,所以程序第一次到此会跳过
String s = ""; //设置空字符串
if(i 10){
s = s + " 0" + i; //如果产生的随机数小于10的话做处理:这里就牵扯到一个重要的概念,简单叙述一下:
/*
当一个字符串与一个整型数项相加的意思是连接,上面的s = s + " 0" + i的意思是字符串s链接0再连接整型i值,而不会导致0和整型的i相加,
*/
}else{
s = s + " " + i; //如果产生的随机数比10打的话,那么加上空格显示,即数字和数字之间有个空格
tf.setText(s); //将产生的随机数全部显示在文本域上,用文本域对象tf调用它的设置文本的方法setText(String)实现.
//以下为线程延迟
try{
Thread.sleep(10); //线程类同步方法sleep,睡眠方法,括号里的单位为ms.
}catch(java.lang.InterruptedException e){
e.printStackTrace(); //异常捕获,不用多说.
//以下是上面设置的事件监听的具体处理办法,即监听时间处理方法,自动调用
public void actionPerformed(ActionEvent e){ //传入一个动作事件的参数e
String s = e.getActionCommand(); //设置字符串s来存储获得动作监听,上面的start
执行else语句块中的语句,isGo设置为false,将不执行上面go中的循环语句块,从而停止产生随机数,并显示,并且把开始按钮设置为可用,而把
停止按钮设置为不可用,等待用户按下开始再去开始新一轮循环产生随机数.
if(s.equals("start")){ //如果捕获到start,也就是用户触发了动作监听器,那么下面处理
isGo = true; //设置isGo为true
b1.setEnabled(false); //将开始按钮设置为不可用
isGo = false; //将isGo设置为false,isGo为循环标志位
b1.setEnabled(true); //设置开始按钮为可用
public static void main(String[] args){
new GoodLucky(); //产生类的实例,执行方法
圣诞平安夜了,祝朋友开心快乐!
另外在命名是也要特别注意,命名能都充分表现你的变量、方法、类的含义,这样也能起到注释的作用.
还有就是类、方法不能过大,方法十几行也就差不多了,太多可读性就比较差了.
注释的很详细了 还有什么不明白的可以给我留言
此外给楼主点建议,打好基础,这套代码乱七八糟,写的太烂了.不适合用来学习,要学习就找好代码,不然很容易被误导.
/**
*此类事dao层中的一个类 使用hibernate完成持久层的控制
*继承自抽象类AbstractDAO并实现了抽象类的相关方法
*主要包括获取图书列表,获取图书记录,添加图书信息,添加和更新图书信息,
*获取图书信息和判断判断是否可以删除图书信息这几个功能
public class BookDAO extends AbstractDAO {
//无参数构造方法
public BookDAO() {
/**治理竟然加了个主方法,恕在下愚钝,除了添乱之外想不出别的解释
*也可能是测试阶段用来测试 然后忘记删除了
public static void main(String[] args) {
// TODO Auto-generated method stub
* 获取图书信息 根据关键字使用模糊查询 得到包含关键字的图书信息列表
*如果输入的book对象的bookName属性为控制或者空字符串 默认查询所有图书信息
*默认情况返回数据库中所有图书的信息,
*这里返回值设计成ListBookinfo会更好 当然由于集成的抽象类的限制改不了(抽象类设计的不好 )
**/
public List getBookList(Bookinfo book,Pager pager) throws DataAccessException{
//hql语句 默认情况下 返回数据库中所有的图书信息
String hql = " from com.jframe.biz.book.Bookinfo book" +
" where 1=1 ";
/*如果book名存在且不是空串
*重新构造hql语句 添加限制条件 返回book名字的模糊查询结果集
if(book.getBookName()!=null!"".equals(book.getBookName())){
hql += " and book.bookName like '%"+book.getBookName()+"%'";
if(book.getAuthor()!=null!"".equals(book.getAuthor())){
hql += " and book.author like '%"+book.getAuthor()+"%'";
//创建查询对象 执行hql语句
Query query = this.getSession().createQuery(hql);
//以下两条记录设置了从数据库的第几条记录开始 查到第几条 用于分页
//设定结果集的大小 就是分页逻辑设定的每页显示的记录数
query.setMaxResults(pager.getPageSize());
//从分页中逻辑中传过来的起始记录开始查
query.setFirstResult((pager.getCurrentPage()-1)*pager.getPageSize());
//返回查询到的结果
return query.list();
*查询指定条件的图书的记录数
public int getBookCount(Bookinfo book) throws DataAccessException{
//设定默认的hql 查询所有的图书的记录
String hql = " select count(bookName) from com.jframe.biz.book.Bookinfo book" +
//如果图书名不为空且不是空串 添加限制条件--图书名的模糊查询
//返回查询的结果集到list
List list = query.list();
//如果结果集对象不为空且存在结果
if(list!=nulllist.size()0)
//将结果集中第一个元素转换成整形然后返回
return ((Integer)query.list().iterator().next()).intValue();
else
//没有记录返回0
return 0;
*添加图书信息
public Bookinfo addBookInfo(Bookinfo book) throws DataAccessException{
//创建hibernate模板对象
HibernateTemplate template = this.getHibernateTemplate();
//调用模板的保存方法保存图书信息
template.save(book);
//清理缓存或者说清理脏数据 检验内存中的持久态对象是否已经存入数据库
template.flush();
template.evict(book);
//以后返回值就不解释了 方法头上面有参数和返回值的解释
return getBookInfo(book);
public Bookinfo saveBookInfo(Bookinfo book) throws DataAccessException{
//同上个方法 以后不解释
//如果数据库中没有则插入 如果有则更新
template.saveOrUpdate(book);
return book;
*删除指定图书
public void deleteBookInfo(Bookinfo book) throws DataAccessException{
//调用模板的删除方法
template.delete(book);
*根据书号查询图书信息
public Bookinfo getBookInfo(Bookinfo book) throws DataAccessException{
//sql语句 查询指定书号的图书信息
String hql = " from com.jframe.biz.book.Bookinfo book" +
" where 1=1 and book.bookNo='"+book.getBookNo()+"'";
//调用查询的模板的查询类
List list = template.find(hql);
//将查询结果集的第一个值强制转换成对象返回
return (Bookinfo) list.iterator().next();
return null;
*r如果日志信息中记录的书号是可删除的 并且在数据库中存在则返回true
public boolean isCanDelete(Bookinfo book) {
boolean flag = false;
String hql = " from com.jframe.biz.log.Loginfo log" +
" where 1=1 and log.bookinfo.bookNo='"+book.getBookNo()+"'";
flag = false;
flag = true;
return flag;