实训大二

Vi,Java,Ant,Junit自学报告

Vi编辑器

简介:

      Vi编辑器是所有Unix及Linux系统下标准的编辑器,我们只需要在命令行中输入vi就可以进入可以进入编辑界面。Vi编辑器遵循简单原则,不支持代码补全功能,所有的操作都可以通过命令来进行,使用它可以使我们在shell窗口就可以进行文件的编辑操作,而不需要另外打开其他软件。就是说,代码的编辑、编译和运行都可以在shell窗口上完成,熟练地使用vi,能够大大提高我们编程的速度。另外,vi也是Linux中最基本的文本编辑器,学会它后,我们将在Linux的世界里畅行无阻。

三种模式

不同于sublime、Notepad++等图形化编辑器,vi提供了三种模式。

  • 命令行模式:
    控制屏幕光标的移动,字符、字或行的删除,移动赋值某区段及进入插入模式下,或者到底行模式。刚进入vi界面的时候就是命令模式。
  • 插入模式:
    在插入模式下可以进行文本的输入,按【ESC】键可回到命令行模式。
  • 底行模式:
    对文件进行操作,保存和退出等,也可以寻找字符串、列出行号等。

基本操作

  • 进入vi界面
    进入vi很简单,只需在命令行中输入vi,然后回车即可,但是,这样子是新建一个默认的文件,想要打开某个文件或者新建一个有名字的文件,只需要输入vi filename,相对于其他的编辑器,进入vi简单多了,但是,进入vi后默认是命令行模式。
  • 进入插入模式
    在命令行模式下我们是不能进行文本编辑的,要进行编辑,就要进入插入模式,进入后,就可以像我们平时那样编辑文本了,进入插入模式有三种方法:a、按[i]键进入,进入后从光标当前位置开始输入文件;b、按[a]键进入,从目前光标所在位置的下一个位置开始输入文字;c、按[o]进入,插入新的一行,从行首开始输入文字。
  • 进入命令行模式
    当我们输入错误,需要删除的时候,就得进入命令行模式,在插入模式下,进入命令行模式只需按一下[ESC]键就好;在底行模式下,则只需把“:”删掉就行了。
  • 进入底行模式
    当我们要对文件进行保存或者退出vi的时候,就要进入底行模式,想要进入底行模式,只需在命令行模式(也只能在命令行模式下进入)下,输入[:]即可,在“:”后面输入具体的操作。

命令行模式下的具体操作

  • 移动光标
    vi支持像其他编辑器那样用方向键来移动,此外,也可以用h、j、k、l来实现光标的左、下、上、右的移动。 ctrl + b:屏幕往“后”(back)移动一页。
    Ctrl + f:屏幕往“前”(front)移动一页。
    Ctrl + u:屏幕往“后”移动半页。
    Ctrl + d:屏幕往“前”移动半页。
    G:跳到文章末尾
    $:将光标移动到行尾。
    ^:光标移动到行首。
    w:移动到下个字开头。
    e:移动到下个字结尾。
    b:移动到上个字开头。
    #l:移动到改行第#个位置。
  • 文字删除
    x:删除光标所在位置后面的一个字符。
    #x:删除光标后面#个字符。
    X:删除光标前面一个字符。
    #X:删除光标前面#个字符。
    dd:删除光标所在的那一行。
    #dd:从光标所在行开始删除#行。
  • 复制粘贴
    yw:复制光标所在处到字尾的字符。
    #yw:复制#个字符。
    yy:复制当前行。
    #yy:复制从当前行开始的#行。
    p:粘贴。
  • 替换
    r:替换光标所在处的字符。
    R:命令行下面会出现“替换”字样,可一直替换字符,直到按下[Esc]键。
  • 撤销
    u:相当于平时用的Ctrl+z,撤销上一次操作,可多次撤销。
  • 其他
    Ctrl + g:列出光标所在行的行号。
    #G:光标移动到#行的行首。

底行模式下的具体操作

set nu:在每行的前面显示行号。
#:在底行模式下,输入#(一个数字)再加回车,即可使光标跳到#行的行首。
/关键字:先输入/,再输入所需要查找的关键字,按[n]可往后寻找下一个,直到寻找到你所需要的。
?关键字:和/相似,只是输入[n]的时候,是向前寻找下一个。
w:保存文件。
q:退出vi。
!q:强制退出,当无法离开的时候,可以选择强制退出,只是,文件不会保存。
wq:保存并退出。

JAVA

      由于大二上学期我的专选课就是Java,这次,就当是对Java的一个复习吧。之前很多人都说Java是C++的升级版,其实,我觉得,C++是从面向过程到面向对象的一个过渡语言,而Java则完全是面向对象的语言,也不能说Java就是C++的升级吧,这只是高级语言的一个演变趋势。另外,在很多方面,Java和C#是真的很类似,很多时候只是关键字的不同,语法有很多都是一样的。Java有很多内置的包和类,每个类都有很多方法,很多操作都不需要我们自己去实现了,但是,这次实训没有eclipse这些集成环境,失去了代码补全功能,想要编写Java程序,可能免不了要经常查看API文档了。

