java程序员从笨鸟到菜鸟之(十一)练习题(多态)和API文档的制作

来源:互联网 发布:java list() 编辑:程序博客网 时间:2024/06/10 00:55

练习1:多态

package javaTest;class A {public void show() {show2();}public void show2() {System.out.println("我");}}class B extends A {public void show2() {System.out.println("爱");}}class C extends B {public void show() {super.show();//调用父类的方法}public void show2() {System.out.println("你");}}public class Demo2 {public static void main(String[] args) {//(1)A a = new B();a.show();//(2)B b = new C();b.show();}}
分析:
/*    说明:A---祖父类,B---父类,C---子类

 * 考察普通多态形式(非抽象、接口、匿名类的形式)
 * 分析(1)运行机制:当new B()的时候,首先去看B类是否有一个确定的继承类,若没有则继承万物之类(Object),这个暂时不管
 * 如果有,一直往前直到基类,则先创建基类....直到父类对象,而创建对象之前必须调用相应的构造方法(暂时不考虑)。
 * 在(1)处:先完成A类(祖父类)对象的创建,再得到B类对象的创建(父类),此时我们可以理解B类的内容为:

class B {       //继承祖父的show()方法public void show() {show2();}//重写祖父的show2()方法public void show2() {System.out.println("爱");}}
祖父类对象构建完后,创建父类对象,此时父类继承了祖父类的show()方法;此时执行a.show(),因为多态机制,对于非静态成员方法,编译在左,运行在右,编译的是祖父类A的show(),而运行的是B类(父类)中的show(),进而执行B类中show()方法中的方法体调用B类的show2(),所以得到的结是“

注意:show()有的只是父类继承的,而不是自己重写的

下面接着分析(2),此时new C()后,B类的内容如上,可以理解C类的内容为(先继承B再继承A,相应方法重写):

class C {//重写public void show() {super.show();}//重写public void show2() {System.out.println("你");}}
此时执行b.show();先编译B类(父类)的show()方法,再执行C类(子类)中的show()方法,进而执行super.show(),进入(父类)B中的show(),先编译父类(B)类中的show2()方法,再执行子类C的show2()方法,得到结果“

思考:如果将C类中的show2()去掉,此时是否报错?如果不报错,请输出结果

        :不报错,经分析结果为“爱”,原因是super.show()进入B类(父类)的show()后,这时因为子类(C)没有重写,就执行B(父类)的show2()方法

对于多态把握一点:执行什么方法(方法的模板)取决于引用类型,执行什么方法体(方法的内容)取决于引用指向的对象类型

在栈,堆,方法区的内存问题后续会补充......

补充练习:

A e = new C();  e.show();
输出结果:“
练习2:匿名内部类

按照要求,补齐代码interface Inter {void show();}class Outer {//补全内容}class OuterDemo {public static void main(String[] args) {Outer.method().show();}}
分析:由main方法中的Outer.method()知道method()方法必是Outer的一个static方法,由Outer8.method().show()---->Outer8.method()返回的是一个对象的引用,通过对象的引用调用对象的show()方法,所以可以知道method()返回的是一个对象的引用,这个引用的类型以及引用指向谁呢?再结合接口中的show()方法---->我们可以想到匿名内部类,通过匿名内部类创建一个实现接口的对象(等价于实现接口子类的对象)去重写接口中的show()方法

完整代码如下:

package javaTest;interface Inter {void show();}class Outer {public static Inter method() {return new Inter() {@Overridepublic void show() {System.out.println("HelloWorld");}};//从new开始到“;”结束匿名内部类创建对象结束}}class OuterDemo {public static void main(String[] args) {Outer.method().show();}}

练习3:(生成class文件的个数)

待续...

练习4:继承与代码块

待续...

利用javadoc工具提取注释来制作API文档

说明:我们平时使用的Java帮助文档(API)就是使用Java中的命令javadoc做成的

1 文档注释格式:

/** *内容  */
以/**(首行)起始,尾行以*/结束

文档注释特点:javadoc输出的是一个HTML文件,通过index.html在自己的Web浏览器查看对应的文档

2  具体语法:
1)所有javadoc命令都只能出现于“/**”注释中,但和平常一样,注释结束于一个“*/”

2)主要通过两种方式来使用javadoc:嵌入的HTML(后续会补充)或使用“文档标记”。

