Java学习-第二天

Java学习-第二天
今日学习共7节课
学习笔记梳理:

第二章:变量与运算符

04.基本数据类型介绍

整型 占用字节空间 默认值 取值范围
byte 1字节 0 -128 ~ 127
short 2字节 0 -32768 ~ 32767
int 4字节 0 -2,147,483,648~ 2,147,483,647
long 8字节 0L -9,223,372,036,854,775,808~9,223,372,036,854,775,807

浮点型 占用字节空间 默认值 取值范围
float 4字节 0.0F 10^38
double 8字节 0.0D 10^308

字符型 占用字节空间 默认值 取值范围
char 2字节 ‘\u0’ 0 ~ 65535

布尔型 占用字节空间 默认值 取值范围
boolean 视情况而定 false true、false

001)浮点型

常见浮点(小数)型float和double在计算多位小数时不能准确计算,这时我们就要用到精确计算的BigDecimal
我们来试试,代码:

class csxs {
public static void main(String[] args){
    double z1 = 0.1;
     double z2 = 0.2;
    System.out.println(z1 + z2);
}

}

输出为:
0.30000000000000004

测试二:

class cse {
public static void main(String[] args){
    float z1 = 123123123F;
     float z2 = z1 + 1;
    System.out.println(z1);
    System.out.println(z2);
    System.out.println(z1 == z2);
}

}

输出为:
1.2312312E8
1.2312312E8
true
相等,从而看出float和double计算的不准,而计算准确的BigDecimal暂时没有学

来看看浮点例题
例题1:
001)圆周率赋值为3.14,现在有三个圆的半径分别为1.2,2.5,6,求它的面积
002)圆的计算公式为:S=πr²

代码:

class rrr {
public static void main(String[] args){
    double pi = 3.14;
    double z1 = 1.2;
    double z2 = 2.5;
    int z3 = 6;
    System.out.println(pi * z1 * y1);
    System.out.println(pi * z2 * y2);
    System.out.println(pi * z3 * y3);
}

}

输出为:
4.521599999999999
19.625
113.03999999999999

例题2:
001)爱坤要去美利坚旅游要一个华氏度转摄氏度的程序(80华氏度)
002)℃ = (℉ -32) / 1.8

代码:

class she {
public static void main(String[] args){
    double hua = 80.0;
    double she = (hua - 32) / 1.8;
    System.out.println("华氏度" + hua + "时华氏度对应的摄氏度为" +  she + "c");
}

}

输出为:
华氏度80.0时华氏度对应的摄氏度为26.666666666666664c

002)字符型
有三种形式:
形式 1:使用单引号(' ')括起来的单个字符
例如:
char z1 = 'a';
char z2 = '中';
char z3 = '9';

输出为:a,中,9
形式 2:直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX 代表一个十六进制整数
例如:

    class uuu {
public static void main(String[] args){
    char z1 = '\u0023';
    System.out.println(z1);
}

}

输出为:#

形式 3:Java 中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量
例如:

class zifu {
public static void main(String[] args){
    char z1 = '\n';
    //\n表示换行
    char z2 = '\t';
    //\t表示空格
    System.out.println("321" + z1 + "123" + z2 + "231");
}

}

输出为:
321
123 231

转义字符说明
\n 换行符\u000a
\t 制表符\u0009
\" 双引号\u0022
\' 单引号\u0027
\ 反斜线\u005c
\b 退格符\u0008
\r 回车符\u000d

003)布尔型
在布尔型中只有两个值,true和false,不可以使用 0 或非 0 的整数替代 false 和 true,这点和 C 语言不同,代码:
boolean z1 = true;
boolean z2 = false;

boolean 类型用来判断逻辑条件,一般用于流程控制语句中:

if 条件控制语句;
while 循环控制语句;
for 循环控制语句;
do-while 循环控制语句;

经验之谈:
Less is More!建议不要这样写:if ( isFlag = = true ),只有新手才如此。关键也很容易写错成 if(isFlag = true),这样就变成赋值 isFlag 为 true 而不是判断!老鸟的写法是 if (isFlag)或者 if (!isFlag)

004)基本数据类型变量间运算规则
在 Java 程序中,不同的基本数据类型(只有 7 种,不包含 boolean 类型)变量的值经常需要进行相互转换。转换的方式有两种:自动类型提升和强制类型转换

005)基本数据类型变量间的运算规则
规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型

