文章规定:
大标题对应书中的章节名
小标题对应书中的每章小节名
凡事直接写的文字都是书中原话
在块引用中的内容是我自己的理解
如无特殊解释,代码块的内容来自书中
前言
程序是什么呢?程序是对现实世界的数字化模拟。开发一个程序,实际是创造一个或大或小的“模拟世界”
第一章-Java语言概述
1.1Java语言的发展简史
Sun在1996年年初发布了JDK 1.0。这个版本包括两部分:运行环境(即JRE)和开发环境(即JDK)。运行环境包括核心API、集成API、用户界面API、发布技术、Java虚拟机(JVM)五个部分;开发环境包括编译Java程序的编译器(即javac命令)。
1.3Java程序运行机制
Java语言是一种特殊的高级语言,它既具有解释型语言的特征,也具有编译型语言的特征,因为Java程序要经过先编译,后解释两个步骤。
java源程序需要先交给编译器编译成为class文件,之后将编译之后的class文件交给jvm解释运行,在产品上线时基本只上传编译之后的class文件
1.7垃圾回收机制
JRE会负责回收那些不再使用的内存,这种机制被称为垃圾回收(Garbage Collection,也被称为GC)
2011年7月发布的JDK 7提供了G1垃圾回收器来代替原有的并行标记/清除垃圾回收器(简称CMS)在未来的日子里,G1垃圾回收器将会逐渐取代原有的CMS垃圾回收器。相信G1的性能、稳定性将会比CMS更胜一筹。
关于G1垃圾回收器的内容,在周志明老师的《深入理解java虚拟机》一书中有更深入的讲解
第二章-数据类型和运算符
2.1注释
javadoc工具默认只处理以public或protected修饰的类、接口、方法、Field、构造器和内部类之前的文档注释。
在看别人的项目时,总会看到一些方法或类的前面有绿色的注释,这就是文档注释,对项目编写良好的文档注释可以生成类似javaAPI的文档,这是团队协作的基础
如果我们希望javadoc工具生成更详细的文档信息,例如为方法参数、方法返回值等生成详细的说明信息,则可利用javadoc标记。常用的javadoc标记如下。
@author:指定Java程序的作者。
@version:指定源文件的版本。
@deprecated:不推荐使用的方法。
@param:方法的参数说明信息。
@return:方法的返回值说明信息。
@see:“参见”,用于指定交叉参考的内容。
@exception:抛出异常的类型。
@throws:抛出的异常,和exception同义。
2.2标识符和关键字
Java语句可以跨越多行书写,但一个字符串、变量名不能跨越多行
例如:
Java语言的标识符必须以字母、下画线(_)、美元符($)开头,后面可以跟任意数目的字母、数字、下画线(_)和美元符($)。此处的字母并不局限于26个英文字母,而且可以包含中文字符、日文字符等。标识符中不可以包含空格,不能使用Java关键字和保留字,标识符的长度没有限制。
我的中专数据库老师浦小蕊老师告诉我一个更好记的版本
Java标识符由数字,字母,下划线和美元符,以及各种其他语言的字符组成(包括中文,日文等),但不能以数字开头,
这里有个很好玩的点,java标识符可以由中文构成,那么理论上一个类,以及其中的变量都可以由中文构成
如:
这对英文不好的同学十分友好,但可能产生未知隐患(运行平台和生产环境的编码方式不同)
标识符不能是Java关键字和保留字,但可以包含关键字和保留字。
标识符只能包含美元符($),不能包含@、#等其他特殊字符。
2.3数据类型分类
有的时候也把char型称为字符型,实际上字符型也是一种整数类型。
这就是char类型的字符可以直接被数值+/-,并且输出数字的原因,+/-时使用的是这个字符的ascll码值,那么当有一个中文的char进行数值运算时,还是会输出数字,使用的是utf-8编码,我猜想这个中文字符的值,是存储中文字符二进制的值,
引用类型包括类、接口和数组类型,还有一种特殊的null类型。所谓引用数据类型就是对一个对象的引用,对象包括实例和数组两种。实际上,引用类型变量就是一个指针,只是Java语言里不再使用指针这个说法。
空引用(null)只能被转换成引用类型,不能转换成基本类型,因此不要把一个null值赋给基本数据类型的变量。
2.4基本数据类型
至于程序中的byte binVal4 = (byte)0b11101001;代码,其中0b11101001依然是一个32位的正整数,只是程序进行强制类型转换时发生了溢出,导致它变成了负数。
顶顶顶顶
如果把0~65535范围内的一个int整数赋给char类型变量,系统会自动把这个int整数当成char类型来处理。
char更像是一种特殊的类型,处在字符和数值中间,java将其分到了数值类型-整数类型下,但在程序中却表现为字符
只有浮点数除以0才可以得到正无穷大或负无穷大,因为Java语言会自动把和浮点数运算的0(整数)当成0.0(浮点数)处理。如果一个整数值除以0,则会抛出一个异常:ArithmeticException:/by zero(除以0异常)。
如果使用一个boolean类型的值和字符串进行连接运算,则boolean类型的值将会自动转换成字符串。
2.5基本类型的类型转换
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义了如下的自动提升规则。
所有的byte类型、short类型和char类型将被提升到int类型。
整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
操作数的等级如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。
一个错误的例子:
//定义一个short类型的变量
short it=5;
//表达式中的it将被提升到int类型
//将int类型赋给short将发生错误
it=it-2;
上面的“it–2”表达式的类型将被提升到int类型,这样就把右边的int类型值赋给左边的short类型变量,从而引起错误。
//输出字符串Hello!a7
System. out.println("Hello!" + 'a’+ 7);
//输出字符串104Hello!
System. out.println('a’+7 +"Hello!");
对于第二个表达式,先进行“'a' + 7”加法运算,其中'a'自动提升到int类型,变成a对应的ASCII值:97,从“97+7”将得到104,然后进行“104+"Hello!"”运算,104会自动转换成字符串,将变成两个字符串的连接运算,从而得到104Hello!。
每个表达式除非加括号,否则执行顺序为从左到右
2.6直接量
直接量是指在程序中通过源代码直接指定的值,例如在int a=5;这行代码中,为变量a所分配的初始值5就是一个直接量。
关于字符串直接量有一点需要指出,当程序第一次使用某个字符串直接量时,Java会使用常量池(constant pool)来缓存该字符串直接量,如果程序后面的部分需要用到该字符串直接量时,Java会直接使用常量池(constant pool)中的字符串直接量。
常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括关于类、方法、接口中的常量,也包括字符串直接量。
当一个字符串由多个字符串常量连接而成时,它本身也是字符串常量
string p='中'+'国';
那么p变量的值-中国
1.如果常量池中没有,则创建,将p指向-中国-这个常量
2.常量池存在,则直接指向
2.7运算符
如果除法运算符的两个操作数有1个是浮点数,或者2个都是浮点数,则计算结果也是浮点数,这个结果就是自然除法的结果。而且此时允许除数是0,或者0.0,得到结果是正无穷大或负无穷大。
自加和自减只能用于操作变量,不能用于操作数值直接量或常量。例如,5++、6−−等写法都是错误的。
Java的右移运算符有两个:>>和>>>,对于>>运算符而言,把第一个操作数的二进制码右移指定位数后,左边空出来的位以原来的符号位填充,即如果第一个操作数原来是正数,则左边补0;如果第一个操作数是负数,则左边补1。>>>是无符号右移运算符,它把第一个操作数的二进制码右移指定位数后,左边空出来的位总是以0填充。
普通右移正负值不变,无符号右移总能得到正数
必须指出的是,>>、>>>和<<3个移位运算符并不适合所有的数值类型,它们只适合对byte、short、char、int和long等整数类型进行运算。
左移n位就相当于乘以2的n次方,右移n位则是除以2的n次方。
public class EnhanceAssignTest{
public static void main(String[] args){
//定义一个byte类型的变量
byte a = 5;
//下面语句出错,因为5默认是int类型,a +5就是int类
型
//把int类型赋给byte类型的变量,所以出错
//a = a + 5;
//定义一个byte类型的变量
byte b = 5;
//下面语句不会出现错误
b += 5;
}
}
运行上面程序,不难发现a=a+5和a+=5虽然运行结果相同,但底层的运行机制还是存在一定差异的。因此,如果可以使用这种扩展后的运算符,则推荐使用它们。
很怪,+=之后数字5失去了默认的int类型,数据类型并没有被提升
基本类型的变量、值不能和引用类型的变量、值使用==进行比较;boolean类型的变量、值不能与其他任意类型的变量、值使用==进行比较;如果两个引用类型之间没有父子继承关系,那么它们的变量也不能使用==进行比较。
如果两个操作数都是引用类型,那么只有当两个引用变量引用相同类的实例时才可以比较(有继承关系),而且这两个引用必须指向同一个对象才会返回true。
运算符优先级
因为Java运算符存在这种优先级的关系,所以笔者经常看到有些学生在做SCJP,或者某些公司的面试题,有如下Java代码:int a=5;int b=4;int c=a++−−−b*++a/b−−>>2 % a−−;,c的值是多少?
在实际开发中,谁写出这样的代码,要被打死
世界上对的路可能只有一条,错的路却可能有成千上万条,不要成为别人的前车之鉴!
万望诸君早日赚大钱,莫在人世间沉浮
Java数据类型
后言
我曾在英二的重修课上认识了一位学文的老哥,他的有些文字写的非常棒,借此分享给各位
春末的五月。
深夜和挚友聊天,聊着聊着眼泪止不住地往下淌。
两个曾经满腔热情的年轻人,如今身上少见坚定的眼眸和固执的臂弯。
岁月不居,雪落旧时山岗。这一路走来我们得到了什么,失去了什么,谁也说不清楚,只是两个人都有无数的热泪要对过往的日子流。
人啊,到底前行到哪里算是尽头。到底跌倒多少次才能不摔跟头。
没有人能给出一个答案。
可即便如此,在这样一个被真善美笼罩的夜里,我还是想再问一问:我们真的会好吗。
我们能和喜欢的人做朋友、和相爱的人结婚吗。
我们那些最真诚的想象和最朴素的理想,真的能够实现吗。
我们给出的答案,能拥有说服自己与他人的力量吗。
那一盏照亮过无数年轻人的灯,能指引我们也走向光明吗。
这个世界,会好吗。