vi的基本编辑总结

一个文本文件,里面拥有的无非是字符和行这两类东西。
我们首先来看看如何添加行+字符:Enter, o(O)
添加字符:i, a(A)

然后我们来看看怎么删除字符:x
删除该行行末换行符:J
删除行:dd
注意,这两种方式都可以加量词来批量删除。
但是在很多情况下,我们可能会需要借助一些特别的光标定位符进行删除。
d0(d^), d$
dw(dW), db(dB)
dG(可加量词)

因为vi中,删除会把删除掉的字符和行存储在一个buffer里面,所以删除可以理解为一个剪切操作,类比于其他编辑器,也应该有一个复制的功能。
vi中复制的功能类似于删除,请看下列表:
y0(y^), y$
yw(yW), yb(WB)
yG(可加量词)

既然有了剪切和复制,那么肯定有粘贴的功能,粘贴命令:
粘贴在当前位置之后:p
粘贴在当前位置之前:P

搜索,我们先看一下vi特有的行搜索:
f(后面加字符) //搜索结果切换使用;
我们再来看一下全文搜索:
/(?) //搜索结果切换使用n和N

替换,vi继承了ex行编辑器的替换实现,这是一种古老但实用的实现。
类似于退出vi的:q命令,vi的替换也是需要输入:的,vi的替换因此和前面几类命令有较大区别。命令格式类似下方:
:%s/Line/line/g
介绍一下这个ex命令:

  1. : 这是一个ex命令的开始标志
  2. % 这是一个范围选择符,代表从开头到结尾
  3. s 这是一个substitution(搜索并替换)命令
  4. /Line/line 这是一个命令的主体,意思是把Line替换成line
  5. g 这是一个substitution命令的参数(global),这个还有其他的参数c(check)

vi的移动光标总结

个人的学习方法就是不断的总结,而绝不可以仅依赖经验进行判断。
这次就来总结一下vi常用的移动光标的命令(所谓的命令,就是vi的命令行界面的快捷键)。

字符层次的:left(j),right(l)
单词层次:w(W),b(B)
行内层次:0(^),$
行间层次:down(j),up(k),G,gg
一些命令可以加量词。

这里不包括所有的命令,只是包括了常见的命令。除了移动光标类的命令之外,还有一种翻屏类的命令。

比如屏幕翻页:ctrl+f, ctrl+b等等。

Java 5.0的静态导入

一直不知道Java 5.0以后提供了一种叫做静态导入(static import)的功能,可以能够导入静态方法。

但是关于这种功能有不小的争议,我们来看:

这是Java 5.0的新功能:一把双刃剑。有些人很喜欢这个主意,有些人恨死它了。如果你讨厌多打几个字,那你回喜欢这项功能。但是它的缺点是会让程序比较难阅读。

基本上,这个功能是让你import静态的类、变量或enum时能够少打几个字。

旧式的写法:

import java.lang.Math;
class NoStatic {
    public static void main(String[] args) {
        System.out.println("sqrt"  + Math.sqrt(2.0));
        System.out.println("tan" + Math.tan(60));
    }
}

这里可以看到虽然我们用到了import,但是import只能导入到类。所以静态方法和变量我们不得不重复输入多次。

使用static import的写法:

import static java.lang.System.out;
import static java.lang.Math.*;
class WithStatic {
    public static void main(String[] args) {
        out.println("sqrt" + sqrt(2.0));
        out.println("tan" + tan(60));
    }
}

这里可以看到我们用了static import,就可以导入静态的类方法、变量或enum。

[转]Java中子类继承父类时是否继承构造函数

Java继承中队构造函数是不继承的,只是调用(隐式或显式)。
以下是例子

public class FatherClass {

    public FatherClass() {
        System.out.println(100);
    }

    public FatherClass(int age) {
        System.out.println(age);
    }
}

public class SonClass extends FatherClass {
    public SonClass() {
        
    }
    
    public SonClass(int c) {
        System.out.println(1234);
    }

    public static void main(String[] args) {
        SonClass s = new SonClass(66);
    }
}

编译后执行结果是什么呢?

分析SonClass s= new SonClass(66);执行这句时的调用。

public SonClass(int c) {
    System.out.println(1234);//系统会先调用父类的无参数构造函数super()
}

在这个构造函数中,等价于:

public SonClass(int c) {
    super();
    system.out.println(1234);
}

所以结果是
100
1234

在创建子类的对象时,Java虚拟机首先执行父类的构造方法,然后在执行子类的构造方法。在多级继承的情况下,将从继承树的最上层的父类开始,依次执行各个类的构造方法,这可以保证子类对象从所有直接或间接父类中继承的实例变量都被正确地初始化。

如果子类构造是这样写的:

public SonClass(int c) {
    super(22);//必须是第一行,否则不能编译//显式调用了super后,系统就不再调用无参的super()了。
    System.out.println(1234);
}

执行结果是
22
1234


总结一:构造函数不能继承,只能调用而已。

如果父类没有无参构造函数,创建子类时,不能编译,除非在构造函数代码体中的第一行,必须是第一行显式调用父类有参构造函数,如下:

public SonClass() {
    super(777);//显示调用父类有参构造函数
    System.out.println(66);
}

如果不显式调用父类有参构造函数,系统会默认调用父类无参构造函数super();
但是父类中没有无参构造函数,所以它不就是不能调用了。所以编译就通不过了。

总结二:创建有参构造函数后,系统就不再有默认无参构造函数。

如果没有任何构造函数,系统会默认有一个无参构造函数。

KVM下Windows虚拟机拷贝文件到宿主机

遇到的问题如题。

1、没有在图形界面管理器(Virtual Medicine Manager)中发现相关的功能。
2、尝试使用KVM图形管理器的USB重定向个U盘,但是不知什么原因,重定向的两个设备都会出现这样的提示:跟这台计算机连接的一个USB设备连接不正常。不知道是什么原因(USB3的关系?),网上搜索解决方法未果。
3、因为虚拟机用了独立的IP,考虑在宿主机上搭一个HTTP或FTP服务(我们Web程序员就是这么实在)。
4、仔细想一下,不需要HTTP服务或FTP服务,直接在Windows上安装一个Bash环境,就可以模拟两台Linux设备用SSH协议传东西了。

而在Windows上安装Bash环境的方式主要有以下两种的,Cygwin和Win10的Ubuntu Bash。
选用的是Cygin,不过不用直接安装Cygwin,而是安装Git就可以,Git自带一个Cygwin的精简版。
安装完Git,使用SSH命令就可以在Window上往Linux上拷贝文件或者从Linux上拷下来了。