排序规则

(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给
了存储范围大的变量时
int i = 'A';//char 自动升级为 int,其实就是把字符的编码值赋值给 i 变量了
double d = 10;//int 自动升级为 double
long num = 1234567; //右边的整数常量值如果在 int 范围呢,编译和运行都可以
通过,这里涉及到数据类型转换
//byte bigB = 130;//错误,右边的整数常量值超过 byte 范围
long bigNum = 12345678912L;//右边的整数常量值如果超过 int 范围,必须加 L,
显式表示 long 类型。否则编译不通过

(2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,
会按照其中最大的类型运算。
int i = 1;
byte b = 1;
double d = 1.0;
double sum = i + b + d;//混合运算,升级为 double

(3)当 byte,short,char 数据类型的变量进行算术运算时,按照 int 类型处理。
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2;//编译报错,b1 + b2 自动升级为 int
char c1 = '0';
char c2 = 'A';
int i = c1 + c2;//至少需要使用 int 类型来接收
System.out.println(c1 + c2);
输出为:113

练习:
设 x 为 float 型变量,y 为 double 型变量,a 为 int 型变量,b 为 long 型变量,c
为 char 型变量,则表达式
x + y * a / x + b / y + c 的值类型为:
A. int B. long C. double D. char

5.强制类型转换
int i = 3.14; // 编译报错
想要赋值成功,只有通过强制类型转换,将 double 类型强制转换成 int 类型才能赋值

规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型
自动类型提升是 Java 自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行

转换格式:
数据类型 1 变量名 = (数据类型 1)被强转数据值; //()中的数据类型必须<=变量值的数据类型
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度或溢出
int i = (int)3.14;//损失精度
double d = 1.2;
int num = (int)d;//损失精度
int i = 200;
byte b = (byte)i;//溢出

(2)当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是没有风险的,通常省略
int i = 1;
int j = 2;
double bigger = (double)(i/j);

(3)声明 long 类型变量时,可以出现省略后缀的情况。float 则不同

long l1 = 123L
long l2 = 123;//如何理解呢? 此时可以看做是 int 类型的 123 自动类型提升为 long 类型
//long l3 = 123123123123; //报错,因为 123123123123 超出了 int 的范围
long l4 = 123123123123L;
//float f1 = 12.3; //报错,因为 12.3 看做是 double,不能自动转换为 float类型
float f2 = 12.3F;
float f3 = (float)12.3;

常见错误
1)short s = 5;
s = s-2; //判断:no
2) byte b = 3;
b = b + 4; //判断:no
b = (byte)(b+4); //判断:yes
3)char c = ‘a’;
int i = 5;
float d = .314F;
double result = c+i+d; //判断:yes
4) byte b = 5;
short s = 3;
short t = s + b; //判断:no

问答:为什么标识符的声明规则里要求不能数字开头?
//如果允许数字开头,则如下的声明编译就可以通过:
int 123L = 12;
//进而,如下的声明中 l 的值到底是 123?还是变量 123L 对应的取值 12 呢? 出现
歧义了。
long l = 123L;

001)基本数据类型与 String 的运算
字符串类型:String
String 不是基本数据类型,属于引用数据类型
使用一对""来表示一个字符串,内部可以包含 0 个、1 个或多个字符。
声明方式与基本数据类型类似。例如:String str = “尚硅谷”;
002)运算规则

1、任意八种基本数据类型的数据与 String 类型只能进行连接“+”运算,且结果一定也是 String 类型
System.out.println("" + 1 + 2);//12
int num = 10;
boolean b1 = true;
String s1 = "abc";
String s2 = s1 + num + b1;
System.out.println(s2);//abc10true
//String s3 = num + b1 + s1;//编译不通过,因为 int 类型不能与 boolean 运算
String s4 = num + (b1 + s1);//编译通过
2、String 类型不能通过强制类型()转换,转为其他的类型
String str = "123";
int num = (int)str;//错误的
int num = Integer.parseInt(str);//正确的,后面才能讲到,借助包装类的方法才能转

今日学习到此为止

版权属于:张芷豪 本文链接:https://zzh.xn--fiqs8s/index.php/archives/9/ 转载申明:转载请保留本文转载地址,著作权归作者所有。

评论 1

  1. 张芷豪

    怎么没人评论?

    2023-07-16
没有更多啦
Title - Artist
0:00