#Vi,java,Ant,Junit学习笔记

来源:互联网 发布:按键精灵文字输出源码 编辑:程序博客网 时间:2024/06/11 05:14

为了更好地完成实训,学习了Vi,java,Ant,Junit的一些基本用法。
下面说一说我对它们的认识


目录

  • Vi
    • 分离式的三种模式
    • 易于理解的操作
      • 进入
      • 1插入模式
      • 2命令行模式
      • 3底行模式
  • java
    • 如何写一个HelloWorld
    • 基本数据类型
    • 数组
    • 对象
    • String类型
    • 继承
    • 多态
    • 垃圾收集器
    • 接口
  • Ant
    • xml
        • project
        • target
        • property
        • jar
        • javac
        • java
    • 实际操作
  • Junit
  • Summary


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

我对这些东西都还十分陌生,还有很多等着我去探索,我将更深入的学习,提升自己

0 0