阶段一 Vi,Java,Ant和Junit的自学报告
vi/vim 学习
vi/vim是Linux系统下的文本编辑器,可以比较方便地进行文本编辑(相较于直接打开文件编辑),除此以外,它还可以作为一个程序开发工具来使用。
下面展示一下我的vi/vim自学报告。
我所参考的内容链接如下——Linux下使用vi/vim。
Linux下使用vi/vim主要有以下三种模式
-
命令模式(command mode)
在用户刚刚启动 vi/vim时,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。
以下是常用的几个命令:
- i 切换到输入模式,以输入字符;
- x 删除当前光标所在处的字符;
- : 切换到底线命令模式,以在最底一行输入命令。
-
输入模式(Insert mode)
在命令模式下按下i就进入了输入模式。在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符;
- ENTER,回车键,换行;
- BACK SPACE,退格键,删除光标前一个字符;
- DEL,删除键,删除光标后一个字符;
- 方向键,在文本中移动光标(鼠标不能移动光标;
- HOME/END,移动光标到行首/行尾;
- Page Up/Page Down,上/下翻页;
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线;
- ESC,退出输入模式,切换到命令模式。
-
底线命令模式(Last line mode)
在命令模式下按下“:”(英文冒号)就进入了底线命令模式。
其中比较常用的命令有:
- w 保存文件;
- q 退出程序;
- ESC 退出底线命令模式。
有如下一个简略图展示这三种模式
实例展示
首先输入命令 vim filePath 打开示例文件:
可以看到打开的文件内容为
此时,直接输入 x 会把当前光标所在的字符删除,并且进入到输入模式,可以对文件进行编辑。
按ESC退出之后,再输入 i ,可以看到又进入了输入模式,现在我再文档末尾输入"I have changed this file"
最后,ESC退出,输入":",再输入 wq ,保存并退出。
这时,文件已经编辑完成了,再次打开文件验证是否修改成功。
显然,这时已经修改成功了。
JAVA 学习
这一部分不是简单的几句话就可以说明白的,特别是对于我这种刚接触JAVA语言的人来说,只能总结一些我所认识到的重点,并列举出来。
这里是我所参考的几个网站地址:菜鸟教程,JAVA快速教程
JAVA语言的特性
-
Java语言是简单的:
Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。 -
Java语言是面向对象的:
Java语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 -
Java语言是可移植的:
这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。 -
Java语言是多线程的:
在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。
JAVA的包
为了更好地组织类,Java 提供了包机制,用于区别类的命名空间。
它的作用主要是:
- 1、把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
- 2、如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,应该加上包名加以区别。因此,包可以避免名字冲突。
- 3、包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
包语句的语法格式为:
package pkg1[.pkg2[.pkg3…]];
JAVA的GUI
考虑到在这一阶段需要完成一个简单计算器,这一部分的实现显然是离不开GUI的实现的,所以在这里就先把GUI部分的内容总结一下。
首先是几个主要的包:
-
java.awt 包 – 主要提供字体/布局管理器
-
javax.swing 包[商业开发常用] – 主要提供各种组件(窗口/按钮/文本框)
-
java.awt.event 包 – 事件处理,后台功能的实现。
介绍关于按钮、文本框等的实现
GUI部分的内容是非常多的,但是在这一次的项目中我们只涉及到一部分,我就挑一些内容记录下来,其他的会在接下来的实现计算器中更详细地分析。
- 按钮的实现
JButton button1 = new JButton(“text”); - 创建标签
JLabel label1 = new JLabel(“text”); - 创建窗口
JFrame frame = new JFrame(“text”);
frame.setDefaultLookAndFeelDecorated(true); //外观
frame.pack(); //显示窗口
frame.setVisible(true); //设置可见
frame.add(panel); //添加panel面板到容器
除此以外还有很多内容,更多具体的操作可以参考这个博客,这里就不再多说了。
实现我的第一个JAVA程序——hello world
首先编写如下的helloworld.java程序:
//package helloworld
public class helloworld {
public static void main( ) {
System.out.print("hello world\n");
}
}
然后编译运行如下
Ant 学习
关于ant
Ant是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。在实际软件开发中,有很多地方可以用到ant。
它的优点有:
- 跨平台性:Ant是纯Java语言编写的,所以具有很好的跨平台性。
- 操作简单:Ant是由一个内置任务和可选任务组成的,用ant任务就像是在dos中写命令行一样。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。
- 维护简单、可读性好、集成简单:由于Ant构建文件 时XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
Ant的使用方法
使用ant时,直接输入ant命令就可以进行文件编译了。Ant以build.xml为默认文件,当不存在build.xml时,Ant会报错。
如下所示:
当然,也可以通过指令ant -buildfile filename.xml来指定某一文件来编译。
Ant脚本:使用节点、元素和属性、命令指令
-
project 节点元素
project 元素是 Ant 构件文件的根元素, Ant 构件文件至少应该包含一个 project 元素,否则会发生错误。在每个 project 元素下,可包含多个 target 元素。- 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 之外设定。- property 元素可用作 task 的属性值。在 task 中是通过将属性名放在${属性名}之间,并放在 task 属性值的位置来实现的。
- Ant 提供了一些内置的属性,它能得到的系统属性的列表与 Java 文档中 System.getProperties() 方法得到的属性一致
- 同时, Ant 还提供了一些它自己的内置属性,如下:
basedir: project 基目录的绝对路径;
ant.file: buildfile的绝对路径
ant.version: ant版本
ant.project.name: 当前指定的project的名字,即前文说到的project的name属性值;
ant.java.version: Ant 检测到的JDK版本 。
-
copy命令
copy主要用来对文件和目录的复制功能。举例如下:
● 复制单个文件:
<copy file="old.txt" tofile="new.txt"/>
● 对文件目录进行复制:
<copy todir="../dest_dir">
<fileset dir="src_dir"/>
</copy>
● 将文件复制到另外的目录:
<copy file="src.txt" todir="c:/base"/>
- echo 命令
该任务的作用是根据日志或监控器的级别输出信息。它包括 message 、 file 、 append 和 level 四个属性,举例如下
<echo message="ant message" file="/logs/ant.log" append="true">
-
jar 标签节点元素
该标签用来生成一个JAR文件,其属性如下:- destfile表示JAR文件名;
- basedir表示被归档的文件名;
- includes表示别归档的文件模式;
- exchudes表示被排除的文件模式;
- compress表示是否压缩。
-
javac 标签节点元素
该标签用于编译一个或一组java文件,其属性如下- srcdir表示源程序的目录,destdir表示class文件的输出目录;
- include表示被编译的文件的模式;
- excludes表示被排除的文件的模式;
- classpath表示所使用的类路径;
- debug表示包含的调试信息;
- optimize表示是否使用优化;
- verbose 表示提供详细的输出信息;
- fileonerror表示当碰到错误就自动停止。
-
java 标签节点元素
该标签用来执行编译生成的.class文件,其属性如下:- classname 表示将执行的类名
- jar表示包含该类的JAR文件名
- classpath所表示用到的类路径
- fork表示在一个新的虚拟机中运行该类
- failonerror表示当出现错误时自动停止
- output 表示输出文件
- append表示追加或者覆盖默认文件
实际上,关于Ant的使用还有很多值得我们去注意的方面,而我只是简单的了解了一些初步的东西,更多的内容可以参考这篇博客。
Ant实现hello world的自动编译
<?xml version="1.0" ?>
<project name="helloworld" default="run" basedir=".">
<property name="dest" value="classes" />
<property name="hello_jar" value="hello.jar" />
<target name="clean">
<delete dir="${dest}" />
</target>
<target name="init" depends="clean">
<mkdir dir="${dest}" />
</target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="${dest}" />
</target>
<target name="build" depends="compile">
<jar jarfile="hello_jar" basedir="${dest}" />
</target>
<target name="run" depends="build">
<java classname="helloworld" classpath="${hello_jar}" />
</target>
</project>
JUnit学习
什么是JUnit
JUnit是一个Java语言的单元测试框架,使用 Junit 能让我们快速的完成单元测试。
JUnit常用注解
- @Test:测试注解,标记一个方法可以作为一个测试用例;
- @Before:Before注解表示,该方法必须在类中的每个测试之前执行,以便执行某些必要的先决条件;
- @BeforeClass:BeforeClass注解指出这是附着在静态方法必须执行一次并在类的所有测试之前;
- @After:After注释表示,该方法在每项测试后执行;
- @AfterClass:当需要执行所有测试在JUnit测试用例类后执行。
JUnit常用断言
- assertEquals([String message],expected value,actual value)
用于判断是否相等 - assertTrue([String message],boolean condition)
用于判断一个条件是否为真 - assertNotNull([String message],java.lang.Object object)
判断一个条件不为空 - assertArrayEquals([String message],expectedArray,resultArray)
判断两个数组相等
使用JUnit来测试helloworld
注: 这一部分在Eclipes中完成
为了测试hello world,我们必须先对程序做一点修改(因为原来的程序没有对应的方法,访问不到输出的string)
修改如下:
import java.util.*;
public class helloworld {
String str;
public void createHello(){
str = "hello world";
}
public String getStr() {
return str;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.print("hello world");
}
}
接下来,编写helloworldTest文件:
package helloworld;
import org.junit.Test;
import static org.junit.Assert.*;
public class helloworldTest {
public helloworld hello = new helloworld();
@Test
public void testHello() {
hello.createHello();
assertEquals("hello world", hello.getStr());
}
}
接下里,需要在这个项目中导入JUnit4单元测试包:
在项目属性中打开Java Build Path,选择Add Library,选择版本然后应用就可以了。
接下里就通过鼠标右键Run As JUnit Test来进行单元测试
测试结果为:此时测试通过。
至此,完成了本次项目的TASK1。
项目心得
这两天完成项目第一阶段的内容,其实编程的部分并没有很多,但是需要学习的东西非常多,主要有JAVA,它的语法不是很难,但是涉及到一些函数的使用,特定数据结构的实现,都不是一时半会可以搞定的,所以在这上面花费了不少时间。
除此以外,Ant、JUnit的使用,这两个东西的确是非常方便的工具,可以很清晰地看到它对编程效率的提高。总的来说,第一阶段的实训给我带来了不小的收获,接下来也要继续努力。