Vi
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
向前查找。
Java
由于学过了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有垃圾回收机制,但会影响性能,使其更高效的方法:
- 尽早释放无用对象的引用。
- 使用临时变量的时候,让引用变量在退出活动域 (scope)后,自动设置为 null。
- 当程序有一定的等待时间,可以手动执行 System.gc(),通知垃圾收集器运行,但是 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语言中只有单继承 ,避免如方法名相同的冲突
继承多个父类的特性用接口
接口可继承多个接口,类可实现多个接口支持内部类(类中的类)
-
输入输出
- 字节流 : 传字节。以 8 位字节为单位进行读写,以 InputStream 与 OutputStream 为基础类。
- 字符流 : 传字符。以 16 位字符为单位进行读写,以 Reader 与 Writer 为基础类。
- 文件流 : 传文件。属于节点流,对文件读写、传输。里面的类很多。
- 序列化 : 传对象的。二进制读对象。
-
Java语言提供了一套反射类
java.lang.reflect.*
,这些类可以用做:- 构造新类实例和新数组
- 访问并修改对象(Object)和类的字段(Field)
- 调用对象和类中的方法(Method)
- 访问并修改数组的元素
-
多线程的两种方法:
- 继承
java.lang.Thread
- 实现
Runnable
接口,更符合面向对象思想。
- 继承
Ant
Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起加以自动化的一个工具,大多用于Java环境中的软件开发。由Apache软件基金会所提供。默认情况下,它的buildfile(XML文件)名为build.xml
。每一个buildfile含有一个<project>
和至少一个预设的<target>
,这些targets包含许多task elements。每一个task element有一个用来被参考的id,此id必须是唯一的。
-
build.xml
范例<?xml version="1.0" ?> <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>
-
<project>
属性属性 描述 项目名 (name) 表示项目的名称。(可选) 默认 (default) 表示构建脚本默认运行的目标,即制定默认的 target。一个项目 (project) 可以包含多个目标 (target)。(必须) 基准目录 (basedir) 表示当该属性没有指定时,使用 Ant 的构件文件的附目录作为基准目录。(可选) -
<target>
属性属性 描述 目标名 (name) 表示目标的名称。(必须) 依赖 (depends) 用于描述 target 之间的依赖关系,若与多个 target 存在依赖关系时,需要以“,”间隔。Ant 会依照 depends 属性中 target 出现的顺序依次执行每个 target。被依赖的 target 会先执行。(可选) 描述 (description) 关于 target 功能的简单描述。(可选) 如果 (if) 用于验证指定的属性是否存在,若不存在,所在 target 将不会被执行。(可选) 除非 (unless) 该属性的功能与 if 属性的功能正好相反,它也用于验证指定的属性是否存在,若不存在,所在 target 将会被执行。(可选) <property name="myName" value="amigo"/>
的name和value类似键值对,这个例子所在的任务中可用${myName}取到”amigo”,即<echo message="myName: ${myName}"/>
会输出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 类
- 创建一个名为 HelloWorldTest.java 的测试类。
- 向测试类中添加名为 testHelloWorld() , testgetInt() 的方法。
- 向方法中添加 Annotaion @Test。
- 执行测试条件并且应用 Junit 的 assertEquals API 来检查。
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 类
- 创建一个 TestRunner 类
- 运用 JUnit 的 JUnitCore 类的 runClasses 方法来运行上述测试类的测试案例
- 获取在 Result Object 中运行的测试案例的结果
- 获取 Result Object 的 getFailures() 方法中的失败结果
- 获取 Result object 的 wasSuccessful() 方法中的成功结果
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
Ant和JUnit相结合
这里可以不用到 Test Runner 类。
在 src
的父文件夹(我这里名字是Landscape
)创建 build.xml
,并手动新建 test
文件夹。
<project name="JunitTest" default="test" basedir=".">
<property name="testdir" location="test" />
<property name="srcdir" location="src" />
<!-- path是ant内置的一种datatype,作用是声明路径之类的东西 -->
<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