计算机网络2+《On Java》_聂浩

嘘嘘喵 社区会员 2021-09-22 22:14:00

On Java 第六章

工作记录

1、申请域名www.xuxumiao.xyz,并将其绑定为Linux的IP地址116.62.32.195。

2、学习《On Java 8》第六章。

 

问题及应对

nginx

在云服务器上安装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关键字

它是对类的当前实例的引用。

引入关键字 this 代表其所在方法的当前对象的引用:

  1. 构造方法中指该构造器所创建的新对象;

  2. 方法中指调用该方法的对象;

  3. 在类本身的方法或构造器中引用该类的实例变量(全局变量)和方法。

成员初始化

静态初始化

如果一个字段是静态的基本类型,你没有初始化它,那么它就会获得基本类型的标准初值。(例如,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.bowl1Table.bowl2,那么静态的 Bowl 类对象 bowl1bowl2 永远不会被创建。只有在第一个 Table 对象被创建(或被访问)时,它们才会被初始化。此后,静态对象不会再次被初始化。

初始化顺序

初始化的顺序先是静态对象(如果它们之前没有被初始化的话),然后是非静态对象,从输出中可以看出。要执行 main() 方法,必须加载 StaticInitialization 类,它的静态属性 tablecupboard 随后被初始化,这会导致它们对应的类也被加载,而由于它们都包含静态的 Bowl 对象,所以 Bowl 类也会被加载。因此,在这个特殊的程序中,所有的类都会在 main() 方法之前被加载。实际情况通常并非如此,因为在典型的程序中,不会像本例中所示的那样,将所有事物通过 static 联系起来。

即:加载一个类时,其静态属性也会被静态初始化,这会导致它们对应的类也被加载,然后这些类中的静态属性也会被初始化。

明日计划

  1. 把this关键字再多看几遍,可能的话也把第六章重新再过一下。

  2. 任务3

  3. 看书——第七章

 

 

...全文
179 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

110

社区成员

发帖
与我相关
我的任务
社区描述
训练、训练、训练!
其他 其他
社区管理员
  • 实训001
  • 非鱼up
  • andy421
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

自律训练,自信挑战!

试试用AI创作助手写篇文章吧