成员初始化

  Java尽力保证:所有变量在使用前都能得到恰当的初始化。

  对于方法的局部变量,Java会以编译时报错的形式贯彻这种保证,比如:

1 void f()
2 {
3       int i;  //这里编译时就会报错,未初始化
4 }

  但是如果是类的数据成员,情况会有所不同。类的每个基本类型数据成员会保证一个默认初始值,通常为0,布尔型就是false,引用类型会为null。

  指定初始化

    (1 直接在类里定义时写变量等于多少(这样在C++中是不允许的)如, 

public class initialV
{int a=1;char c = 'c';//...等等
}

构造器初始化

  可以用构造器进行初始化。但应注意:无法阻止自动初始化的进行,它将在构造器之前发生。

public class Counter
{int i;Counter(){i=7;}
}    

这里,i首先会被置0,然后变成7.对于所以基本类型和对象引用,包括在定义时已经指定初值的变量。这种情况都是成立的。

初始化顺序

  在类的内部,变量定义的先后顺序决定了初始化的顺序。即使变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化。如下例子

class Window {Window(int marker) { print("Window(" + marker + ")"); }
}class House {Window w1 = new Window(1); // Before constructor
  House() {// Show that we're in the constructor:print("House()");w3 = new Window(33); // Reinitialize w3
  }Window w2 = new Window(2); // After constructorvoid f() { print("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
  }
} /* 输出:
Window(1)
Window(2)
Window(3)
House()
Window(33)
f()
*///:~

静态数据的初始化

   类的静态成员 属于 类 而不是类 的实例。所以 ,无论你创建多少个对象,静态成员指占用一份存储区域。static关键字不能应用于局部变量,因此只能作用于域。初始化方式和非静态一样。

   给看一个挺长的例子,看不懂直接调后面的解析。

import static net.mindview.util.Print.*;class Bowl {Bowl(int marker) {print("Bowl(" + marker + ")");}void f1(int marker) {print("f1(" + marker + ")");}
}class Table {static Bowl bowl1 = new Bowl(1);Table() {print("Table()");bowl2.f1(1);}void f2(int marker) {print("f2(" + marker + ")");}static Bowl bowl2 = new Bowl(2);
}class Cupboard {Bowl bowl3 = new Bowl(3);static Bowl bowl4 = new Bowl(4);Cupboard() {print("Cupboard()");bowl4.f1(2);}void f3(int marker) {print("f3(" + marker + ")");}static Bowl bowl5 = new Bowl(5);
}public class StaticInitialization {public static void main(String[] args) {print("Creating new Cupboard() in main");new Cupboard();print("Creating new Cupboard() in main");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)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
Creating new Cupboard() in main
Bowl(3)
Cupboard()
f1(2)
f2(1)
f3(1)
*///:~

  解析下这个Demo:要执行main()(静态方法) ,必须加载StaticInitialization 类,然后其静态域table和cupboard被初始化,这将导致他们对应的类页被加载,并且由于他们也都包含静态的Bowl对象,因此Bow随后也被加载了。(恍然大悟)

  理论得出:静态初始化只有在必要时刻才会进行。如果不创建Table对象,也不引用Table.b1或Table.b2,name静态的Bowl b1和b2永远都不会被创建。只有在第一个Table对象被创建(或其第一次被访问了静态数据)的时候,它们才会被初始化。此后,静态对象不会再次被初始化

显式的静态初始化

  Java允许将多个静态初始化动作组织成一个特殊的“静态字句”(也称 “静态块”),如下。

public class Spoon {static int i;static {i = 47;}
} ///:~

  尽管上面的代码看起来像个方法,但它实际只是一段跟在static关键字后面的代码。与其他静态初始化动作一样,这段代码只执行一次:同样的时间,当第一次生成这个类的一个对象时,或者首次访问属于那个类的静态数据成员时(即便从未生成过那个类)。

非静态实例初始化

  用来初始化每一个对象的非静态变量。如下

class Mug {Mug(int marker) {print("Mug(" + marker + ")");}void f(int marker) {print("f(" + marker + ")");}
}public class Mugs {Mug mug1;Mug mug2;{mug1 = new Mug(1);mug2 = new Mug(2);print("mug1 & mug2 initialized");}Mugs() {print("Mugs()");}Mugs(int i) {print("Mugs(int)");}public static void main(String[] args) {print("Inside main()");new Mugs();print("new Mugs() completed");new Mugs(1);print("new Mugs(1) completed");}
} /* 输出:
Inside main()
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs()
new Mugs() completed
Mug(1)
Mug(2)
mug1 & mug2 initialized
Mugs(int)
new Mugs(1) completed
*///:~

这是无论调用了哪个显式构造器,某些操作都会发生。从输出中 可以看到实例化字句 是在构造器之前执行的。

转载于:https://www.cnblogs.com/chz-blogs/p/6254024.html

《java编程思想》读书笔记(二)第五章(2)相关推荐

  1. 《Windows核心编程》读书笔记二十五章 未处理异常,向量化异常处理与C++异常

    第二十五章  未处理异常,向量化异常处理与C++异常 本章内容 25.1 UnhandledExceptionFilter函数详解 25.2 即时调试 25.3 电子表格示例程序 25.4 向量化异常 ...

  2. java编程思想读书笔记二(对象的创建)

    有兴趣的同学可以移步笔者的个人博客 更多博客 java对象 对象的创建 java的对象是在运行时创建的,创建对象的的触发条件有以下几种: 用new语句创建对象,这是最常用的创建对象方法. 运用反射手段 ...

  3. java现有一个泛型类 提供数组排序功能,java编程思想读书笔记 第十六章 数组

    数组,你可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变. 1.数组为什么特殊 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中数组是一 ...

  4. Java编程思想读书笔记_第6章(访问权限)

    四种访问权限: public private 包访问权限 protected 如果没有明确指定package,则属于默认包 1 package access.dessert; 2 3 public c ...

  5. JAVA编程思想读书笔记(三)--RTTI

    接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...

  6. Java编程思想读书笔记(七)

    点击蓝字 关注我们 今天是端午节,在这里祝大家端午节安康.过节的同时也不要忘记知识储备,今天我 为大家带来了Java编程思想第七节多形性读书笔记.请大家一起品鉴,如果发现里面有啥写的不对的地方,请大家 ...

  7. Java编程思想读书笔记一:并发

    1. Thread.yield( )方法 当调用yield()时,即在建议具有相同优先级的其他线程可以运行了,但是注意的是,仅仅是建议,没有任何机制保证你这个建议会被采纳 .一般情况下,对于任何重要的 ...

  8. Java编程思想读书笔记(02)

    第十三章字符串 字符串是不可变的:是final类固不能继承它:也不能通过指向它的引用来修改它的内容. StringBuilder是Java SE5引用的,在这之前用的是StringBuffer.后者是 ...

  9. Java编程思想读书笔记——初始化与清理(二)

    5.6 成员初始化 1)类的每一个基本数据类型成员,如果不显式赋予初值,都会有一个初始值: 2)对于引用类型成员,如果不显式赋予初值,则其初始值为null. 3)也可以直接在类中,对成员变量直接赋予初 ...

  10. Java 编程思想 读书笔记

    第一章 对象导论 一.抽象过程 所有编程语言都提供抽象机制,人们所能解决的问题的复杂性直接取决于抽象的类型和质量. 1.1 只针对问题来进行建模 早期:基于约束条件编程的语言和通过图形符号操作来实现的 ...

