Vi,Java,Ant和Junit的自学报告

这篇博客详细介绍了vi编辑器的三种工作模式、使用技巧,接着讲述了Java语言的基础概念、编写HelloWorld及计算器程序。然后,文章探讨了Ant构建工具的原理与使用,并展示了如何通过Ant编译Java程序。最后,博主分享了Junit单元测试框架的学习,包括其注解和断言,并演示了如何结合Ant进行测试。

一、vi学习

vi是什么

vi(Visual Interface的缩写,即可视化接口)编辑器是Unix及Linux系统下标准的编辑器,vim是vi的增强版,具有语法着色功能。

vi的工作模式

命令模式

刚进入vim的时候,默认就是命令模式,在其他模式下通过按ESC键也可进入该模式。该模式可以用于移动光标、删除字、进行复制粘贴等操作。在命令行下输入字母是没有任何显示的,一般是直接按功能键执行命令。

编辑模式

在命令模式下可通过按i、o、a等键进入编辑模式。在编辑模式下,用户输入的任何字符都会录入文件中。可用ESC键回到命令模式。

末行模式

在命令模式下,用户输入“:”即可进入末行模式,此时Vi会在显示窗口的最后一行显示一个“:”作为末行模式的提示符,等待用户输入命令。

如果要从命令模式转换到编辑模式,可以键入命令a或者i;如果需要从文本模式返回,则按Esc键即可。在命令模式下输入“:”即可切换到末行模式,然后输入命令。

vi的打开、关闭及编辑

一般通过vim后跟文件路径及文件名来打开。如果文件存在,则打开编辑文件窗口,如果文件不存在,则创建文件并打开。

在末行模式输入w保存,输入q退出,或直接输入wq或x以保存退出。q!命令可以强制退出,具有管理员权限的话可以通过w!强制保存。

至于编辑的话,常用的命令如下:

  • 进入编辑模式

    i和I: i在光标前插入,I在行首插入

    a和A: a在光标后插入,A在行末插入

    o和O: o在光标所在行下一行插入,O在光标所在行上一行插入

  • 移动光标

    • 逐字符移动

    h:光标向左移动, j:光标向下移动,k:光标向上移动, l:光标向右移动

    H、M、L:光标移动到到可见屏幕第一行(H)、中间行(M)、最后一行(L)

    • 大幅移动

    ^:移动到行, $:移动到行末, G:文档最后一行, gg:文档第一行

  • 删除内容

    X和x:x删除光标后一个字符,X删除光标前一个字符,包含光标位置字符

    dd和 n dd:dd删除所在行,n dd删除指定行数

    d0和D:d0删除光标前本行所有内容,D删除光标后本行所有内容,包含光标位置字符
  • 其他快捷功能
    u:撤销

    ctrl + r:重做

    .:重复执行上一次操作的命令

    yy:复制当前行

    p: 在光标所在位置向下新开一行粘贴

    v 和 V:v选择单个字符,V选择整行

    <<和>>:选择文本之后,向左缩进,向右缩进

以上便是我认为在这次学习过程中可能会高频使用的vim命令。

二、JAVA语言学习

Java是一门面向对象编程语言,具有很多C++和C#的特征,不少语句和C++大同小异,还没有恼人的指针,因此上手不算难事。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点,可以用于编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。

Java还有一点比较好的就是一次编译就能在多个平台上运行,原因是代码与机器之间有一个虚拟机JVM,
它屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。但这也对Java的运行速度稍有影响。

编写Helloworld

以一个helloworld.java程序来开启Java的入门:

public class helloworld{
    static public String str;
    public String GetStr(){
	return str;
    }
    public helloworld(){
        str = "Hello World!";
    }
    public static void main(String[] args) {
        helloworld hape = new helloworld();
        System.out.println(hape.GetStr());
    }
	
}

输入如下命令,编译并运行:

javac helloworld.java
java helloworld

编译是编译成功了,但却提示"Could not find or load main class helloworld",一找原因才知道是没有配置JDK的环境。
由于没有权限,所以只能使用vi ~/.profile来编辑profile。

使用如下命令配置环境变量:

export JAVA_HOME=/home/administrator/Desktop/java1.8
export JRE_HOME=${JAVA_HOME}/jre  
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib  
export PATH=${JAVA_HOME}/bin:$PATH 

完成后使用source ~/.profile使改动生效。再输入java helloworld便能如预期输出hello world了。

