Vi是一个非常强大的编辑工具,可以脱离鼠标直接用键盘进行文本操作。在终端输入vi 文件名
就可以查看文件的文本内容或新建文件,它的好处在于并不是将整个文件全部读取到内存中再显示出来,而是只显示一部分,所以可以轻松打开大文件。
在命令行模式和INSERT模式下都可以按方向键移动光标(正规的 vi 是在命令行模式用小写英文字母h j k l
,分别控制光标左、下、上、右移一格)。
以下是比较常用的操作
在命令行模式下输入:w
可以保存当前文件,:w 文件名
相当于另存为,但不会保存当前文件。当前文件未保存的情况下输入:q
会有警告无法退出,可输入:q!
强制退出。wq
是保存并退出。
插入模式,i
是从光标处插入,a
是从光标后插入,o
是在下方新增空行插入。
dd
删除光标所在行
yw
将光标所在之处到字尾的字符复制到缓冲区中,yy
复制光标所在行到缓冲区,p
粘贴。
u
撤销,ctrl+r
重做。(Mac系统下ctrl对应control
键而不是command
键。)
:set number
设置显示行号(为了要了方便到某一行)
0
移动到行首
$
移动到行尾
ctrl+u\d
向上\下滚动半屏
ctrl+b\f
向上\下滚动一屏
gg
移动到整个文件最顶部
G
移动到整个文件最底部
:x
移动到第x行
/关键字
回车后按n
向后查找,?关键字
回车后按`n
向前查找。
由于学过了C++和使用过C#,对Java是比较容易上手的,当然,Java会有一些差异和特性。
逻辑型是boolean
而不是bool
,跟C#一样只能为true
和false
,不能像C一样赋数值。
String
对象是final的,其不能改变的是对象引用的内存地址,而指向的内容是可变的。
拆箱与装箱指的是基本类型和对象类型的转换。
数组
与C#的不同,Java的int[][] matrix = new int[5][];
表示的是二维数组,不是交叉数组。
toString(array)
用于一维数组,deepToString(array)
用于二维数组。
对于数组名==
号比较的是地址。要判断所含元素相同,Arrays.equals
用于一维数组,Array.deepEquals
用于二维数组。
继承用关键字 extends 表示。
作用域
当前类 | 同一包内 | 子孙类 | 其他包 | |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
虽然Java有垃圾回收机制,但会影响性能,使其更高效的方法:
JDK5的可变参数
public void pri(String... strings ){
for (String str : strings)
System.out.print(str);
}
static
还可以修饰程序块 用{}括起来
final
使用了 final
的类不能再派生子类
java.lang.String
是一 个 final
类
final
用于类、方法、变量 ,类似C的const
接口
接口是比抽象类更抽象的类
接口的实现用关键字 implements
而C#是仍然继承
java语言中只有单继承 ,避免如方法名相同的冲突
继承多个父类的特性用接口
接口可继承多个接口,类可实现多个接口
支持内部类(类中的类)
输入输出
Java语言提供了一套反射类java.lang.reflect.*
,这些类可以用做:
多线程的两种方法:
java.lang.Thread
Runnable
接口,更符合面向对象思想。 Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。默认情况下,它的buildfile(XML文件)名为build.xml
。每一个buildfile含有一个
和至少一个预设的
,这些targets包含许多task elements。每一个task element有一个用来被参考的id,此id必须是唯一的。
build.xml
范例
<project name="Hello World" default="execute">
<target name="init">
<mkdir dir="build/classes"/>
<mkdir dir="dist"/>
target>
<target name="compile" depends="init">
<javac srcdir="src" destdir="build/classes"/>
target>
<target name="compress" depends="compile">
<jar destfile="dist/HelloWorld.jar" basedir="build/classes" />
target>
<target name="execute" depends="compile">
<java classname="HelloWorld" classpath="build/classes"/>
target>
project>
属性
属性 | 描述 |
---|---|
项目名 (name) | 表示项目的名称。(可选) |
默认 (default) | 表示构建脚本默认运行的目标,即制定默认的 target。一个项目 (project) 可以包含多个目标 (target)。(必须) |
基准目录 (basedir) | 表示当该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。(可选) |
属性
属性 | 描述 |
---|---|
目标名 (name) | 表示目标的名称。(必须) |
依赖 (depends) | 用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target。被依赖的 target 会先执行。(可选) |
描述 (description) | 关于 target 功能的简单描述。(可选) |
如果 (if) | 用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。(可选) |
除非 (unless) | 该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。(可选) |
的name和value类似键值对,这个例子所在的任务中可用${myName}取到”amigo”,即
会输出myName: amigo
Ant 常用任务
中文参考, 官方手册
官方手册JUnit 是一个回归测试框架,被开发者用于实施对应用程序的单元测试,加快程序编制速度,同时提高编码的质量。
JUnit 入门教程
这里直接进行实践。
配置环境变量,否则会提示包org.junit不存在。
参考
vim ~/.bashrc
在文件末尾添加:
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_91
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/path/to/junit-4.9.jar:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
保存后退出。其中,/path/to/junit-4.9.jar路径自己设置。
source ~/.bashrc
路径生效,之后使用
javac MyTest.java
java org.junit.runner.JUnitCore MyTest
即可成功运行
创建一个类
在 src
路径下创建一个名为 HelloWorld.java
的类用来测试。
public class HelloWorld {
public String say() {
System.out.println("HelloWorld");
return "HelloWorld";
}
public int getInt() {
System.out.println(13);
return 13;
}
public static void main(String args[]) {
HelloWorld h = new HelloWorld();
}
}
创建 Test Case 类
import org.junit.Test;
import org.junit.Ignore;
import static org.junit.Assert.assertEquals;
public class HelloWorldTest {
public HelloWorld h = new HelloWorld();
// 元数据
@Test
public void testHelloWorld() {
System.out.println("Inside testHelloWorld()");
assertEquals("HelloWorld", h.say());
}
@Test
public void testgetInt() {
System.out.println("Inside testgetInt()");
assertEquals(13, h.getInt());
}
}
用 javac 编译。
[zjq@centos-linux src]$ javac HelloWorldTest.java
用 -ea 可打开断言机制,如果希望只运行某些包或类中的断言,可将包名或类名加到 -ea 之后,这里用 org.junit.runner.JUnitCore 类来运行测试。
[zjq@centos-linux src]$ java -ea org.junit.runner.JUnitCore HelloWorldTest
测试结果通过。
HelloWorldTest
JUnit version 4.9
.Inside testHelloWorld()
HelloWorld
.Inside testgetInt()
13
Time: 0.007
OK (2 tests)
作为一个初学者,暂时难以接受这个 java 命令,还是希望能直接java一个类来运行,这里再加一个类。
创建 Test Runner 类
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(HelloWorldTest.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}
编译、运行。
[zjq@centos-linux src]$ javac TestRunner.java
[zjq@centos-linux src]$ java TestRunner
测试结果通过。
Inside testHelloWorld()
HelloWorld
Inside testgetInt()
13
true
把 HelloWorldTest
中的 13 写成 14,测试失败的结果。
Inside testgetInt()
13
Inside testHelloWorld()
HelloWorld
testgetInt(HelloWorldTest): expected:<14> but was:<13>
false
这里可以不用到 Test Runner 类。
在 src
的父文件夹(我这里名字是Landscape
)创建 build.xml
,并手动新建 test
文件夹。
<project name="JunitTest" default="test" basedir=".">
<property name="testdir" location="test" />
<property name="srcdir" location="src" />
<path id="classpath.base" />
<path id="classpath.test">
<pathelement location="/lib/junit-4.10.jar" />
<pathelement location="${testdir}" />
<pathelement location="${srcdir}" />
<path refid="classpath.base" />
path>
<target name="clean" >
<delete>
<fileset dir="${testdir}" />
delete>
target>
<target name="compile" depends="clean">
<javac srcdir="${srcdir}" destdir="${testdir}">
<classpath refid="classpath.test"/>
javac>
target>
<target name="test" depends="compile">
<junit>
<classpath refid="classpath.test" />
<formatter type="brief" usefile="false" />
<test name="HelloWorldTest" />
junit>
target>
project>
运行它。
[zjq@centos-linux Landscape]$ ant
运行结果:
Buildfile: /media/psf/Home/Desktop/Landscape/build.xml
clean:
compile:
[javac] /media/psf/Home/Desktop/Landscape/build.xml:18: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 2 source files to /media/psf/Home/Desktop/Landscape/test
test:
[junit] Testsuite: HelloWorldTest
[junit] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.011 sec
[junit]
[junit] ------------- Standard Output ---------------
[junit] Inside testHelloWorld()
[junit] HelloWorld
[junit] Inside testgetInt()
[junit] 13
[junit] ------------- ---------------- ---------------
BUILD SUCCESSFUL
Total time: 1 second