最新文章

  1. [文档].JLINK挂了怎么办?自己修![转载].JLINK_V8固件烧录和固件升级指导.pdf
  2. mysql之 explain、optimizer_trace 执行计划
  3. excel打开空白_PDF转成Excel后,打开表格却是空白的?
  4. ByteBuf主要继承关系图
  5. 日常问题———Attempting to operate on hdfs namenode as root
  6. 如何检索Python函数的源代码
  7. jar k8s 自己的 部署_微服务架构 - 离线部署k8s平台并部署测试实例
  8. oracle中的sql文本类型,Oracle数据库的空间数据类型
  9. 设计模式-------建造者模式(生成器模式)
  10. C# 提示框 鼠标移动到控件提示 toolTip气泡提示框
  11. linux常用指令(持续更新……)
  12. matlab 图像尺度空间,SIFT算法MATLAB实现----尺度空间构造
  13. 计算机软件存储位置,微信电脑版存储位置在什么地方?查看微信电脑版存储路径的方法...
  14. 世界上顶级英文歌曲首选
  15. java实现文件分割_java 实现文件分割
  16. kal安装了tim,无法显示图片咋办
  17. 人脸和身份证不匹配_人脸识别身份信息不匹配是什么意思
  18. sql中limit后参数有引号_mySql limit 函数后的参数是什么意思
  19. MFC绘图工具High-speed Charting Control(VS2019)
  20. 高并发下的幂等策略分析

热门文章

  1. spriteatlas 白屏的问题_Discuz白屏问题解决思路
  2. java匿名类_Java匿名类
  3. 如何精简企业主数据“裹脚布”
  4. golang的定时任务
  5. [BalticOI2014]Friends/[BZOJ4287]新三个和尚
  6. 编写一个函数itob(),将整数n转换为以b进制的数,保存到s中
  7. 在鼠标点击的位置 ,添加一个div ,类似手表右键菜单
  8. GCD使用经验与技巧浅谈
  9. netty 5.0 源码分析(1)-----ButeBuf
  10. Using C++ in Eclipse - Program file not Specified problem