Java语言程序设计(第12版)个人复习 第二章
这里写目录标题
第二章知识点
加号(+) 有两种意义:
1.种用途是做加法,
2.另一种用途是做字符串的连接(合并)。它把两个字符串合并为一个。如果一个字符串和一个数值连接,数值将转化为字符串然后再和另外一个字符串连接。
源代码中字符串不能跨行,因此下面语句将导致编译错误
为了改正错误,将该字符串分成几个单独的子串,然后再用连接符(+) 将它们组合起来:
标识符必须遵守以下规则:
标识符是由字母、数字、下划线( _ )和美元符号( $ )构成的字符序列。
标识符必须以字母、下划线( _ )或美元符号( $ )开头,不能以数字开头。
标识符不能是保留字。保留字在java语言中具有特定含义。关键字是保留字(如下图)。
标识符可以为任意长度
变量的声明与赋值
如果几个变量为同一类型,可以一起声明它们:
datatype variable1,variable2,…,variablen;
变量之间用逗号隔开,例如:
int i,j,k;//declare i,j and k as int variables
使用简捷的方式来同时声明和初始化同一类型的变量:
int i = 1, j = 2;
变量的赋值,下列赋值是正确的:
如果要一个值赋给多个变量,可以采用链式赋值,如下所示:
i = j = k = 1;
等价于:
k = 1;
j = k;
i = j;
ps!!int i = j = k = 1;
是错误的
常量命名
final datatype CONSTANTNAME = value;
必须在同一条语句中对常量进行声明和赋值。final是声明常量的Java关键字。按照惯例,常量中所有的字母都要大写。
命名习惯
a.用小驼峰法命名变量和方法
b.用大驼峰法命名类和接口
c.常量中所有字母大写,两个单词间用下划线连接(MAX_VALUE)
数值数据类型和操作
整数
byte 1个字节 -128 127
short 2个字节 -32768 32767
int 4个字节 -21亿 21亿 写一个整数常量 默认是int类型
long 8个字节 long范围>int范围
小数
float 4个字节 float范围>long范围
double 8个字节 double范围>float范围 写一个小数常量 默认是 double类型
字符
char 2个字节 char范围=short范围
布尔
> boolean 1个字节 true false
操作符
当除法的两个操作数均为整数时,除法的结果为商,而小数部分截去。所以,为了执行浮点数的除法,其中一个操作数必须是浮点数。
操作符%通常用于正整数,但也可用于负整数和浮点值。只有当被除数是负数时,余数才是负的。
例如:-7%3的结果是-1, -7%-3的结果是-1, 7%-3的结果是1。
数值型字面值
整型字面值
默认是int
long类型需要在后面加上l或者L
默认情况下,整型字面值是一个十进制整数。如果表示一个二进制整型字面值,使用前置0b或者0B;如果表示一个八进制整型字面值,使用前置0;而要表示一个十六进制整型字面值,使用前置0x或0X
System.out.println(0B1111); // Displays 15
System.out.println(07777); // Displays 4095
System.out.println(0XFFFF); // Displays 65535
浮点型字面值
浮点字面值带小数点,默认为double类型。float型值在数值后面加上f或F。也可以用1.2d或者1.2D表示double型。
float型值有6 ~ 9个有效数字,而double型值具有15 ~ 17个有效数字
为了提高可读性,Java允许在一个数值型字面值中使用下划线分隔两个数字。例如:
然而,45_和_45是不正确的。下划线必须置于两个数字之间
long value = 232_45_4519;
double amount = 23.24_4545_4519_3415;
显示当前时间
通过调用System.currentTimeMillis();返回当前时间。
System类中的方法currentTimeMillis返回从GMT1970年1月1日零点开始到当前时刻的毫秒数。这一时间被称为UNIX时间戳(UNIX epoch)时间戳是时间开始计时的点,因为1970年是UNIX操作系统正式发布的时间。
可以使用这个方法获取当前时间,然后按照如下步骤计算出当前的秒数、分钟数和小时数:
1 ) 调用 System.currentTimeMillis() 方法获取 1970 年 1 月 1 日午夜到现在的毫秒数(例如:1203183086328 毫秒),并存放在变童 totalMilliseconds 中。
2 ) 通过将总毫秒数 totalSeconds 除以 1000 得到总秒数 totalSeconds (例如:1203183068328 毫秒 /1000=1203183068 秒)。
3 ) 通过 totalSeconds % 60得到当前的秒数(例如: 1203183068秒%60=8,这个值就是当前秒数)。
4 ) 通过将 totalSeconds 除以60得到总的分钟数 totalMinutes (例如:1203183068秒 /60=20053051分钟)。
5 ) 通过 totalMinutes%60 得到当前分钟数(例如:20053051分钟%60=31, 这个值就是当前分钟数)。
6 ) 通过将总分钟数 totalMinutes 除以 60 获得总的小时数 totalHours (例如: 20053051分钟 /60=334217 小时)。
7 ) 通过 totalHours % 24 得到当前的小时数(例如:334217 小时%24=17, 该值就是当前小时数)。
class test {
public static void main(String[] args) {
// Obtain the total milliseconds since midnight, Jan 1, 1970
long totalMilliseconds = System.currentTimeMillis();
// Obtain the total seconds since midnight, Jan 1, 1970
long totalSeconds = totalMilliseconds / 1000;
// Compute the current second in the minute in the hour
long currentSecond = totalSeconds % 60;
// Obtain the total minutes
long totalMinutes = totalSeconds / 60;
// Compute the current minute in the hour
long currentMinute = totalMinutes % 60;
// Obtain the total hours
long totalHours = totalMinutes / 60;
// Compute the current hour
long currentHour = totalHours % 24;
// Display results
System.out.println("Current time is " + currentHour + ":" +
+ currentMinute + ":" + currentSecond + " GMT");
}
}
Java还提供了System.nanoTime()方法以返回以纳秒为单位的流逝时间。nanoTime()比currentTimeMillis()更加精确
增强赋值操作符
增强赋值操作符在表达式中的所有其他操作符计算完成之后才执行
自增和自减操作符
先计算左侧的操作数规则优于任何其他控制表达式的规则。
int a = 10;
int b = 20;
int c = 30;
int d = 40;
int e = a++ + --b - --c + d-- * ++a + --b;
System.out.println(e);
数值类型转换
byte < short = char < int < long < float < double
boolean不参与转换
System.out.println('a' + 0);//a是char类型 要向int类型转换
隐式类型转换:
小范围数据类型转换为大范围数据类型。
不同的数据类型之间不能进行运算,只有转化为同一种类型才可以进行运算。
规则:
1.比int小的都转化为int
class Demo {
public static void main(String[] args){
byte a = 10;
short b = 20;
byte c = a + b; //编译报错 因为a+b的结果是int类型 大类型无法向小类型进行转换
byte c = (byte) (a + b) ;//可以强制类型转换
System.out.println(c);
}
}
2.比int大的数据类型进行转换时,小范围数据类型会自动转为大范围数据类型
public class Demo {
public static void main(String[] args) {
long lo = 100L;
double d = 3.14;
int a = lo +d; // 编译报错 long和double运算 long会自动转double
double dou = lo +d;
System.out.println(dou);
long lon = (long) (lo + d);
System.out.println(lon);
}
}
强制类型转换:
大范围数据类型强制转为小范围数据类型
情况:
1.大转小,大超小的范围,转过去之后数据发生改变,意义不大
int a = 200;
byte b = (byte)a; // 强制类型转换
System.out.println(b); // -56
2.大转小,大未超过小的范围,转过去之后数据不发生改变
int c = 100;
byte d = (byte)c; // 意义所在
System.out.println(d); //100
3.浮点数转整数:
切掉小数部分
double dou = 3.14;
int i = (int)dou; //意义所在
System.out.println(i);//3
类型转换注意事项:
1.boolean不参与任何类型转换
boolean b = true;
int c = b; //编译报错
int a = (int)b; //编译报错
System.out.println(a);
2.常量优化机制(基本类型中只有比int小的数据才有常量优化)
常量优化是为了小数据类的快捷运算
public class Demo {
public static void main(String[] args) {
System.out.println(100); // 默认是 int 类型 4个字节。
byte b = 100; // 正确的。 100虽然是int的 但是他是一个常量数据。 常量优化机制
//底层 其实是这样的 byte b = (byte)100;
int a = 100;
byte c = a; //错误的 因为a是变量 只有常量才有 常量优化机制。
byte d = 80 + 20; //正确的 常量优化
// 常量的运算 在编译成class文件的时候, 就已经把 80+20 变成了100
// 也就是说 等这句话 编译到了class文件的时候 就变成了 byte d = 100; 就又符合常量优化机制了。
//大的数据类型是在运行的时候完成运算,所以没有常量优化
byte e = 80;
byte f = e+20; // 编译报错 e是变量
// 以上的特点 ---演示的都是 比int小的 基本类型常量。
// 在基本类型里面 只有 比int小的数据 才遵循常量优化机制。 比int大的没有。
System.out.println(3.14); // 默认是double类型
float flo = 3.14; // 编译报错 double转float 报错。 比int大的没有常量优化机制。
// 所以我们为了在 一个 小数常量的时候 告诉jvm 我这个小数常量 不再是默认是 double类型了 所以 我们就在小数后面加一个 F
System.out.println(3.14F); // 是float类型
float flo = 3.14F;
System.out.println(b);
}
}
- ps
byte d = 10;
d += 5;
System.out.println(d);//不报错 为15,+=底层自带强制类型转换
int e = 10;
int f = e+=1;//不报错,先算表达式的结果,表达式都是有结果的
3.long类型要在数据结尾加L
public class Demo12 {
public static void main(String[] args) {
int a = 100;
long lo = a;
System.out.println(lo);
long lo = 100;
System.out.println(lo);
System.out.println(10000); //默认是int类型 int类型的范围 21亿
//System.out.println(10000000000); //100亿
// 所以 我们此时 就想 写一个 比21亿大的数据
// 你需要告诉jvm 我现在写的这个数 不再是 int类型的 而是long类型 你怎么告诉jvm 你只需要在后面加一个 L 就告诉他了。
System.out.println(10000000000L);
}
}
关键术语
课后习题
2.1 (Convert Celsius to Fahrenheit)
Write a program that reads a Celsius degree in a double value from the console, then converts it to Fahrenheit, and displays the result. The formula for the conversion is as follows:
fahrenheit = (9 / 5) * celsius + 32
Hint: In Java, 9 / 5 is 1, but 9.0 / 5 is 1.8.
Here is a sample run: