第二章 第一节 语言基础

1、注释

  注释指的是一些描述代码的文字。

  我们可以把对代码的各方面描述,都写成代码的注释。注释中经典的内容包括:这段代码是如何工作的、这段代码使用了什么算法、这段代码的执行流程如何,等等。注释不是Java代码的一部分,编译时,编译器会把Java代码翻译成字节码,而注释则会被编译器自动忽略。因此,代码中有没有注释,都不会影响到代码的运行效果。

  但是,注释却是编程中必不可少的内容,有良好的注释,能够极大的增强代码的可读性。也就是说,加上注释的代码更容易让人读懂。

  如果你是一个初学者,一开始可能意识不到注释的意义,然而我们知道,Java代码是给机器看的,同时也是给人看的,事实上,程序员看代码的时间远远超过Java编译器看代码的时间(想象一下你调试和写程序需要多久,而编译器编译程序需要多久)。因此,我们写程序应当注重"可读性",也就是说,我们写的代码应当尽可能让人容易读懂。随着工作量和代码量的增加,越来越多的代码和复杂的业务逻辑会让程序员很难读懂、修改和维护代码。也许有一天,在看到自己写的代码的时候,你也会发出这样的感慨:"咦,这段代码真的是我写的么?我怎么一点都看不懂了"。这时候,注释能够给程序员带来最大的帮助。

  Java中的注释代码从语法上来说主要有三种:单行注释、多行注释、javadoc注释。

1.1、单行和多行注释 

  单行注释和多行注释,是很多编程语言中常见的注释语法。

  在Java中,单行注释以"//"开头,直到遇到一个换行符为止。以下为合法的单行注释:  

//这是HelloWorld类
public class HelloWorld{
    //这是程序的主方法
    public static void main(String[] args){
        System.out.println("Hello World");//打印语句
    }
}

  在Java中,多行注释以" /* "开头,以" */ "结尾,在/*和*/之间的所有内容,均作为注释。

//这是HelloWorld类
public class HelloWorld{
    //这是程序的主方法
    public static void main(String[] args){
        /*
            在程序的主方法中
            这段代码的含义是打印Hello World字符串
        */
        System.out.println("Hello World");
    }
}

但是特别注意的是,多行注释中不能嵌套。否则会引起编译错误。

1.2、javadoc注释

  javadoc注释,是Java中一种比较特殊的注释,这种注释用来生成api文档。

  程序员对外发布Java代码的时候,还应当对外公布这些代码的用法。这样,才能让其他程序员能够更方便的利用已用的代码。在Java中,我们往往使用api文档,来向其他程序员介绍代码的组成和用法。

  java1.8的文档链接如下:http://java.sun.com/javase/8/docs/api/ 。对于程序员来说,如何来生成这样的api文档呢?如果让程序员来直接手工编写,是一件非常麻烦的事情,为此,java提供了一种相对比较简单的机制。

  首先,在代码中,我们可以使用javadoc注释,从语法上说,这种注释由" /** "开头,以" */ "结尾,在" /** "和" */ "之间可以有多行文本,并且与多行注释一样,javadoc也不允许嵌套。这是一种特殊的多行注释,可以在代码中描述类、函数等等。

  然后,在JDK中,有一个javadoc命令,这个命令能够从源文件中获取javadoc注释,并根据javadoc注释,自动生成api文档。代码如下:

/**
 * 这是对类的描述
 */
public class HelloWorld{
    /**
     *    这是对主方法的注释
     */
    public static void main(String[] args){
        
        System.out.println("Hello World");
    }
}

  上述代码,再类和方法前面都加上了javadoc注释。然后,进入命令行。在命令行上输入如下代码:

  javadoc -d doc HelloWorld.java

  javadoc 命令能够根据代码中的javadoc注释生成文档。 "-d 文件夹名" 是javadoc命令的一个选项,这个选项表示的是,生成的文档要放在后面指定的文件夹下,这就表示生成的javadoc 文档要放在doc目录下。javadoc 命令最后一个参数,是一个java源文件的名字,表示要生成哪一个源文件的文档。然后会在当前目录下生成一个doc目录,如下:

在doc目录里面:

在生成的一系列文件中,可以用浏览器打开index.html网页,显示如下:

  javadoc 命令自动为我们生成了一个上图显示的文档。上面,我们介绍了如何使用javadoc注释自动生成api文档,关于这种注释的更详细的使用,可以参考 http://java.sun.com/j2se/javadoc/ 。

1.2、包  package语句 

  随着代码的大量增加,程序员写的.java源文件以及编译产生.class字节码文件会大量的增加。如果任由这种情况发生的话,无论是查询还是管理都会非常的不方便。为了解决这方面的问题,Java提供了"包"来帮助我们组织和管理类。为了方便管理,我们往往会按照某种规则,创建结构合理的文件夹结构,例如,如果有大量的mp3音乐文件,用户可以把这些文件按照歌手、风格、专辑等,来创建相应的文件夹,分门别类的进行管理。

  在java中,为了更好的管理大量的类,引入"包"的概念。

  使用package语句用来将一个特定的类放入包中。要注意的是,如果要使用package语句,则这个语句必须作为.java文件的第一个语句,并写在任何类的外面。代码如下:

package book.corejava;

public class HelloWorld{
	public static void main(String[] args){
		
		System.out.println("Hello World");
	}
}

  上面的这段代码,就把HelloWorld类放在了book.corejava包下。要注意的是,在加包之后,使用HelloWorld类时必须加上包名作为前缀,因此完整的写法应当是:book.corejava.HelloWorld。这种在类名前面加上包名的写法称为类的全限定名。注意:在使用包时,包结构必须硬盘上的文件夹结构相同。

  那么,编译上面的代码就要用如下的命令:

  javac -d . HelloWorld.java

  -d 选项,要求编译器把编译生成的.class文件按照包结构来存放。编译器会按照类的包结构,自动生成对应的目录结构。用法如下:

  javac -d 目标目录 源文件名。其中目标目录指的是:把生成的目录放在哪个目录下作为子目录。例如上面的命令javac -d . HelloWorld.java,这个"."就代表当前目录。结构如下:

  D:

   |--HelloWorld.java

   |--book

    |--corejava

     |--HelloWorld.class

  那么,编译之后,运行上面的代码,用如下的命令:

  java book.corejava.HelloWorld

  运行结果如下:

 特别提醒:执行java命令时,当前路径必须在字节码文件包结构的上层目录下,否则将会出现运行错误,这是因为我们在配置环境变量的时候,将CLASSPATH这个变量的值设置为了"."。也就是说,JVM会到当前目录下去寻找所需要的类文件。 

  使用包的主要目的是为了避免类名冲突,例如,假如有两个程序员不约而同的都使用HelloWorkd作为类名。如果这两个类都不使用包的话,一方面,两个类的类名相同,因此在使用上会产生歧义,另一方面,再把两个程序员写完的.class字节码文件放在一起运行的时候,在同一个文件夹下会有两个同名的字节码文件,从而产生文件冲突。而如果这个两个程序员使用不同的包p1和p2,一方面生成的HelloWorld.class字节码文件一个放在p1目录下,另一个放在p2目录下,不会有文件名的冲突,另一方面,权限定名不同,在使用这个两个类时,一个被称为p1.HellWord,另一个被称为p2.HelloWorld,从而避免了类名的冲突。

  为了保持包名的绝对唯一性,Sun公司建议将公司的Internet网址(必然是唯一的)的逆序作为包名,并在不同的项目中使用不同的子包。例如,假设公司的网址是abc.com,则应当使用com.abc作为包名。

2、import语句

  把类加上包之后,除了运行时之外,在源代码中使用这个类也必须使用类的权限定名,否则就会编译出错,正确使用如下代码:

package book.corejava;

public class HelloWorld{
    /** this is main note */
    public static void main(String[] args){
        book.corejava.HelloWorld helloWorld;
        System.out.println("Hello World");
    }
}

  在这里有个简单写法就是Java为我们提供了import语句。import语句表示导入特定的类,在使用import语句导入一个类之后,使用时就能简单的使用类名了,例如如下代码:

package book.corejava;
import book.corejava.HelloWorld;

public class HelloWorld{
    /** this is main note */
    public static void main(String[] args){
        HelloWorld helloWorld;
    }
}

  在这里你可能体会不到import语句有多大的作用,但是随着代码量的增加,会使程序的冗余代码大大减少,变得相当简洁和清晰。从语法上说,如果要使用import语句,则这个语句必须放在任何类的外部,仅能在package语句之后。

  此外,一个.java文件中可以有多个import语句,用于导入多个类。如果想要一次导入某个包下的所有类,则可以使用*通配符。例如:

  import java.util.*;

  表示导入java.util包内的所有类。也就是说,当我们用到这个包里面任何一个类的时候,都可以省略包名。特别要提醒的是,上述语句并不能导入util包的子包,也就是说,java.util.jar、java.util.logging等包下的类并未导入。

  例如:我们要使用下面这几个类:

  java.util.ArrayList,java.uttil.HashSet,java.util.logging.Logger,下面的代码:

package book.corejava;
import java.util.*;

public class HelloWorld{
    public static void main(String[] args){
        ArrayList list;
        HashSet set;
        Logger log;
    }
}

  由于import java.util.*能够带入java.util.ArrayList和java.util.HashSet类,但不能导入java.util的子包中的类,因此java.util.logging.Logger类并没有导入,编译器找不到这个类,因此编译出错,如图:

  另外,只能用*导入一个包,而不能使用java.*或java.*.*等语法,试图导入所有以java为前缀的包。最后,java.lang包为标准Java库中最常用的包,这个包中的类会在所有java程序中自动被导入,也可以理解为,在所有的.java文件中,import java.lang.*,这个语句都不用写,编译器会自动导入这个包下的类。

  

 

原文地址:https://www.cnblogs.com/zhiweijq/p/9860704.html