#Vi,java,Ant,Junit學習筆記

爲了更好地完成實訓,學習了Vi,java,Ant,Junit的一些基本用法。
下面說一說我對它們的認識


目錄


Vi

Vi是一個Unix及Linux系統下的標準編輯器,只需要在命令行輸入 vi 就可以進入,一開始我的內心是崩潰的,因爲這個編輯器完全是命令行窗口式的編寫,長的是這樣
這裏寫圖片描述

單調的界面,沒有自動補全。。。。。但是後來深入瞭解以後,發現它之所以沒有被計算機歷史的長河所淹沒,反而深受程序員們的鐘愛,是因爲它有很多魅力,下面簡單介紹

1.分離式的三種模式

不同於gedit,sublime這些編輯器,Vi將自身分開成了三種模式:

  • 命令行模式
    控制光標的移動,以及文本的刪除,移動複雜謀區段,初始進入Vi界面時就是命令行模式

  • 插入模式
    進行文本輸入

  • 底行模式
    對文件進行操作,如保存和退出,也可以尋找字符串、列出行號等等,把:刪掉即可回到命令行模式

2.易於理解的操作

進入

在命令行輸入vi或者vi filename 即可進入的是命令行模式

模式切換上面已經說過,下面針對不同模式說明不同的操作

2.1.插入模式

插入模式很好理解,就是和我們平時的文本編輯差不多。但是當我們發現前面輸錯字時,不能通過鼠標來改變光標位置,通過鍵盤來改變位置從而修改也極爲麻煩,所以建議退回命令行模式進行修改,在插入模式中。按[ESC]即可完成回退

2.2.命令行模式

可以全局性地對文本進行修改,就像是一個將軍一樣,可以全局指揮軍隊,對每一個士兵(一個字)、每一列士兵(一個行)、每一隊士兵(每一段)進行增刪改查。
具體指令有

1).進入插入模式
按「i」切換進入插入模式「insert mode」,按“i”進入插入模式後是從光標當前位置開 始輸入文件;
按「a」進入插入模式後,是從目前光標所在位置的下一個位置開始輸入文字;
按「o」進入插入模式後,是插入新的一行,從行首開始輸入文字。

3). 移動光標
vi 可以直接用鍵盤上的光標來上下左右移動,這一點和普通文本編輯器一樣
按「ctrl」+「b」:屏幕往“後”移動一頁。
按「ctrl」+「f」:屏幕往“前”移動一頁。
按「ctrl」+「d」:屏幕往“前”移動半頁。
按「G」:移動到文章的最後。
按「$」:移動到光標所在行的“行尾”。
按「w」:光標跳到下個字的開頭
按「b」:光標回到上個字的開頭
按「#l」:光標移到該行的第#個位置,如:5l,56l。

4). 刪除文字
「x」:每按一次,刪除光標所在位置的“後面”一個字符。
「#x」:例如,「6x」表示刪除光標所在位置的“後面”6 個字符。
「X」:大寫的 X,每按一次,刪除光標所在位置的“前面”一個字符。
「#X」:例如,「20X」表示刪除光標所在位置的“前面”20 個字符。
「dd」:刪除光標所在行。

5). 複製
「yw」:將光標所在之處到字尾的字符複製到緩衝區中。
「#yw」:複製#個字到緩衝區
「#yy」:例如,「6yy」表示拷貝從光標所在的該行“往下數”6 行文字。
「p」:將緩衝區內的字符貼到光標所在位置。注意:所有與“y”有關的複製命令都必須與“p”配合才能完成複製與粘貼功能。

6). 替換
「r」:替換光標所在處的字符。

7). 回覆上一次操作
「u」:如果誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次“u”可 以執行多次回覆。

8). 更改
「cw」:更改光標所在處的字到字尾處
「c#w」:例如,「c3w」表示更改 3 個字 9). 跳至指定的行
「ctrl」+「g」列出光標所在行的行號。
「#G」:例如,「15G」,表示移動光標至文章的第 15 行行首。

