thinking in java 读书笔记(感悟);

作者:淮左白衣 ;

写于 2018年4月2日18:14:15

目录


基本数据类型

我们常说的基本数据类型是有8种的,但是在thinking in java 里面把void也当做基本数据类型了 ;
基本数据类型 大小 最小值 最大值 包装器类型
boolean ——(没有明确指定) —— —— Boolean
char 16 - bit unicode 0 unicode 216−1" role="presentation">216−1216−1 Character
byte 8 - bit -128 127 Byte
short 16 - bit −215" role="presentation">−215−215 215−1" role="presentation">215−1215−1 Short
int 32 - bit −231" role="presentation">−231−231 231−1" role="presentation">231−1231−1 Integer
long 64 - bit −263" role="presentation">−263−263 263−1" role="presentation">263−1263−1 Long
float 32 - bit 1.4E−45" role="presentation">1.4E−451.4E−45 3.4028235E38" role="presentation">3.4028235E383.4028235E38 Float
double 64 - bit 4.9E−324" role="presentation">4.9E−3244.9E−324 1.7976931348623157E308" role="presentation">1.7976931348623157E3081.7976931348623157E308 Double
void —— —— —— Void

我们可以看到对于boolean类型,是没有明确指定其大小的;仅仅定义为够取其字面值 truefalse


float 和 long 谁更大

我们都知道 float 是 32 位,long 是 64位 ;因此,我们可能会脱口而出,当然 64位的 long 更大了 ;

很好,全错了 ;是 float 更大 ;

现在我讲下,为什么 float 比 long 大 ;

这需要从 long 和 float 在内存中的保存方式说起;对比于float,long 在内存中占64位,每一位可以表示 0 或 1,因此最大有 263" role="presentation">263263 ;

而我们的float ,在内存中并不是向 long 那样存储的,也就是说它不是,把每一个二进制位上的数字连在一起,最后转为十进来表示最后的数值的 ;它在内存中的存储方式如下图:

  • float 内存存储图
二 ~ 九 十 ~ 三十二
S(符号位) E(指数域) F(小数域)

这8位指数域,配合上系数,秒杀掉long 的 263" role="presentation">263263 ,是绰绰有余的 ;


System.out.println();

用了这么久的,你真的了解System.out.println();吗?
  • System

    System是 java.lang 包下的一个类;

  • out

    out,是System的一个静态成员对象;类型是PrintStream ;

  • println()

    是out对象的一个方法 ;


向前引用

java消除了向前引用 ;书上,就说了这么一句 ;本着刨根问底的精神,我来讲什么是向前引用 ;

  • 什么是向前引用

    向前、引用 ,分开看;就是在一个变量定义之前,引用它 ;这在C++等一些语言中,是不可行的 ;java消除了向前引用的错误,意味着,在java中,这样做是可行的 ;

    {
j = 7; // ok
}
int j = 9 ; {
i = 9 ; // error,不能再同一个代码块中使用向前引用
int i = 6 ;
}

这样的代码是正确的,即使 j 定义在后面 ;(备注:向前引用,不能在 同一个 局部代码块中使用;)但是向前引用,仅限于赋值,也就是我们在向前引用的时候,只能对变量进行赋值,不能进行其他操作 ;

  • 为什么向前引用,不能发生在同一个代码块里面

    其实这里也就说出了,为什么java可以向前引用;java能向前引用的可行之处,在于,java加载类的时候的顺序 ;

    我们这里不讲具体的加载顺序,我会在后面专门写一篇博客讲; 这里我们需要知道:在一个类加载的时候,类的字段成员是最先加载的,然后才是代码块,最后是方法

    {
j = 7; // ok
}
int j = 9 ;

这就是为啥 j = 7 ;是OK的原因;其实在执行代码块的时候,j 已经加载进内存,完成默认初始化了 ;

    {
i = 9 ; // error,不能再同一个代码块中使用向前引用
int i = 6 ;
}

当在同一个代码里面的时候,java也是要按照顺序进行加载的,i = 9 ; 这时候 i 还并未加载,因此报错 ;

  • 向前引用的一些注意事项
 class test {
int method() {return n; }
int m = method();
int n = 1; } // Junit测试 {
System.out.println(new test().m);
System.out.println(new test().method());
}
// 分别输出:0 , 1 ;
  • 为什么会这样,m的值为什么不是 1?

    这就需要从对象的初始化说起了;

    当我们创建一个对象的时候,首先会把类的字段成员,按顺序加载进内存,然后,把这些字段成员放进一张表(符号表)里面,以便向前引用,这些字段成员在符号表里面的值,是默认初始化的,比如上面的m、n,它们在这张表里面的值都是默认初始化的值 0 ;

    当所有的字段成员,都加载进符号表里面,然后才开始真正的初始化,也就是程序员为它们赋予的值,比如上面的 m = method()、n = 1

    OK,知道上面的知识,就好理解m为什么是 0 ,而不是 1 了 ;当创建 test 对象的时候,默认初始化结束后,开始真正的初始化; m = method() : m 的值是方法 method()的返回值,而 method() 返回的是n的值,这时候,n被真正初始化了吗?答案是否定的,因为下一条语句,才是 int n = 1 ;才进行真正的初始化;因此,n的值,只是在符号表中的默认初始化值 0 ;因此,m 的值,就会赋予为 0 了 ;