在这里插入图片描述

编写计算器小程序

import java.awt.GridLayout;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Calculator extends JFrame{
    private JLabel op1 = new JLabel("+",JTextField.CENTER);
    private JLabel op2 = new JLabel("=",JTextField.CENTER);  
    private JLabel res = new JLabel("",JTextField.CENTER);

    private JTextField num1 = new JTextField("12");
    private JTextField num2 = new JTextField("2");
    
    public Calculator(){
        JFrame frame = new JFrame("Calculator");
        frame.setSize(400, 200);
        frame.setLayout(new GridLayout(2, 5));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        num1.setHorizontalAlignment(JTextField.CENTER);
        num2.setHorizontalAlignment(JTextField.CENTER);
        frame.add(num1);
        frame.add(op1);
        frame.add(num2);
        frame.add(op2);
        frame.add(res);
        
        JButton button1 = new JButton("+");
        frame.add(button1);
        JButton button2 = new JButton("-");
        frame.add(button2);
        JButton button3 = new JButton("*");
        frame.add(button3);
        JButton button4 = new JButton("/");
        frame.add(button4);
        JButton button5 = new JButton("OK");
        frame.add(button5);

        button1.addActionListener(new NormalButt());
        button2.addActionListener(new NormalButt());
        button3.addActionListener(new NormalButt());
        button4.addActionListener(new NormalButt());
        button5.addActionListener(new SpecialButt());

        frame.setVisible(true);
    }

    private class NormalButt implements ActionListener{
		public void actionPerformed(ActionEvent e){
            JButton axe = (JButton)e.getSource();
            String str = axe.getText();
            op1.setText(str);
        }
    }
    
    public boolean isNum(String str){
		return str.matches("^[-+]?(([0-9]+)([.]([0-9]+))?|([.]([0-9]+))?)$");
    }
    
    private class SpecialButt implements ActionListener{
		
    	public void actionPerformed(ActionEvent e){
    		
    		if(!isNum(num1.getText()) || !isNum(num2.getText())){
    			res.setText("Invalid Input!");
    		}else{
				double number1 = Double.valueOf(num1.getText());
				double number2 = Double.valueOf(num2.getText());
				if(op1.getText().equals("+")){
					res.setText(number1 + number2 + "");
				}
				else if(op1.getText().equals("-")){
					res.setText(number1 - number2 + "");
				}
				else if(op1.getText().equals("*")){
					res.setText(number1 * number2 + "");
				}
				else if(op1.getText().equals("/")){
					res.setText(number1 / number2 + "");
				}
			}
		}
	}
    
    public static void main(String[] args){
    	Calculator begin = new Calculator();
    }
}

运行结果:

在这里插入图片描述

感觉java编出来的图形界面和古早的小程序很像,莫名有种获得感(雾)。GridLayout是个好东西,免去了绞尽脑汁计算间距大小的头疼。程序里对于是否浮点数的处理还有点问题,挨个添加按钮的行为也有点低效,往后有时间再琢磨琢磨吧。

三、Ant学习

Ant是什么

Ant是一个Apache基金会下的跨平台的构件工具,它可以实现项目的自动构建和部署等功能,大致相当于以往在写C和C++时用过的makefile,但是上手感觉比makefile更为友好。

Ant的构建文件是基于XML编写的,默认名称为build.xml。

Ant的基本元素

  • project元素

project元素是Ant构件文件的根元素,Ant构件文件至少应该包含一个project元素,否则会发生错误。在每个project元素下,可包含多个target元素。project含有以下属性:

name属性:用于指定project元素的名称。

default属性:用于指定project默认执行时所执行的target的名称。

basedir属性:用于指定基路径的位置。该属性没有指定时,使用Ant的构件文件的附目录作为基准目录。

  • target元素

target元素是Ant的基本执行单元,它可以包含一个或多个具体的任务。多个target可以存在相互依赖关系。它含有如下属性:

name属性:指定target元素的名称,这个属性在一个project元素中是唯一的。我们可以通过指定target元素的名称来指定某个target。

depends属性:用于描述target之间的依赖关系,若与多个target存在依赖关系时,需要以“,”间隔。Ant会依照depends属性中target出现的顺序依次执行每个target。被依赖的target会先执行。

if属性:用于验证指定的属性是否存在,若不存在,所在target将不会被执行。

