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上拷下来了。

Linux中的login shell和non-login shell

Linux中的shell分两种,一种是login shell,一种是non-login shell。
login shell,顾名思义,提供登录功能的shell,应该都能理解。
non-login shell,无须登录的shell,一般出现在图形界面或者bash命令。

理解起来没有什么问题的话,我们来看一下这两个shell所接触到的变量。
login shell不会有什么问题,直接从startup文件里面(比如/etc/profile,~/.profile文件)解析出来。
但是non-login shell的话,按理说是从父shell继承过来,但是实际上,non-login shell还会解析某些特定的startup文件(比如/etc/bash.bashrc, ~/.bashrc文件)来的变量。

我们来举个例子,我们修改/etc/bash.bashrc文件,添加一个变量:
testvar="1"
然后我们输入bash,进入第一个non-login shell,先输出一下变量:
echo $testvar //输出为1

1、不尝试修改变量,输入bash,进入第二个non-login shell,输出变量:
echo $testvar //输出为2

2、我们可以尝试修改这个变量:
testvar="2"
尝试输出一下:
echo $testvar //输出为2
此时,我们输入bash,进入第二个non-login shell,输出变量:
echo $testvar //输出为1

这是因为本来继承了父shell的testvar变量为2,但是重新读取了一下bash.bashrc文件,把testvar变量重置为1。

Linux的环境变量

一直对set,export,printenv等几个命令比较晕,最近在看Linux相关的书籍,就整理一下。

首先是先要强调一下,什么是环境变量,和普通的变量有什么区别?
百度百科:环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
这个定义是不是很书面化,所以所以这就是为啥读书很累的原因了。
所以,我们先来了解一下环境变量和普通的变量有什么区别。

1、在.bashrc文件中添加一个环境变量和一个普通变量
'
export envvar='envvar';//这就是环境变量,export命令把普通变量转换成环境变量
nonenvvar='nonenvvar';//这就是普通变量
'

2、写一个test.sh文件(注意修改为可执行文件),内容如下
`
#/bin/bash

echo "环境变量:$envvar";
echo "非环境变量:$nonenvvar";
`

3、使用如下命令执行这个文件
./test.sh

结果是环境变量输出了,非环境变量没有输出。

所以环境变量和非环境变量最大的区别是它们可以被程序给读取到。
使用和命令行echo或env命令不会区分变量是否是环境变量,所以要查看变量是否环境变量请使用printenv命令。