(亲爱的TA和老师,如果你们看到了这篇博文,请您确认,这个博主是我,我并没有抄袭,您可以找我确认信息!本文学习主要来源W3Cschool以及菜鸟教程。)
一、Linux vi/vim
概述
vi是在Linux下的一款编辑器,所有的Unix Like系统都会内建vi文书编辑器。但是现在我们使用的话,更多的是vim编辑器。
Vim是从vi编辑器发展出来的一个编辑器。Vim具有程序编辑的能力,会给使用的语言加入高亮,以帮助使用者判断语法的正确性,或者可以改善编写时的拼写问题,方便程序设计。因其代码补全、编译以及错误跳转等方便编程的功能,vim在程序员中被广泛使用。
vi的使用
通过学习与百度,我学到了vi/vim共分为三种模式:命令模式,输入模式,和底线命令模式。(由于这里是在Linux下学习vi,且vi与vim的使用大致相同,所以以下vi/vim均简写为vi。)
命令模式
其实是最基本的模式,vi在刚启动之后,就会进入这个模式中。在这个模式下,用户敲击键盘就会被识别为vi的命令。在编辑的时候常用的命令有一下三个:
- i 切换到输入模式
- x 删除当前光标所在处的字符
- : 切换到底线命令模式
其实在我个人的操作中,我常用的命令就是i 与 : 命令。i用于打开文本开始编辑,: 用于切换到底线模式,进行进一步操作。
输入模式
从上面命令模式我们可以知道,启动vi之后,输入i即可进入输入模式。这个模式中的按键输入和普通的文本编辑器几乎是一样的,这里就不做过多的说明。
在输入模式完成之后,按下ESC键既可以退出输入模式,切换到命令模式中。
底线命令模式
底线命令模式一般是从命令模式下,输入: 进入的。在我的学习使用的过程中,常用的命令有一下几个:(以下省略: 的输入)
- q 退出,这个命令在对文档没有改动时可以直接退出,若有改动,vi会有提示;
- q! 强制退出,这个强制从! 上体现,这也很形象,退出后将不保存所做的任何改动;
- wq 保存并退出,不管文档有没有改动都将保存现在这个版本,并且退出。
实际操作
在掌握基本的vi内容之后,我们可以开始一次实际的操作了。
首先进入terminal,输入命令:
vi temp.txt
就可以创建并打开一个temp.txt的文件,如下图:
进入之后,可以得到下图:
此时为命令模式,如果要进入输入模式,需要按 i,即可输入:
在进行完操作之后,可以按下ESC键退出输入模式,进入命令模式。在命令模式下退出vi,需要先按下: 键,进入底线命令模式,选择q或者其他命令,退出到terminal界面。如下图:
以上就是我学习vi的一些小过程啦。
二、Java
概述
Java是1995年推出的,也是全面面向对象的程序设计语言。Java的语法和C/C++很相近,所以我在学习的过程中对语法是没有难度的。C++与Java同样是面向对象的语言,但是Java在设计的时候,丢弃了C++中一些特性,比如说操作符重载、多继承、自动的强制类型转换。我在学习的过程中,还发现了Java的一大特性,那就是Java并没有指针的使用,而是用引用代替了指针。同时在空间回收方面,Java提供自动的废料收集,让内存管理比较自动。
总的来说,Java有以下几大特性:
- Java是面向对象的:
Java提供类、接口和继承等面向对象的特性,而且摈弃了类之间的多继承,支持接口之间的多继承;Java也全面支持动态绑定,这比C++语言要方便与简单许多。- Java语言是分布式的:
Java语言能支持Internet应用的开发,它的RMI(远程方法激活)机制也是开发分布式应用的重要手段。- Java语言是健壮的:
根据上文我们提到的,Java语言的强类型机制、异常处理、垃圾的自动收集等保证了程序的健壮性。而且与C++不同,Java全面丢弃了指针,用引用代替。而且我还了解到,Java语言还有安全检查机制,这样使得Java更具健壮性。- Java语言是多线程的:
Java给多线程变成提供了内置的支持。在一个进程中,Java程序能通过Thread类或其子类来创建多个新的线程,每条线程并行执行不同的任务。
Java基础知识
Java在基本的语法和使用上和C++差不多,但是一个Java程序和C++程序是完全不同的。Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作的。下面我先从对象和类讲起,对于与C++方面相似的地方我就跳过啦。
对象和类
和C++相似,Java中的对象是类的一个实例,类是一个模板,表述了一类对象的行为和状态。但是Java中与C++不同之处在于:
- 一个源文件中只能有一个public类
- 一个源文件中可以有多个非public类
- 源文件的名称应该和这个文件中的public类名保持一致
Java的类中,有两种类比较特殊,一种是final类,一种是抽象类。这两个类是由final修饰符和abstract修饰符修饰的。
final变量能被显式地初始化,被声明为final的对象的引用不能指向不同的对象。final对象的引用有点像C++中的常量指针,其中引用不能改变,但是里面的值可以改变。
Java中的抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。抽象类可以包含抽象方法和非抽象方法。
Stream, File, IO
Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。
Java 的控制台输入由 System.in 完成。
控制台的输出由 print( ) 和 println() 完成。这些方法都由类 PrintStream 定义,System.out 是该类对象的一个引用。
Java的文件读写则是由InputStream和OutputStream完成的。
还有一些关于文件和I/O的类,我们也需要知道:File Class(类)、FileReader Class(类)、FileWriter Class(类)。
异常处理
异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。
比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。异常发生的原因有很多,通常包含以下几大类:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。要理解Java异常处理是如何工作的,我们需要掌握以下三种类型的异常:
- 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
- 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
- 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
对于异常处理,Java为我们提供了许多异常类。所有的异常类都是从Java.lang.Exception类继承的子类。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error 。Java 程序通常不捕获错误。错误一般发生在严重故障时,它们在Java程序处理的范畴之外。Error 用来指示运行时环境发生的错误。
Java在捕获异常上,也是使用try和catch关键字的。
继承
Java的继承和C++的继承是相似的。继承也是Java面向对象编程技术的一块基石。Java的继承特性和C++大体相同,主要有以下几方面:
- 子类拥有父类非private的属性和方法
- 子类可以有自己的属性和方法
- 子类可以用自己的方式实现父类的方法
- Java的继承是单继承,但是可以多重继承
- 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)
Java的继承在语法上也与C++不同。Java中的继承可以使用 extends 和 implements 这两个关键字来实现的,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
extends 关键字
在Java中,类的继承是单一继承,一个子类只能有一个父类,所以有了extends。
implements 关键字
使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
在Java的继承中还有一些关键字:
- super:可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类
- this:指向自己的引用
- final:声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作。
重写(Override)子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。重载(Overload)是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。最常用的地方就是构造器的重载。
Java中的重写和重载与C++是相似的,两者的规则也是相似的。这两者也是Java多态的体现。
到此处,我觉得Java的特性和C++的区别不太大,区别在语法和使用上。以下放出我的Hello world代码,以及运行贴图:
public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello World!");
}
}
三、Ant
Ant 是一个 Apache 基金会下的跨平台的基于 Java 语言开发的构建工具。而Ant的作用是简化一般构建工具的工作。Apache Ant的特点有如下几点:
- Ant 是最完整的基于 Java 语言开发的构建和部署工具
- Ant 具有平台无关性,可以处理平台特有的属性,诸如文件分隔符
- Ant 还可以用来执行平台特有的任务,比如使用 touch 命令修改一个文件的修改时间
- Ant 脚本是用 XML 来完成的。如果你已经对 XML 有所了解,那么你学习 Ant,将会比较得心应手
- Ant 擅长自动完成重复任务
- Ant 开始需要一系列的预先定义好的任务
- Ant 提供了开发自定义任务的接口
- Ant 可以很容易从命令行调用,并且它能够很好地集成免费和商用的集成开发环境
一般来说,Ant 的构建文件默认为 build.xml,放在项目顶层目录中。然而,并没有限制构建文件必须命名为 bulid.xml,也并不限制放在项目顶层目录中。你可以将构建文件命名为其他名字,也可以将它放在项目的其他地方。
下面是我写的第一个build.xml文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<project name="helloWorld">
<target name="sayHelloWorld">
<echo message="Hello, Amigo"/>
</target>
</project>
一个目标 (target) 是一系列你想运行的任务 (tasks),运行时看成一个单元。在我们的例子中,我们用一个简单的目标来为用户提供一个有信息的消息。
目标和目标之间可以有依赖关系。举个例子,一个部署 (deploy) 目标可能依赖于封装 (package) 目标,而这个封装目标可能又依赖于编译 (compile) 目标等。依赖关系被表示成依赖属性 (depends)。
Ant 数据类型
在学习过程中,我主要是学习一下几个内容。
文件集
文件集的数据类型代表了一个文件集合。它被当作一个过滤器,用来包括或移除匹配某种模式的文件。
模式集合
一个模式集合指的是一种模式,基于这种模式,能够很容易地过滤文件或者文件夹。模式可以使用下述的元字符进行创建。
- ? -仅匹配一个字符
- * -匹配零个或者多个字符
- ** -递归地匹配零个或者多个目录
文件列表
文件列表数据类型与文件集相类似,除了以下几处不同:
- 文件列表包含明确命名的文件的列表,同时其不支持通配符。
- 文件列表数据类型能够被应用于现有的或者还不存在的文件中。
过滤器集合
使用一个过滤器集合数据类型与拷贝任务,我们可以在所有文件中使用一个替换值来替换掉一些与模式相匹配的文本。
路径
path 数据类型通常被用来表示一个类路径。各个路径之间用分号或者冒号隔开。然而,这些字符在运行时被替代为执行系统的路径分隔符。
Ant编译项目
Ant作为一个构建文件,是能方便地让项目能编译完成的。以下是我学到的一些内容。
首先我们先来考虑项目的一般结构:
- 数据脚本存储在 db 文件夹中。
- java 源文件存储在 src 文件夹中。
- images (图像),js (JavaScript 脚本),style (css 层叠样式表)存储在 war 文件夹中。
- JSPs 文件存储在 jsp 文件夹中。
- 第三方的 jar 文件存储在 lib 文件夹中。
- java 类文件存储在 WEB-INF\classes 文件夹中。
此处的build.xml可以写成(只展示主要部分,其中路径为自己的设置):
<?xml version="1.0"?>
<project name="fax" basedir="." default="build">
<property name="src.dir" value="src"/>
<property name="web.dir" value="war"/>
<property name="build.dir" value="${web.dir}/WEB-INF/classes"/>
<property name="name" value="fax"/>
<path id="master-classpath">
<fileset dir="${web.dir}/WEB-INF/lib">
<include name="*.jar"/>
</fileset>
<pathelement path="${build.dir}"/>
</path>
<target name="build" description="Compile source tree java files">
<mkdir dir="${build.dir}"/>
<javac destdir="${build.dir}" source="1.5" target="1.5">
<src path="${src.dir}"/>
<classpath refid="master-classpath"/>
</javac>
</target>
<target name="clean" description="Clean output directories">
<delete>
<fileset dir="${build.dir}">
<include name="**/*.class"/>
</fileset>
</delete>
</target>
</project>
在这里,首先定义了自己的一些属性,在此处主要是定义了一些路径。属性也可以引用其它属性。在上面的例子中,build.dir 属性引用了 web.dir 属性。在上面的例子中,src.dir 就是项目源文件存放的地方。我们项目的默认目标是编译目标。
在build的target中,首先,创建一个构建目录,如果该目录不存在,就执行 javac 命令(具体以 jdk 1.5 作为我们目标的编译环境)。 我们对 javac 任务提供源文件夹和类路径,并且通过执行 javac 任务将类文件存放在构建文件夹中。在clean中,是用于删除文件夹中的全部文件。控制类路径 (master-classpath) 保存类路径的相关信息。在这种情况下,它包含了构建文件夹和 jar 文件夹中的所有的类文件。
在这个例子中,很具体的说明了Ant在一个项目中的作用,我也学到了很多~(项目来源W3Cschool)
Ant编译运行Java
我在云桌面的建立项目的顺序是:
- 首先,建立两个文件夹:src与classes;
- 然后,在src文件夹里面建立HelloWorld.java,写一个上面提到的Java的HelloWorld文件;
- 然后在与src同级文件内,建立build.xml文件,代码如下:
<?xml version="1.0" encoding="UTF-8" ?>
<project name="HelloWorld" default="run" basedir=".">
<property name="src" value="src" />
<property name="dest" value="classes"/>
<target name="init" >
<mkdir dir="${dest}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${src}" destdir="${dest}" />
</target>
<target name="run" depends="compile">
<java classname="HelloWorld" classpath="${dest}" />
</target>
</project>
之后在命令行中输入Ant,就可以生成好了一个Java文件,然后再自动运行。结果如下图:
四、Junit
概述
JUnit是用于编写和运行可重复的自动化测试的开源测试框架, 这样可以保证我们的代码按预期工作。JUnit可广泛用于工业和作为支架(从命令行)或IDE(如Eclipse)内单独的Java程序。
Junit能提供:
- 断言测试预期结果。
- 测试功能共享通用的测试数据。
- 测试套件轻松地组织和运行测试。
- 图形和文本测试运行。
JUnit用于测试:
- 整个对象
- 对象的一部分 - 交互的方法或一些方法
- 几个对象之间的互动(交互)
JUnit的特点:
- JUnit是用于编写和运行测试的开源框架。
- 提供了注释,以确定测试方法。
- 提供断言测试预期结果。
- 提供了测试运行的运行测试。
- JUnit测试让您可以更快地编写代码,提高质量。
- JUnit是优雅简洁。它是不那么复杂以及不需要花费太多的时间。
- JUnit测试可以自动运行,检查自己的结果,并提供即时反馈。没有必要通过测试结果报告来手动梳理。
- JUnit测试可以组织成测试套件包含测试案例,甚至其他测试套件。
- JUnit显示测试进度的,如果测试是没有问题条形是绿色的,测试失败则会变成红色。
JUnit来测试HelloWorld.java
在Desktop文件夹下面编辑一个MessageUtil的类,代码如下:
public class MessageUtil {
private String message;
public MessageUtil(String message){
this.message = message;
}
public String printMessage(){
System.out.println(message);
return message;
}
}
之后在同样的路径下面创建一个TestJunit.java的测试类,代码如下:
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class TestJunit {
String message = "Hello World";
MessageUtil messageUtil = new MessageUtil(message);
public void testPrintMessage() {
assertEquals(message,messageUtil.printMessage());
}
}
接下来创建Test Runner类,也是在Desktop中,代码如下:
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(TestJunit.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
之后编译三个文件,再运行TestRunner就好了。可以得到运行结果是:
Hello World
true
而如果更行TestJunit类中的message,编译之后再次运行TestRunner,检查运行的结果是:
Hello World
testPrintMessage(TestJunit): expected:<[New Wor]d> but was: <[Hello Worl]d>
false
四、总结
以上就是我学习的全过程了。这么学下来我发现,vi是可以编辑代码的一个软件;java是程序设计语言;Ant是类似于makefile的存在,可以帮忙一键快捷编译运行大项目,不用手动输入命令语句;Junit是用来测试程序的。这一系列下来是帮助我们开始学习和掌握Java的需要的基本知识。在学习的过程中,有网上的教程以及wiki里面的文档,在花心思之后,学起来还是不太困难的。