unless属性:该属性的功能与if属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在target将会被执行。

description属性:关于target功能的简短描述和说明。

  • property元素

property元素可看作参量或者参数的定义,project的属性可以通过property元素来设定,也可在Ant之外设定。

使用Ant实现helloworld的自动编译

我为helloworld.java编写的build.xml如下:

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

    <property name = "src" location = "src"/>
    <property name = "build" location = "build"/>

    <target name = "clean">
        <delete dir = "build"/>
    </target>

    <target name = "init">
        <mkdir dir = "build"/>
    </target>


    <target name = "complie" depends = "init" >
        <javac srcdir = "src" destdir = "build"/>
    </target>

    <target name = "run" depends = "compile">
        <java classname = "helloworld" classpath = "build" />
    </target>

</project>

Ant语句中尖括号<>的使用要当心,我总是忘记匹配好开头和结尾,在ant的时候没少报错。此外一条语句完成一个任务时,结尾要记得加"/"。

运行ant的结果如下:

四、Junit学习

Junit是Java的单元测试框架,用于编写和运行可重复的自动化测试,可以自动运行并且检查自身结果并提供即时反馈。使用Junit不需要创建 main()方法,且是白盒测试。

JUnit注解

JUnit使用注解标注为测试方法并配置它们。

@Test:测试注解,标记一个方法可以作为一个测试用例。

@Before:在每次测试之前执行,一般用于准备测试环境(初始化类等)。

@BeforeClass:在所有测试之前,执行一次。使用该注解标记的方法需要定义为static void。

@After:在每项测试后执行,可用于清理测试环境 (例如删除临时数据,还原默认值等)。

@AfterClass:在所有的测试执行完成之后执行一次。使用该注解标记的方法需要定义为static void。

@Test (expected = Exception.class):如果这个测试方法不抛出赋值的异常(Exception.class)将会失败。
Junit断言

JUnit提供静态方法,通过Assert类来测试某些条件。这些断言语句通常以assert开头,允许你指定错误信息、预期结果和实际结果。断言方法将测试返回的实际值和预期值相比较。如果比较失败就会抛出AssertionException异常。

都说会被高频使用的断言:

void assertTrue([String message],boolean condition)

断言一个条件为真

void assertFalse([String message],boolean condition)

断言一个条件为假

void assertEquals([String message],expected value,actual value)

断言两个值相等。expected和actual类型可以是int,short,long,byte,char,Object,第一个参数是一个可选字符串消息

void assertNull([String message],java.lang.Object object)

断言一个对象为空

void assertNotNull([String message],java.lang.Object object)

断言一个对象不为空

void assertSame([String message],java.lang.Object expected,java.lang.Object actual)

断言expected和actual是同一个对象

void assertArrayEquals([String message],expectedArray, resultArray)

断言两个数组内容相同,数组类型可以是int,short,long,byte,char等。

利用Ant、Junit测试通过HelloWorld

先写一个测试的java文helloworldTest.java:

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

public class helloworldTest 
{
    public helloworld hola = new helloworld();
    @Test
    public void testHello() 
    {
	assertEquals("Hello World!", hola.GetStr());
    }
}

用如下命令编译并运行之,得到测试结果:

javac helloworldTest.java
java org.junit.runner.JUnitCore helloworldTest

在这里插入图片描述

附上此时profile中已经配置的环境变量:

在这里插入图片描述

Ant和Junit结合在一块,整出新的build.xml。为了看起来更有层次感一点,增加了一些文件夹的设置。P.S.云桌面上的junit.jar有猫饼,使用它就愣是报错,于是我换成了另一个junit-4.10.jar,药到病除。

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "helloworld" 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.10.jar" />
  </path>

    <target name = "reset">
      <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 = "reset, compile">
      <java fork = "true" classname = "helloworld">
        <classpath path = "${build.classes.dir}" />
      </java>
    </target>

  <target name = "test">
	  
    <junit printsummary = "true">
      <classpath path = "${build.classes.dir}">
        <path refid = "compile.path" />
      </classpath>
      <test name = "helloworldTest" />
    </junit>
  </target>

</project>

完成之后,ant命令仍然是可以编译运行helloworld.java,而使用ant test命令便能实现Junit的测试。测试结果如下:

在这里插入图片描述

至此,对于Vi,Java,Ant和Junit的学习暂时先告一段落。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值