2.3.底行模式

底行模式只能由命令行模式進入,在命令行輸入:即可進入,把:刪除即可回退到命令行模式。
底行模式是對文件自身做管理的,可以用來保存文件,退出vi等,下面是相關操作
A) 列出行號
「set nu」:輸入「set nu」後,會在文件中的每一行前面列出行號。

B) 跳到文件中的某一行
「#」:「#」號表示一個數字,在冒號後輸入一個數字,再按回車鍵就會跳到該行了,如輸 入數字 15,再回車,就會跳到文章的第 15 行。

C) 查找字符
「/關鍵字」:先按「/」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是您想要 的,可以一直按「n」會往後尋找到您要的關鍵字爲止。
「?關鍵字」:先按「?」鍵,再輸入您想尋找的字符,如果第一次找的關鍵字不是想要 的,可以一直按「n」會往前尋找到要的關鍵字爲止。

D) 保存文件
「w」:在冒號輸入字母「w」就可以將文件保存起來。

E) 離開 vi
「q」:按「q」就是退出,如果無法離開 vi,可以在「q」後跟一個「!」強制離開 vi,此情況不能保存文件
「wq」:一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。

雖然vi的命令很多,但是都很簡單。記得以前老師說過,對於一個熟悉命令行操作的程序員,命令行操作其實比GUI快很多,只要熟悉了Vi的使用,我們可以更加高效地編程

java

之前學過c++,這次接觸java,感覺莫名的熟悉(我好像在哪見過你)。但我更加傾向於說java和c#更像,因爲在我的感覺裏,java就是所有東西都是對象。學過c++其實java很多東西都已經掌握了,比如聲明變量,循環、條件語句,類的繼承,泛化等等,就不細說。java有一個缺點,就是幫助我們做了太多的事情了,以至於達到了沒有java沒做到的,只有我們想不到的,以至於我們可能基礎代碼的編程能力會有所下降,哈哈,不開玩笑了。雖然java與c++,c#等語言類似,但是還是有很多不同之處,下面說一下我的發現

1.如何寫一個HelloWorld

正如我說的,java中所有東西都是對象,所以我們編寫一個HelloWorld自然也需要建立一個類,我們首先先用vi創建一個HelloWorld.java,寫上如下代碼

這裏寫圖片描述

注意,這裏的類名必須和文件名相同,System.out.println()就和cout的功能相似,這裏的main函數是static類型,當運行這個類時,系統就會自動調用main函數,每個類都可以擁有main函數,看具體需求而定。
保存以後在命令行中進入文件所在目錄
輸入
javac HelloWorld.java
這個就是編譯的意思,如果沒有出錯的話,會生成一個class文件
然後輸入
java HelloWorld
就可以看到程序被執行
這裏寫圖片描述

2.基本數據類型

把bool改成了boolean。
令我關注到的是,int、long、char有對應的Interger、Long、Character的對象類型,還有一個最基本的類型byte,還有一點值得注意,兩個實例化的Interger對象賦予相同的值,當值在-128到127之間,因爲最佳優化效果,兩個對象用了相同實例,所以相當,但是在這個範圍之外,兩個Interger對象雖然數值相同,但嚴格意義上來說是不同的兩個實例,所以不會相等。這些數據對象的出現,爲裝箱與拆箱提供了巨大的幫助。

3.數組

首先聲明就變得不一樣了
c++:int array[20];
java:int[] array = new int[20];
java中的數組也有一個類Array,從它可以實例化出各種基本數據組成的類,可以看出Array把泛化做到了出神入化。因爲被封裝成了類,它已經幫我們實現了很多功能,如Arrays.equals()可以比較兩個數組,Arrays.toString()可以把一個數組以字符串的形式打印,自然,Arrays.sort()也肯定會出現,這使得我們對數組的操作更加快捷方便

