2016.10.20-日志

来源:互联网 发布:手机表白神器软件 编辑:程序博客网 时间:2024/06/06 20:20

《Thinking in Java》

(1) Java中,初始化的顺序,变量>任何方法(包括构造器)

对象的创建过程(以 Dog 类为例):
1. 当首次创建类型为 Dog 的对象时,(构造器可看成静态方法),或 Dog 类的静态方法/静态域首次被访问时, Java 解释器必须查找类路径,以定位 Dog.class 文件。
2. 载入 Dog.class , 有关静态初始化的所有动作都会执行。因此,静态初始化只在 class 对象首次加载的时候进行一次。
3. 当用 new Dog() 创建对象的时候,首先将在堆上为 Dog 对象分配足够的存储空间。
4. 这块存储空间会被清零,就自动地将 Dog 对象中所有基本类型都设置成了默认值,而引用则被设置成了 null。
5. 执行所有出现于字段定义处的初始化动作。
6. 执行构造器。

(2).编写构造器的一条有效准则

用尽可能简单的方法使对象进入正常状态;如果可以的话,避免调用其他方法。
在构造器内唯一能够安全调用的方法是基类中的 final 方法(也适用于 private 方法,它们自动属于 final 方法)。这些方法不能被覆盖。


《算法竞赛入门经典》

调用栈 ( Call Stack )

调用栈描述的是函数之间的调用关系。
由多个栈帧 ( Stack Frame ) 组成,每个栈帧对应着一个未运行完的函数。
栈帧中保存了该函数的返回地址和局部变量,因而不仅能在执行完毕后找到正确的返回地址,还能保证不同函数间的局部变量互不相干。

编译后的可执行文件的内容

与操作系统有关。例如, UNIX/Linux 用的 ELF 格式, DOS 下用的是 COFF 格式,而 Windows 用的是 PE 文件格式(用 COFF 扩充而来)。这些格式不尽相同,但有一个共同的概念——
“段”是指二进制文件内的区域,所有某种特定类型信息被保存在里面。可以用 size 程序得到可执行文件中各个段的大小。
正文段(Text Segment):用于储存命令
数据段(Date Segment):用于储存已初始化的全局变量
BSS段(BSS Segment):用于储存未赋值的全局变量所需的空间

段错误与栈溢出

调用栈不储存在可执行文件中,而是运行时创建,调用栈所在的段称为堆栈段(Stack Segment)。和其他段一样,堆栈段也有自己的大小,不能被越界访问,否则就会出现段错误(Segmentation Fault)
当我们在递归调用的过程中,每次递归都要往调用栈中增加一个栈帧,久而久之就越界了,这种情况叫做栈溢出(Stack Overflow)

栈的大小与操作系统有关。在 Linux 中,栈大小是由系统命令 ulimit 指定的。在 Windows 中,栈大小是存储在可执行文件中的。

因此建议“把较大的数组放在 main 函数外”的原因与此相关,局部变量是放在堆栈段的。局部变量太大,总大小超过允许范围,就会产生栈溢出。

个人记录

越来越关心一些底层的东西,看到这种东西就会很感兴趣地去看。黄XX姐说是因为上面的东西,你都懂了,而底层的你不懂,你就感兴趣了。
自己想想,也确实是这样。刚开始学的时候,对于底层的实现机制大多都会直接跳过,关心怎么能run起来或者懂基础语法就好。最近在看《Thinking in Java》的过程中,以前我是读不下去的,觉得讲的太多了,好繁琐。现在看的时候,觉得真是要把这些弄清楚。因为这些都是真实存在的,而你有一天就可能遇到这样的问题。例如:初始化的顺序、向上转型过程中的方法调用。

最近参与了一个自然语言的项目,被分配的任务是,在知识库中加时间信息。老师给了FreeBase中CVF复合类型的思路。
关于复合类型存在的疑问是:在图数据库中,复合类型的节点是独立于实体节点的一个节点,还是包含实体节点的。
我认为是前者,独立于实体节点的一个节点,但是这样不就断了S与O之间联系吗,当要查询O的信息的时候,就没办法了。
老师的解释没看懂,说是要把现有知识库中的与时间有关的,重新设计,而后续会给我再看几篇文章。

0 0
原创粉丝点击