您的位置:首页 > 职场人生

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

2017-10-26 17:32 483 查看
练习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() {

@Override
public 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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多态练习
相关文章推荐