110
社区成员




1、申请域名www.xuxumiao.xyz,并将其绑定为Linux的IP地址116.62.32.195。
2、学习《On Java 8》第六章。
在云服务器上安装nginx时,使用make指令后报错。
用vi编辑器打开objs/Makefile,令找到 -Werrori 后将其删除,在重新make编译。
之后,仍然报错:
用vi编辑器打开报错文件,找到相应内容,将这一行注释掉后问题解决
阿里云服务器的安全组设置是没有打开80端口的,打开80端口即可。
在学习《On Java 8》时,为了解释“在类中变量定义的顺序决定了它们初始化的顺序。即使变量定义散布在方法定义之间,它们仍会在任何方法(包括构造器)被调用之前得到初始化”,书中用以下代码为例,这段代码看起来不算很直观。
class Window {
Window(int marker) {
System.out.println("Window(" + marker + ")");
}
}
class House {
Window w1 = new Window(1); // Before constructor
House() {
// Show that we're in the constructor:
System.out.println("House()");
w3 = new Window(33); // Reinitialize w3
}
Window w2 = new Window(2); // After constructor
void f() {
System.out.println("f()");
}
Window w3 = new Window(3); // At end
}
public class OrderOfInitialization {
public static void main(String[] args) {
House h = new House();
h.f(); // Shows that construction is done
}
}
在debug模式对着代码跑了好几次,发现每次house方法和f方法在被调用之前,都会先调用window方法。
再结合书中的说明:它们仍会在任何方法(包括构造器)被调用之前得到初始化,可知这并不是先调用window方法,而是在window方法被调用之前,先将变量w1、w2、w3的值初始化。
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
它是对类的当前实例的引用。
引入关键字 this 代表其所在方法的当前对象的引用:
构造方法中指该构造器所创建的新对象;
方法中指调用该方法的对象;
在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。
如果一个字段是静态的基本类型,你没有初始化它,那么它就会获得基本类型的标准初值。(例如,int型的标准初值是0,double型的标准初值是0.0)
如果它是对象引用,那么它的默认初值就是 null。
以这段代码为例:
// housekeeping/StaticInitialization.java
// Specifying initial values in a class definition
class Bowl {
Bowl(int marker) {
System.out.println("Bowl(" + marker + ")");
}
void f1(int marker) {
System.out.println("f1(" + marker + ")");
}
}
class Table {
static Bowl bowl1 = new Bowl(1);
Table() {
System.out.println("Table()");
bowl2.f1(1);
}
void f2(int marker) {
System.out.println("f2(" + marker + ")");
}
static Bowl bowl2 = new Bowl(2);
}
class Cupboard {
Bowl bowl3 = new Bowl(3);
static Bowl bowl4 = new Bowl(4);
Cupboard() {
System.out.println("Cupboard()");
bowl4.f1(2);
}
void f3(int marker) {
System.out.println("f3(" + marker + ")");
}
static Bowl bowl5 = new Bowl(5);
}
public class StaticInitialization {
public static void main(String[] args) {
System.out.println("main creating new Cupboard()");
new Cupboard();
System.out.println("main creating new Cupboard()");
new Cupboard();
table.f2(1);
cupboard.f3(1);
}
static Table table = new Table();
static Cupboard cupboard = new Cupboard();
}
输出:
Bowl(1)
Bowl(2)
Table()
f1(1)
Bowl(4)
Bowl(5)
Bowl(3)
Cupboard()
f1(2)
main creating new Cupboard()
Bowl(3)
Cupboard()
f1(2)
main creating new Cupboard()
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
静态初始化只有在必要时刻才会进行。如果不创建 Table 对象,也不引用 Table.bowl1 或 Table.bowl2,那么静态的 Bowl 类对象 bowl1 和 bowl2 永远不会被创建。只有在第一个 Table 对象被创建(或被访问)时,它们才会被初始化。此后,静态对象不会再次被初始化。
初始化的顺序先是静态对象(如果它们之前没有被初始化的话),然后是非静态对象,从输出中可以看出。要执行 main()
方法,必须加载 StaticInitialization 类,它的静态属性 table 和 cupboard 随后被初始化,这会导致它们对应的类也被加载,而由于它们都包含静态的 Bowl 对象,所以 Bowl 类也会被加载。因此,在这个特殊的程序中,所有的类都会在 main()
方法之前被加载。实际情况通常并非如此,因为在典型的程序中,不会像本例中所示的那样,将所有事物通过 static 联系起来。
即:加载一个类时,其静态属性也会被静态初始化,这会导致它们对应的类也被加载,然后这些类中的静态属性也会被初始化。
把this关键字再多看几遍,可能的话也把第六章重新再过一下。
任务3
看书——第七章