向前引用 ? float VS long ? 这些知识你懂吗?的更多相关文章

  1. Java向前引用容易出错的地方

    所谓向前引用,就是在定义类.接口.方法.变量之前使用它们,例如, class MyClass { void method() { System.out.println(myvar); } String ...

  2. java向前引用

    根据看书和看得文章,引出了一个关于"向前引用"的问题: public class InstanceInitTest { static { // { a = 6; System.ou ...

  3. python自定义函数可以向前引用不用声明

    #有些编程语言不够"聪明",向这类向前引用的方式会导致报错,但Python足够"醒目",这段代码是正确的! def next():     print('我在n ...

  4. wpf staticresource 是不允许向前引用(forward reference)的

    不允许向前引用(forward reference)在C/C++中中很常见,即在语法上,未定义变量.类之前,不能使用. 没想到wpf中的wpf staticresource也遵循这种规则.资源字典中, ...

  5. 引用 字库编码Unicode相关知识

    引用 weifeng.shen 的 字库编码Unicode相关知识 1.      各地编码 首先说明一下现在常用的一些编码方案: 1.         在中国,大陆最常用的就是GBK18030编码, ...

  6. C++学习之路—引用(一)—基础知识

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 对一个数据可以建立一个“引用”,它的作用是为一个 ...

  7. javac之向前引用

    可以参考JLS7:https://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.3.2.3 public class Test5 ...

  8. C++:引用的简单理解

    前言:引用是C++一个很重要的特性,最近看了很多有关引用的资料和博客,故在此对引用的相关知识进行总结 一.什么是引用 引用,顾名思义是某一个变量或对象的别名,对引用的操作与对其所绑定的变量或对象的操作 ...

  9. 【转】WPF的知识

    [-] 闲话WPF之二XAML概述 闲话WPF之五XAML中的类型转换 闲话WPF之十六WPF中的资源 2 闲话WPF之十九WPF中的传递事件 1 闲话WPF之二十WPF中的传递事件 2 闲话WPF之 ...

随机推荐

  1. CF2B The least round way(贪心+动规)

    题目 CF2B The least round way 做法 后面\(0\)的个数,\(2\)和\(5\)是\(10\)分解质因数 则把方格中的每个数分解成\(2\)和\(5\),对\(2\)和\(5 ...

  2. [WEB安全]Weblogic漏洞总结

    0x01 Weblogic简介 1.1 叙述 Weblogic是美国Oracle公司出品的一个应用服务器(application server),确切的说是一个基于Java EE架构的中间件,是用于开 ...

  3. SpringCloud介绍及入门一

    springcloud是什么 基于spring boot实现的服务治理工具包,管理和协微服务 把别人的东西拿来组合在一起,形成各种组件 微服务协调者[service registtry注册中心 Eur ...

  4. 解决跨操作系统平台JSON中文乱码问题

    解决跨操作系统平台JSON中文乱码问题 LINUX统一使用utf-8编码,WINDOWS却不是. LINUX中间件,传输JSON给WINDOWS程序,会乱码. 解决办法: 对JSON字段是字符串类型的 ...

  5. What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?

     What are the benefits to using anonymous functions instead of named functions for callbacks and par ...

  6. VMware Workstation虚拟机打开系统时,提示“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件。是否在安装 VMware Workstation 后重新引导?”

    VMware Workstation虚拟机打开系统时,提示“无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件.是否在安装 VMware Workstation 后重新引导? ...

  7. XMind 快捷键完整命令

      XMind 快捷键完整命令 快捷键(Windows) 快捷键(Mac) 描述 + + 展开当前分支 - - 收缩当前分支 * * 展开所有分支 / / 收缩所有分支 Alt+- Alt+- 显示系 ...

  8. 记一次用WireShark抓包摆脱Si服后台限制的过程

    背景:闲着无聊找了个小众的手游,因为手游都是比较吃金的,所以就找了个Si服,鉴于小时候宝可梦的情怀,就TB买了个GM后台.谁知这玩意有限制,到了100级之后升级超级难,最多只能发送99999W点经验, ...

  9. ES--Kibana相关操作创建索引和Mapping

    创建索引 kibana 使用如下命令进行创建索引内容. PUT test_index/ 创建别名 POST _aliases { "actions": [{ "add&q ...

  10. python 设计模式之中介者模式

    #先啰嗦一下 至少半个多月的样子没写博客了,月初去了趟黄山,赏了美景,自然没时间也没条件敲博客了,一个多星期就这么过去了.返回深圳后,工作积压了一堆,然后白天就马不停蹄的忙工作,晚上回家伺候小娃,又想 ...