3)其中“文档标记”(Doc tags)是一些以“@”开头的命令,置于注释行的起始处(但前导的“*”会被忽略)。

4)有三种类型的注释文档,它们对应于位于注释后面的元素:类、变量、方法

    (1)一个类注释正好位于一个类定义之前;

    (2)变量注释正好位于变量定义之前;

    (3)而一个方法定义正好位于一个方法定义的前面;

  如下所示:

/** 一个类注释 */public class docTest {/** 一个变量注释 */public int i;/** 一个方法注释 */public void f() {}}
注意:javadoc只能为public(公共)和protected(受保护)成员处理注释文档。“private”(私有)成员的注释会被忽略,我们看不到任何输出(也可以用-private标记包括private成员)。这样做的道理:因为只有public和 protected成员才可在文件之外使用,这是程序员的希望的结果,然后所有类注释都会包含到输出结果里。 上述代码的输出是一个HTML文件,它与其他Java文档具有相同的标准格式。因此,用户和程序员会非常熟悉这种格式,可在程序员设计的类中方便地“漫游”。设计程序时,请务必考虑输入上述代码,用javadoc处理一下,观看最终HTML文件的效果如何。

3  类、变量、方法注释书写形式

1)类文档标记 
类文档可以包括用于版本信息以及作者姓名的标记
1.@version 
格式如下: 
@version 版本信息 
其中,“版本信息”代表任何适合作为版本说明的资料,若在javadoc命令行使用了“-version”标记,就会从生成的HTML文档里提取出版本信息。
2.@author 
格式如下: 
@author 作者信息 
其中“作者信息”包括作者的姓名、电子函件地址或者其他任何适宜的资料。若在javadoc命令行使用了“-author”标记,就会专门从生成的HTML文档里提取出作者信息。 
可为一系列作者使用多个这样的标记,但它们必须连续放置。全部作者信息会一起存入最终HTML代码的单独一个段落里。

********************************************************************************************************

2)变量文档标记 
变量文档只能包括嵌入的HTML以及@see引用(后续补充)

********************************************************************************************************
3)方法文档标记 
除嵌入HTML和@see引用之外,方法还允许使用针对参数、返回值以及违例的文档标记
1.@param 
格式如下: 
@param 参数名 说明 
其中,“参数名”是指参数列表内的标识符,而“说明”代表一些可延续到后续行内的说明文字。一旦遇到一个新文档标记,就认为前一个说明结束。可使用任意数量的说明,每个参数一个。
2. @return 
格式如下: 
@return 说明 
其中,“说明”是指返回值的含义。它可延续到后面的行内。
3. @exception 
有 关“违例”(Exception)的详细情况,我们会在第9章讲述。简言之,它们是一些特殊的对象,若某个方法失败,就可将它们“扔出”对象。调用一个方 法时,尽管只有一个违例对象出现,但一些特殊的方法也许能产生任意数量的、不同类型的违例。所有这些违例都需要说明。所以,违例标记的格式如下: 
@exception 完整类名 说明 
其中,“完整类名”明确指定了一个违例类的名字,它是在其他某个地方定义好的。而“说明”(同样可以延续到下面的行)告诉我们为什么这种特殊类型的违例会在方法调用中出现。
4. @deprecated 
这是Java 1.1的新特性。该标记用于指出一些旧功能已由改进过的新功能取代。该标记的作用是建议用户不必再使用一种特定的功能,因为未来改版时可能摒弃这一功能。若将一个方法标记为@deprecated,则使用该方法时会收到编译器的警告。
********************************************************************************************************

练习4:

