【Java核心技术阅读笔记】第三章 Java的基本程序设计结构

本文详细介绍了Java编程的基础知识,包括注释的使用,8种基本数据类型的特性和范围,如整型、浮点型、字符型和布尔型。此外,还讲解了变量声明、初始化、常量定义,以及枚举类型的使用。文章深入探讨了算术、逻辑和位运算符,以及字符串操作,如子串提取和拼接。最后,提到了运算符优先级和类型转换的重要性。
摘要由CSDN通过智能技术生成

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"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值