4.對象

正如我所說的,java中處處有對象,小到int,double,array有對象,大到我們自定義的類,java這種完完全全式的面向對象把任何東西都封裝好了,我們要用某個類的話,直接import進來就好(與#include相似)
注:聲明對象的時候記住new,不然就只是一個該類型的null

5.String類型

注意這裏是String不是string,曾經在c++中拜倒在string石榴裙下的我再次使用java的String時,發現遍歷失敗,沒有腳標訪問法時我的內心是複雜的。後來發現原來是虛驚一場,String有charAt(int index)和腳標訪問一樣。更棒的是,由於大家都是對象(又是這個問題),String可以之間轉換成爲數字,如

String   s   =   "123.456 ";  //要確保字符串爲一個數值,否則會出異常
double   d   =   Double.parseDouble(s); 
float   f   =   Float.parseFloat(s);

我們要做的只是提前判斷一下這個字符串能否變爲合法數字即可

6.繼承

這個和c#類似,超類的問題,c++可以繼承很多個類,這樣我覺得繼承來繼承去很容易昏,而java只能繼承一個父類(超類)

7.多態

java是單繼承,這就爲java的多態提供了很好的前提,我們用c++的時候子類可以用父類創建,父類不能用子類創建這在java中雖然一樣,但是我們知道(沒記錯的話)c++中子類一旦用父類創建,那麼就只會保存父類擁有的信息,會造成子類相關信息的丟失,而java完美的解決了這個問題,使得程序具有了良好的擴展性。

8.垃圾收集器

曾經我每次new一個數據對象時,總會習慣性地在main函數末尾先寫一個delete,生怕最後因爲忘記delete而導致資源的浪費。對於一個new的數據,判斷它何時以後不會再用也是十分複雜。這個困擾我許久的問題,在我初次看到java時卻變得不屑,一個System.gc()就會自動回收垃圾,或者把引用值改爲null,這在c++是不敢想象的,因爲一旦改爲null值,之前這個引用所指的空間,就失蹤了,系統也永遠找不到它,十分可怕。

9.接口

作爲一個比抽象類更抽象的存在,接口真的很難懂,這是爲了彌補單繼承不能繼承多個父類特性的缺點而產生的,接口中只有抽象方法和公有成員變量,抽象方法會等到別的類使用這個接口的時候去實現,爲多態提供了顯著的幫助

java作爲現在最受寵愛的語言,與它面向對象的特點密不可分,通過之前學習的語言鋪墊,我很有信心學好它

Ant

剛看到ant我就一臉懵。ant?螞蟻?操作系統的恐龍書,java編程的小螞蟻,勵志成爲程序猿的我?學個計算機都可以開動物園了?

其實ant和makefile類似,都是定義一系列規則來指定哪些文件需要先編譯,哪些文件需要後編譯,哪些文件需要重新編譯之類的。可以理解爲,ant就是告訴系統我這個工程該如何編譯,而如何編譯的這一系列instructions就是我們工程創建者的工作了,一般都是用xml語言來編寫,首先簡單介紹一下xml的一些知識

xml

和html類似,都是標籤式語句

1.project

  • default:指定project默認從哪個target(以name確定)開始執行
  • basedir:指定基礎路徑位置

2.target

基本執行單元

  • depends:依賴關係,說明了執行這個target的先決條件,系統會先執行depends的target

    3.property

  • name:屬性的名稱

  • value:屬性的值

類似於定義變量,要用到value的時候就寫${name}即可

4.jar

用於生成jar文件,jar文件即將我們寫的java程序打包後得到,可以直接被別的程序用

5.javac

用於編譯
- srcdir:源程序的目錄
- destdir:class文件生成目錄

6.java

用於運行

  • classname:將執行的類名
  • classpath:所用到類的路徑

實際操作

我們來實際操作一下,首先創建一個Ant文件夾
在AntTest文件夾中創建src文件夾,在src文件夾中創建test文件夾,再在test文件夾中創建ant文件夾,文件目錄是這樣的
這裏寫圖片描述

在這個文件夾中創建HelloWorld.java

package test.ant;

public class HelloWorld {

    String str;
    public void SayHello() {
        str = "Hello World";
    }

    public void clear() {
        str = "";
    }

    public String GetStr() {
        return str;
    }

    public static void main(String args[]) {
        System.out.println(str);
    }
}

再回到與src相同目錄下,創建build.xml

<project name="Ant" default="run" basedir=".">

    <property name="src" value="src"/>
    <property name="des" value="classes"/>
    <property name="HelloWorld_jar" value="HelloWorld.jar"/>

    <target name="init">
        <mkdir dir="${des}"/>
    </target>

    <target name="compile" depends="init">
        <javac srcdir="${src}" destdir="${des}" includeantruntime="on"/>
    </target>

    <target name="build" depends="compile">
        <jar jarfile="${HelloWorld_jar}" basedir="${des}"/>
    </target>

    <target name="run" depends="build">
        <java classname="test.ant.HelloWorld" classpath="${HelloWorld_jar}"/>
    </target>

    <target name="clean">
        <delete file="${HelloWorld_jar}"/>
        <delete dir="${des}"/>
    </target>

</project>

這裏build是ant默認的文件,所以要用這個名字,在這裏run過程用了HelloWorld.jar這個包,其實就是調用了HelloWorld的main函數

我們在與src相同的目錄下輸入ant
這裏寫圖片描述

然後我們會發現該目錄生成了classes文件夾,裏面有class文件,同時產生了一個jar包,是自動生成的,run的程序也成功,一個ant實驗就這樣完成了。

Junit

我以前每寫完一個類,如果要驗證這個類的方法是否寫得正確,就很麻煩了,要自己寫一個main函數,new一個對象,然後寫一些測試代碼,這樣顯然十分麻煩,所以大多時候直接不檢查,然後到要用的時候,一大堆問題報錯,炸了。Junit可以很便捷地驗證一個類是否寫得正確,我們用個一小實驗來說明

首先用eclipse創建一個名爲Junit的java工程
在package視圖中右鍵點擊工程進入屬性
這裏寫圖片描述

進入Java Build Path,點擊Add Library,添加Junit4的庫

在src上new一個class取名爲HelloWorld

import java.util.*;

public class HelloWorld {

    String str;
    public void SayHello() {
        str = "Hello World";
    }

    public void clear() {
        str = "";
    }

    public String GetStr() {
        return str;
    }

    public static void main(String args[]) {
        System.out.println(str);
    }
}

在Package中右鍵點擊HelloWorld.java new一個JUnit Test Case
這裏寫圖片描述

創建名爲HelloWorldTest,勾選想要測試的函數
在HelloWorldTest中寫

import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.Ignore;

public class HelloWorldTest {

    private HelloWorld hello = new HelloWorld();

    @Before
    public void setUp() throws Exception {
        hello.clear();
    }

    @Ignore("SayHello() no need to test")

    @Test
    public void testGetSrt() {
        assertEquals("Hello World", hello.GetStr());
    }

}

測試必然需要實例化一個對象,@Before表示下面這個函數是測試之前做的第一步,在這裏我們對hello進行了clear操作,@Ignore表示不測試這個,忽略的意思。@Test就是表示要測試,在這裏我們測試了hello的GetStr方法,看它返回的是不是字符串“Hello World”
下面我們點擊編譯運行按鈕旁邊的小三角,選擇Run As Junit Test
這裏寫圖片描述

就會看到JUnit視圖出現了
這裏寫圖片描述
這表面我的GetStr函數的效果和我預想相同
還有類似會出現如下情況
這裏寫圖片描述

Summary

我對這些東西都還十分陌生,還有很多等着我去探索,我將更深入的學習,提升自己

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章