【Java核心技术阅读笔记】第三章 Java的基本程序设计结构
1.注释
//
/* */ 不能嵌套,因为要注释的代码块中可能包含*/界定符
/** */ 可以用来自动地生成文档(?不懂)
2.数据类型
Java是一种强类型语言。
8种基本数据类型:4种整型,2种浮点类型,1种字符类型char,1种表示真值的类型boolean。
2.1整型
用于表示整数(没有小数部分的数值),包括正整数和负整数——有符号数,如9,-19。
byte 1字节(8bit) -128~127 2^8=256。原码反码补码参照博客https://www.cnblogs.com/wkfvawl/p/10512739.html
short 2字节 -32768~32767 2^16=65536。65536/2=32768。
int 4字节 -21,4748,3648~21,4748,3647(刚刚超过20亿 2^32=42,9496,7296 最常用,但如果要表示整个地球的人口这种,就需要用long了。
long 8字节 2^64=1844,6744,0737,0955,1616
与C/C++不同,Java中,整型的范围与目标平台无关。无论是16位、32位还是64位处理器,4种整型的表示范围都是上面这样。
十六进制前缀0x或0X(如0xCAFE),八进制前缀0(如010,八进制易混淆),二进制前缀0b或0B。
长整型数值后面有一个后缀L或l,如4000000000L。
Java7之后,可以为数字加下划线使其更易读,Java编译器会自动去除这些下划线,不会影响程序运行。如1_000_000,0b1111_0100_0010_0100_0000。
注意:Java没有任何无符号形式(unsigned)的byte,short,int,long。
2.2浮点类型
浮点类型用于表示有小数部分的数值。
float 4字节 有效位数6~7位
double 8字节 有效位数15位
float类型的数值后缀为F或f,double类型的数值后缀为D或d,没有后缀的浮点数默认为double类型,如3.14。
三个特殊的浮点数值:正无穷大,负无穷大和NaN。分别用常量Double.POSITIVE_INFINITY,Double.NEGATIVE_INFINITY和Double.NaN表示。
一个正整数除以0的结果为正无穷大,负整数除以0的结果为负无穷大,0/0或负数的平方根的结果为NaN。判断一个数是不是NaN,不能用x==Double.NaN,而应该使用Double.isNaN(x)。因为非数值的值都认为是不相同的,
即使x是NaN,用第一种判断方法也会得出不相等的结果。
2.3字符类型
char 要用单引号括起来,如'A'
强烈建议不要在程序中使用char类型,除非确实需要处理UTF-16代码单元。
2.4boolean类型
布尔类型有两个值:true和false,不像C/C++那样,0相当于false,非0相当于true,Java中整型值和布尔值之间不能相互转换。
3.变量与常量
3.1声明变量
double salary;
int vacationDays;
long earthPopulation;
boolean done;
常用的变量命名:
Box box;
Box aBox;//"Box" is a type
3.2变量初始化
声明之后,使用赋值语句进行显式初始化。未初始化的变量的值不能使用。
int vacationDays;
vacationDays = 12;
也可以将声明和初始化放在同一行:
int vacationDays = 12;
变量的声明尽可能靠近变量第一次使用的地方,这是一种良好的编程习惯。
从Java10开始,如果可以从变量的初始值推断出变量的类型,就不再需要为变量声明类型。只需使用关键字var:
var vacationDays = 12;//vacationDays is an int
var greeting = "hello";//greeting is a string
Java不区分声明和定义,C/C++区分声明和定义。
3.3常量
在Java中,使用关键字final指示常量。常量意味着只能被赋值一次,一旦赋值,不可更改。常量名一般使用全大写。
final double CM_PER_INCH = 2.54;
如果希望某个常量可以在一个类的多个方法中使用,可以使用关键字static final设置一个类常量(class constant)。类常量的定义位于main方法的外部,也正因如此,同一个类的其他方法也可以使用这个常量。
如果希望在其他类的方法中使用这个常量,可以将其声明为public。
public class Constants
{
public static final double CM_PER_INCH = 2.54;
public static void main(String[] args)
{
}
}
const是Java的关键字,但是目前并没有使用,在Java中,必须使用final定义常量。
3.4枚举类型
有时候,变量的取值只在一个有限的集合内。如衣服尺码一般只有小、中、大和超大四种,可以将这些尺码编码为1、2、3、4。但是在使用时,变量中保存的可能是一个错误无意义的值,如0。
为了避免这种情况发生, 我们可以自定义枚举类型,将变量的取值限制在一个有限的集合内。如
enume Size { SMALL, MEDIUM, LARGE, EXTRE_LARGE };
之后,就可以声明Size类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能存储类型声明中给定的某个枚举值,或者是null,null表示这个变量没有设置任何值。
4.运算符
4.1算术运算符
+、-、*、/分别表示加减乘数。
%表示整数的求余操作(又叫取模)。
当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。例如:
15/2等于7, 15%2等于1, 15.0/2等于7.5。
整数除以0,会产生一个异常;浮点数除以0,会得到无穷大或NaN。
4.2数学函数与常量
Math类中,包含了各种各样的数学函数。
平方根函数,sqrt:
double y = Math.sqrt(x);
幂函数,pow:
double y = Math.pow(x,a); //y = x^a
关于整数求余数的方法,floormod; (?不懂)
三角函数:
Math.sin
Math.cos
Math.tan
Math.atan
Math.atan2
指数函数和对数函数:
Math.exp //exponent
Math.log
Math.log10
π和e常量的近似值:
Math.PI
Math.E
在实际使用时,不必在这些方法和常量面前添加“Math”前缀,只需在源文件顶部进行静态导入:
import static java.lang.Math.*;
Math类与StrictMath类的区别(?不懂)
4.3数值类型之间的转换 (自动、合法的转换)
4.4强制类型转换
强制类型转换的语法如下:
double x = 9.997;
int nx = (int) x; //强制类型转换通过截断小数部分将浮点数转换为整型,因此nx等于9
如果希望进行舍入运算,以求得最接近的整数,需要使用Math.round方法:
double x = 9.997;
int nx = (int) Math.round(x);//nx等于10
当调用round时,仍需要使用强制类型转换(int)。这是因为round的返回值是long类型的,由于从long到int存在信息丢失的可能,因此只有使用显式的强制类型转换才能将long类型转换为int类型。
4.5结合赋值和运算符
可以在赋值中使用二元运算符,例如:
x += 4;
等价于
x = x + 4;
4.6自增自减运算符
n++; ++n; n--; --n;
前缀和后缀形式的自增自减运算符,在表达式中使用时,会有一些区别,例如:
int m = 7;
int n = 7;
int a = 2 * ++m; // now a is 16, m is 8
int b = 2 * n++; // now b is 14, n is 8
建议不要在表达式中使用++,因为这样很容易让人困惑,而且容易产生bug。
4.8关系和boolean运算符
关系运算符:
== != < > <= >=
boolean运算符:
逻辑与&& 逻辑或|| 逻辑非!
逻辑与、逻辑或、逻辑非是对boolean值的操作,属于离散数学范畴。按位与、按位或、按位非是对计算机位的操作,属于计算机二进制位运算范畴。
&&和||都是按照短路方式来求值的,当第一个操作数已经能确定表达式的值时,第二个操作数就不会再计算了。这一点可以巧妙地使用:
x != 0 && 1/x > x+y; //no division by 0
如果x等于0,那么第二部分就不会计算,也就是不会计算1/x,这样就避免了除以0的错误。
Java支持三元操作符?:
condition ? expression1 : expression2
如果条件为true,上面这个表达式的值就是表达式1的值,如果条件为false,上面这个表达式的值就是表达式2的值。例如:
x<y ? x : y;//会返回x和y中较小的那一个
4.9位运算符 (?不懂)
&("and") |("or") ^("xor") ~("not")
移位运算符>>和<<
>>>运算符 (不存在<<<运算符)
4.10括号与运算符级别
如果不使用圆括号,就按照运算符优先级次序进行计算。同一个级别的运算符按照从左向右的次序进行计算(右结合运算符除外)。
例如,由于&&的优先级比||高,所以表达式
a && b || c
等价于
(a && b) || c
由于+=是右结合运算符,所以表达式
a += b += c
等价于
a += (b += c)
Java运算符优先级表见《Java核心技术卷一》p44.
与C/C++不同,Java不使用逗号运算符,不过可以在for语句中使用逗号分隔表达式列表。
5.字符串
从概念上讲,Java字符串就是Unicode字符序列。Java中没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫做String,Java中每个用双括号括起来的字符串都是String类的一个实例:
String e = ""; //an empty string
String greeting = "Hello";
5.1子串
String类的substring方法可以从一个较大的字符串中提取出一个子串。例如:
String greeting = "Hello";
String s = greeting.substring(0,3); //s等于“Hel”
substring方法的第二个参数表示的是不想复制的第一个位置,例如上面的代码表示复制位置0,1,2的字符。
5.2拼接
与绝大多数程序设计语言一样,Java允许使用+号拼接两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13; //message等于"Expletivedeleted"
当将一个字符串与一个非字符串的值进行拼接时,后者会转换成字符串,例如:
int age = 13;
String rating = "PG" + age; //rating等于"PG13"
这一特性经常用在输出语句中,例如:
System.out.println("The answer is " + answer);
如果需要把多个字符串放在一起,用一个界定符分隔,可以使用静态join方法:
String all = String.join(" / ", "S", "M", "L", "XL"); //all等于“S / M / L / XL”
在Java11中,还提供了一个repeat方法:
String repeated = "Java".repeat(3); //repeated等于"JavaJavaJava"
【Java核心技术阅读笔记】第三章 Java的基本程序设计结构相关推荐
- java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略
java虚拟机读书笔记 第三章 垃圾收集器和内存分配策略 GC需要完成的三件事情:哪些内存需要回收.什么时候回收.如何回收 垃圾回收器在对堆进行回收前,首先要确定那些对象存活,哪些对象已经死去,判断的 ...
- 深入理解 C 指针阅读笔记 -- 第三章
Chapter3.h #ifndef __CHAPTER_3_ #define __CHAPTER_3_/*<深入理解C指针>学习笔记 -- 第三章*//*它们都保存在栈中的什么位置?*/ ...
- 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常
最近想好好复习一下java虚拟机,我想通过深读 [理解Java虚拟机 jvm 高级特性与最佳实践] (作者 周志明) 并且通过写一些博客总结来将该书读薄读透,这里文章内容仅仅是个人阅读后简短总结,加强 ...
- 深入Java虚拟机读书笔记第五章Java虚拟机
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...
- java程序语言设计第三章答案_java语言程序设计课后习题解答张思民第三章
java语言程序设计课后习题解答张思民第三章 1 第3章 面向对象程序设计基础 [1]什么是 Java 程序使用的类?什么是类库? [解答]:Java 程序的基本单位是类.对象是对事物的抽象,而类是对 ...
- 《机器学习》阅读笔记 第三章
Contents 1. 不同学科中的线性模型[^1] 2. 线性模型:回归任务 2.1 估计方法 2.2 正则化 2.3 广义线性模型 3. 线性模型:分类任务 3.1 对数几率回归 线性判别分析(L ...
- Java核心技术 卷1 基础知识 学习笔记——第三章 java的基本程序设计结构
1. 一个正整数除以0的结果为正无穷大,0/0或者负数的平方根的结果为NaN(不是一个数字): if(x==Double.NaN)//is never true,所有非数值的值都认为是不同的 if(D ...
- 如何用java输出方格_第三章 Java类基础知识作业之(输出5*5数字方格,打印星塔)...
public class Main { public static void main(String[] args) { // main函数的输入参数:Run as -> Run Configu ...
- 《Concurrency in Go》阅读笔记 -- 第三章:Go语言并发组件
<Concurrency in Go> 本章节从goroutine入手,讲解go语言的各种并发原语.在讲解完goroutine之后,对于传统的内存同步访问的并发原语:sync包中的Mute ...
最新文章
- 百度的卡尔曼滤波的解释
- 记一次用iview实现表格合并单元格的具体操作
- Entropy of Primitive: From Sparse Representation to Visual Information Evaluation(TCSVT2015)
- boost::python::pointee相关的测试程序
- html th不显示下边框,css怎么设置不显示table的边框?
- HDOJ 2037 今年暑假不AC 【贪心】
- 虚拟机控制数据结构 (VMCS)状态转换
- 芯片14纳米与7纳米相比,是不是芯片大一点,性能差不太多呢?
- CSS 控制元素 上下左右居中
- 数据库对象之存储过程
- Vue开发者工具安装祥析
- 简述网卡的作用和工作原理_简述网卡的主要功能
- jvm:ObjectMonitor源码
- lamp技术_LAMP技术简介:
- OpenGL使用FBO与PBO上行纹理 (YUYV)
- 走进诺奖大师系列:科斯(Ronald H.Coase)
- 200行Perl 语言实现 VCD 转ATE测试pattern ---pattern的解析
- 计算机 英语 文献翻译,计算机类外文文献翻译_1.doc
- CSS 与 地图可视化 三棱锥 (九)
- 科技创业的新规律:先创业、再创意
热门文章
- Python 动态规划理解
- 仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边
- 机器学习()-多分类任务混淆矩阵
- SaaSBase:最受欢迎的CRM软件有哪些
- CloudFoundry User Account and Authentication (UAA) Server‘s Scope System
- 使用 K3d 在 Docker 中运行 Kubernetes 集群
- 基于EasyX来使用中点算法画线
- 为服务器安装winserver系统无法识别rtx显卡问题
- linux 编程--prctl()函数应用
- 做素的女人还是香的女人?