概述

      Java和C++一样,也有封装,继承和多态,但是,Java没有面向过程的编程,所有的动作都是面向对象的。即使是数据类型,在Java的处理机制中,也是对象的存在,但是,考虑到很多人都熟悉C++的环境,就保留了一些基本的数据类型。除此之外,Java还支持多线程编程和网络编程,以及Java的图形界面编程也方便许多。

基础

      首先是编译和执行,以HelloWorld.java程序为例。

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

通过
javac HelloWorld.java
得到class文件,然后,再通过命令
java HelloWorld
来运行程序。
      java保留了c++所有的基本类型,只是,bool类型的关键字改成了boolean,此外,java将string类型封装成了String类。java中没有了指针类型,不允许程序员直接对内存进行操作,java的数组声明改为了Type[] arrayName = new Type[SIZE];这种形式。另外,java的所有运算符都与C++的一样,优先级也一样。在java中,常数的声明为final,用法与C++的const关键字一样。
      Java还有个package的概念,相当于C++的头文件或者说命名空间,当我们需要用到一个package中的类时,必须把这个package用import关键字说明。

面向对象

      java面向对象的属性也和C++类似。在java中,对象的存储地址是在堆内存中的(即对象的实例化都需要用new关键字),由此,java中对象的传递都是引用传递,而基本类型的传递才是值传递。
继承:
      在Java中,继承不再使用“:”,而是使用extends关键字,使用方法为:
class SonClass extends Parent {}
Java采用单继承模式,也就是说,一个派生类最多只能继承一个父类,当然,这个父类也可以继承自另一个类。在java中,所有的类都是继承与Object这个类。关于继承之后各种方法的访问权限,是和C++一样的,方法隐藏和方法重写的概念亦和C++相同。但是,java中子类调用父类的构造函数要使用super()方法,简单得说,就是把super()当做了父类的构造函数来使用,而且,super()必须放在子类的构造函数中,且是子类构造函数里的第一个语句。

多态:

  • Java多态的使用与C++类似,主要是以继承为基础。但是,java的单继承模式使得我们用父类类型来创建子类的时候,不会导致子类的信息丢失。此外,java也有动态绑定和静态绑定的概念,具体和C++类似。java中,static方法也可以被继承,但是,static方法不可以被重写,也没有多态性质。java还引入了instanceof关键字,使用如下:
    p instanceof Student
  • 其中,如果p是由Student类或者它的父类实例化而来,返回结果为true,否则为false,instanceof关键字的存在,方便了多态的使用。
  • Java定义了抽象方法,在方法声明前面加上关键字abstract即可,抽象方法不需要在当前类实现,另外,抽象方法必须放在抽象类中,抽象类的声明只需在class关键字前面加上abstract关键字,抽象类不可以进行示例化,一般用来做父类,且子类若需要实例化必须先实现父类的抽象方法。抽象方法必须放在抽象类中,抽象类中可以没有抽象方法。

接口:
      Java定义了接口类型,关键字为interface,接口的定义我也不知道怎么说,课件上的定义就是:Objects define their interaction with the outside world through the methods that they expose。接口实际上相当于一个所有方法都是抽象方法的抽象类。定义接口与定义类相似,将定义类时的关键字class改成interface即可,此外,接口中所有方法都只作声明,不能实现,但不需要加abstract关键字。接口不能直接实例化,只能被继承,通过子类来实现实例化,实例化的子类必须实现接口的所有方法。一个类继承接口使用implements关键字,且一个类可以继承多个接口,这弥补了类之间单继承模式的缺陷。
容器:
Java内部定义了许多容器,所有容器最终都继承自Collection类,具体容器的种类及其关系请看下图,这里就不细说了。容器中大部分的方法和C++差不多,有时候忘记了,直接查API文档就好。
这里写图片描述

其他

      除了上面的那些基础知识外,Java还有I/O流、多线程、网络编程以及图形界面等知识,考虑到这些内容相对比较复杂,在这里也很难表述清楚,就不再多说了。

Ant

简介

      Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能。Ant文件的后缀名是xml,通过各种标签来对项目进行编译运行等处理,Ant的格式类似于HTML,所以,真正学起来也不难。而且,用ant来对项目进行自动构建和部署,能节省我们许多开发时间。

基础

      通常情况下,Ant构建文件build.xml(ant的文件必须命名为build.xml)应该在项目的基础目录。可以自由使用其他文件名或将构建文件中其他位置。现在,来看一下一个简单的输出信息。

<?xml version="1.0"?>
   <project name="Hello World Project" default="info">
   <target name="info">
      <echo>Hello World - Welcome to Apache Ant!</echo>
   </target>