package javaTest3;/** *  * 该类是针对数组操作的一个工具类,里面有一些对数组操作的功能 * @author Apple * @version V1.0 * */public class ArrayTool {//无参构造私有,目的为了不让外界其对象private ArrayTool(){}/** * 该方法是针对数组的遍历的方法,遍历的元素[元素1, 元素2, 元素, ....] * @param  * arr :需要被遍历的数组 * */public static void printArray(int[] arr){System.out.print("[");for(int x = 0 ; x < arr.length ; x ++){if(x==arr.length-1){System.out.println(arr[x]+"]");}else{System.out.print(arr[x]+", ");}}}/** * 该方法是针对数组获取最大值的方法 * @param  * arr :需要被遍历的 数组,可以获取每一个元素 * @return * 返回的就是数组中最大值 *  * */public static int getMax(int[] arr){//定义参照物int max = arr[0] ;//遍历其他索引for(int x = 1 ; x < arr.length ;x ++){//判断if(arr[x]>max){max = arr[x] ;}}return max ;}/** * 该方法是查询数组中的元素在数组中第一次出现的索引 * @param  * arr : 需要查询的数组 * @param * value:需要被查找的元素时 * @return * 如果查到了当前索引对应的元素,那么就直接返回当前索引,如果查不到,则返回-1 * */public static int getIndex(int[] arr,int value){//假设法//定义一个索引:假设查不到int index = -1 ;//遍历数组for(int x = 0 ; x < arr.length ; x ++){//判断:如果刚好查到的x索引对应的元素和value相等,那么返回该索引if(arr[x]==value){//表查到了//给索引遍历重新赋值index  = x ;break ;}}return index ;}}
测试类目的:看工具类是否编写正确

public class ArrayDemo {public static void main(String[] args) {//定义一个数组,静态初始化int[] arr = {24,69,80,57,13} ;//遍历数组ArrayTool.printArray(arr) ;//获取数组中的最大值int result = ArrayTool.getMax(arr) ;System.out.println("result:"+result);//查询577元素int index = ArrayTool.getIndex(arr, 577) ;System.out.println("index:"+index);int index2 = ArrayTool.getIndex(arr, 57) ;System.out.println("index2:"+index2);}}
4  制作API文档的流程


 * 1) 需要定义一个类工具类:ArrayTool数组工具类:给该类写上文档注释(每一个静态方法都需要使用文档注释)
 * 2) 需要将该类的无参私有化,目的是不让外界创建对象
 * 3) ArrayTool中的成员方法全部用static修饰
 * 4) 测试完毕
 * 5) 制作API文档


 本次针对ArrayTool类来制作API文档
 1)利用doc命令行:捷键win+R在对话框里面键入cmd---->打开dos命令行---->切换到源文件所在的目录---->javadoc -d 目标名(文件名) -author -version ArrayTool.java

有下列三种方式(假设你想将生成的HTML文档保存在docDirectory目录下):
 如果你要生成的是一个包:javadoc -d docDirectory -version -author nameOfPackage(java类所在的包名)
 如果你要生成的是多个包:javadoc -d docDirectory -version -author nameOfPackage1 nameOfPackage2.....(多个包以空格隔开)
 如果文件在默认包中:javadoc -d docDirectory -version - author *.java
说明:如果省略了 -d docDirectory 那么生成的HTML文档会保存在当前目录下。(ps:不提倡这样做,这样会带来混乱)

***********************************************************************************************************************************
 2)利用Eclipse,在项目列表中按右键,选择Export(导出),然后在Export(导出)对话框中选择java下的javadoc,提交到下一步在Javadoc Generation(javadoc生成)对话框中有两个地方要注意的: 
        javadoc command(javadoc命令):应该选择jdk的bin/javadoc.exe 
        destination(目标):为生成文档的保存路径,可自由选择 
     按finish(完成)提交即可开始生成文档。

注意:用方式2)导出的时候可能会出现因为乱码而导出失败,给 javadoc.exe 加上编码参数就OK。 具体的在Eclipse里 export 选 JavaDoc,在向导的最后一页的Extra JavaDoc Options 里填上参数即可,比如项目采用的是UTF-8的编码就填:-encoding UTF-8 -charset UTF-8 





阅读全文
0 0
原创粉丝点击