</project>

      注意,所有构建文件都要求有项目元素和至少一个目标元素。上述代码中,project是项目元素标签,里面的name是指项目名称,default是项目默认执行的target,target是目标元素,echo标签里是输出的信息。使用ant文件时,只需到达根目录下,输入ant targetName即可,当输入ant时,执行的是默认目标。下面来看下一段代码。

<target name="deploy" depends="pacakge">
  ....
</target>
<target name="pacakge" depends="clean,compile">
  ....
</target>
<target name="clean" >
  ....
</target>
<target name="compile" >
  ....
</target>

      上述代码中,depends属性是指target的依赖性,当执行一个target时,这个target要先执行其所依赖的target,例如,要执行package这个目标,会先执行clean和compile这两个target。
目标元素的常用属性:

属性 描述
name The name of the target (Required)
depends Comma separated list of all targets that this target depends on.
description A short description of the target.
if Allows the execution of a target based on the trueness of a conditional attribute.
unless Adds the target to the dependency list of the specified Extension Point. An Extension Point is similar to a target, but it does not have any tasks.

搭建

      与其在这干说,不如直接来看一下部署EasyCalculator这个小项目的xml文件。

<?xml version = "1.0"?>
<project name = "Calculator" default = "run">
    <property name = "build.classes.dir" location = "build/classes"/>
    <property name = "src.dir" location = "src"/>
    <property name = "lib.dir" location = "lib"/>

    <path id = "compile.path">
        <pathelement location = "${lib.dir}/junit-4.9.jar"/>
    </path>

    <target name = "clean">
        <delete dir = "${build.classes.dir}"/>
        <mkdir dir = "${build.classes.dir}"/>
    </target>
    <target name = "compile">
        <javac srcdir = "${src.dir}" destdir = "${build.classes.dir}" classpathref="compile.path" includeantruntime="true">
        </javac>
    </target>
    <target name = "run" depends = "clean, compile">
        <java fork = "true" classname="EasyCalculator">
            <classpath path="${build.classes.dir}"/>
        </java>
    </target>
    <target name = "junit" depends="compile">
        <junit printsummary="true">
            <classpath path="${build.classes.dir}">
                <path refid="compile.path"/>
            </classpath>
            <test name="EasyCalculatorTest"/>
        </junit>
    </target>
</project>

      上面代码中,可以看出默认执行的target是run。property标签相当于变量声明,name属性是变量的名字,在这里,由于这三个变量都是用于处理文件夹的,所以,后面用location属性来指明其位置,若是其他的,也可以用value属性来赋值。后面的path标签处理的是文件的路径,id是标识,pathelement是具体路径下的文件。需要使用变量的使用,用${name}的格式。
      上面有四个target。第一个target是clean,其中,delete标签的作用是删除文件夹,mkdir标签的作用是建立文件夹。第二个target是compile,进行项目的编译处理,其中,javac标签是编译指令,srcdir属性是需要编译的代码所在的位置,destdir是编译好的class文件所放置的位置。第三个target是run,执行指令,这个target依赖于clean和compile,其中,java标签是执行命令,fork可理解为线程或者进程,表示在一个新的虚拟机内运行这个程序,classname是要运行的类的名字,classpath是类的路径。第四个任务是执行Junit指令。
      除了可以部署java项目之外,ant还可以用来创建jar文件,打包应用等,并且可以继承在eclipse上。

Junit

简介

      JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。

功能

  • 断言测试预期结果。
  • 测试功能共享通用的测试数据。
  • 测试套件轻松地组织和运行测试。
  • 图形和文本测试运行。

搭建

      一个简单的Junit测试类如下:

import static org.junit.Assert.*;
import org.junit.Test;
public class SayHelloTest {
    public void setUp() throws Exception {
    }
    @Test
    public void testMain() {
        new SayHello();
    }
}

      当我们运行这个类的时候,就会测试@Test注解下的那个函数。现在,先来看一下Junit常见的注解:

注解 描述
@Before 该方法必须在类中的每个测试之前执行,以便执行测试某些必要的先决条件。
@After 该方法在执行每项测试后执行
@Test(timeout=xxx) 传入了一个时间(毫秒)给测试方法,如果测试方法在制定的时间之内没有运行完,则测试也失败。
@ignore 当想暂时禁用特定的测试执行可以使用忽略注释。每个被注解为@Ignore的方法将不被执行。

       在把所需要测试的类和用来测试的类编辑好之后,就可以使用Junit来对编辑好的类进行测试了。但是,使用Junit来进行编译的时候,必须导入Junit的jar包,使用命令行编译运行如下:

javac –classpath .:junit-4.9.jar SayHelloTest.java
java –classpath .:junit-4.9.jar –ea org.junit.runner.JUnitCore SayHelloTest

      Junit的运行往往使用ant来搭建,如上面的xml文件搭建的Calculator类的执行,执行结果如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/ShenDW818/article/details/79947258