【数据类型转换、运算符、方法入门】

这篇博客详细介绍了Java中的数据类型转换,包括自动转换和强制转换的规则,强调了强转的风险。同时,讲解了算数、赋值、比较、逻辑和三元运算符的使用,并探讨了ASCII编码表。此外,还介绍了方法的基本概念和调用,以及JShell脚本工具的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

day02 【数据类型转换、运算符、方法入门】

今日内容

  • 数据类型转换
  • 算数运算符
  • 比较运算符
  • 逻辑运算符
  • 三元运算符
  • 简单方法定义和调用

教学目标

  • 理解数据类型的自动转换 【小转大】
  • 理解数据类型的强制转换 【大转小 (转换的类型)】
  • 了解ASCII编码表【128个字符和数字的对应表 0–48 a–97 A–65 】
  • 理解int类型和char类型的运算原理(char的提升为int类型)
  • 理解运算符++ --的运算方式( 独立 混合)
    • 在变量前【先算后用】
    • 在变量后【先用后算】
  • 理解 + 符号在字符串中的作用(拼接 连接) (String)
  • 理解比较运算符
  • 理解逻辑运算符
  • 掌握三元运算符的格式和计算结果 数据类型 变量名 = 布尔表达式 ? 真值:假值 ; double i= 1>2? 1:2;
  • 了解方法的概念
  • 掌握无返回值无参数方法的定义格式 public static void 方法名 (){ 逻辑代码}
  • 了解方法定义的注意事项 类中方法外 方法不能嵌套

第一章 数据类型转换(TypeCast)

变量定义赋值的时候, 值得在取值范围之内. 如果超出了接收类型的范围, 需要强转

1.1 自动转换 (隐式转换)

1)自动转换概念

代码执行过程中取值范围小的类型自动转换为取值范围大的类型

不同分类的数据类型,不能够论字节大小.

阅读如下代码,说出每个打印语句的打印的值。

System.out.println(1);//默认是一个整型int
System.out.println(1.0);//打印的是double类型

int i1=1; // 左边变量的类型和右边数值的类型是没有问题的。
double d1=1.0;// 左边变量的类型和右边数值的类型是没有问题的。
//把一个int类型的数据赋值给double类型,会有问题么?

double d2= 1;
System.out.println(d2);

进行编译 和 运行 没有问题 ,第8行输出的数据并非 1而是1.0

运行的过程中,int类型的数据自动转化为double类型的数据了。也就是类型的自动转化(隐式转换)

2)转换规则

范围小的类型向范围大的类型转换,但是注意**byte、short、char 运算过程中直接转换为int** 。

byteshortchar  <  int  <  long  <  float  <  double

练习:代码实践证明**byte、short、char 运算时直接提升为int** 。

byte b1=1;
byte b2=1;
byte b3=b1+b2; //会报错么?会的话要怎么写?
System.out.println(b3);

short s1=1;
short s2=1;
short s3=s1+s2;//会报错么?会的话要怎么写?
System.out.println(s3);

char c1=1;
char c2=1;
char c3=c1+c2;//会报错么?会的话要怎么写?
System.out.println(c3);

1.2 强制转换

我们在上面已经知道了,当int类型的数据赋值给double类型的数据是完全没有问题的。但是现在我们反着干,我们要把double类型的数据赋值给int类型的变量,会发生什么事情呢?做个试验瞧瞧

int i1=2.0;
System.out.printl(i1);

报错!!编译失败了!!

int i1=2.0;  // 错误: 不兼容的类型: 从double转换到int可能会有损失

道理很好理解,int数据类型的取值范围小 其类型 容纳不下double类型数据;

一定要这么干!!!!怎么办呢?!!只有通过强制类型转换,将double类型强制转换成int类型才能赋值。

int i1=(int)2.2;
System.out.printl(i1);

完美输出了数据,但是后面的小数是没有了!!

1)强制转化的概念

概念理解:取值范围大的类型强制转换成取值范围小的类型

转换格式:

int i1 = (int) 1.0;
数据类型 变量名 = (数据类型)被转数据值;

与自动转换的区别,自动转换时是Java自动执行的不需要我们参与,而强制转换需要我们自己手动执行

2)转换原理图解

我们再做一个实验说明下转换的原理。

我们知道byte占有一个字节,取值范围是 [-128,127],我定义一个byte类型的变量,赋值一个在它范围之外的一个数,比如257。来看精彩效果!!

因为超出了byte范围之外,所以要强转。那么计算结果是什么呢?

byte b1=(byte)257;
System.out.println(b1);

通过编译运行,我们可以得到的一个结果是 1,那么怎么来的呢?看下图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K8M4Hjh1-1575363436853)(img/1526549972053.png)]

3)强转有风险,操作需谨慎!!!

  • 精度损失:浮点转成整数,直接取消小数点,可能造成数据损失精度。
  • 数据溢出int 强制转成byte 砍掉3个字节,可能造成数据丢失。
int i=(int)3.9;// i=3	小数点去掉了,精度损失
byte b=(byte)257;// b=1 只拿到一个字节的数据,其余三个字节丢失(数据溢出)

1.3 ASCII编码表

在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。

编码表 就是将人类的字符和一个十进制数进行对应起来组成一张表格。表中每个文字都对应了一个数值,如下:

字符数值
048
957
A65
Z90
a97
z122

将所有的英文字母,数字,符号都和数字进行了对应**,因此产生了世界上第一张编码表**ASCII
(American Standard Code for Information Interchange 美国标准信息交换码)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zYVYKoT5-1575363436854)(assets/ASCII编码表.png)]

UTF-8

char c = ‘a’;

在编码中每个字符都对应了一个数值。如果要进行数值运算,字符是可以代表其对应的数值的。比如

char 2个字节 的范围 [0,65535] 216 =65536

char c= ‘0’

对于一个字符: 人认识的字符, 计算机认识的数字

‘a’ - 97

char转int:char类型转换为int类型进行计算。

int i1='A'; //类型的自动提升
System.out.println(i1);//打印出结果数值:65
System.out.println('A'+1);//打印出结果:66

int转char:int的数值也可以强转为char类型的数据,输出字符。

int i2=97char c1=(char)i2;  //[0,65535]
System.out.println(c1);//打印出结果为字符 a

思考:

  1. 如何实现大小写字母的转换 ?

    每个大小写字符的差值是固定

    如果小写转换为大写----> 小写字符 - 32

    如果是大写转换为小写 --> 大写字符 + 32

第二章 运算符(Operator)

运算符其实就是操作变量或者是常量的符号

2.1 算数运算符

算数运算符包括:
+加法运算,字符串连接运算
-减法运算
*乘法运算
/除法运算
%取模运算,两个数字相除取余数
++--自增自减运算

本身这些加减乘除模跟我们小学时学的运算符功能是一致,但是我们要注意他们运算时候的一些特点如下:

2.1.1 运算符两侧的类型一致

运算符两侧的类型一致时,运算的结果也是和运算的数据类型一样的但(byte,short,char类型例外,他们会自动转换为int)

int i1=100;
int i2=200;
int i3=i1+i2;//i1和i2都是int类型。结果可以赋值给int类型的i3
int i4=i1*i2;

在数据类型自动转换的时候讲过**byte,short,char在运算的时候是直接自动提升为int类型的。**再巩固下:

byte b1=10;
byte b2=20;
//byte b3=b1+b2;//错误: 不兼容的类型: 从int转换到byte可能会有损失
int b3=b1+b2;  //需要用int类型的变量接收,因为运算结果提升为int了。
System.out.println(b3);

同样,当short,char在混合运算的过程中,也是自动提升为int类型的。课后请实践下,加深印象。

2.1.2 运算两侧的类型不一致

当算术运算两侧的类型不一致的时候,结果和大类型保持一致

double d1=100;
int i1=10;
// int i2=d1+i1;//错误: 不兼容的类型: 从double转换到int可能会有损失
double i2=d1+i1;

2.1.3 ++,-- 运算符

++ 运算,变量自增长1。-- 运算,变量自减少1。用法一致,效果相反。

1)独立运算
变量在独立运算时,前++和后++没有区别 ,**都是实现自动加1的功能**。

变量前++   :例如 ++i 

变量后++   :例如 i++ 
int i=1;

i++;//可以放在变量的后边		自动加1

System.out.println(i);// 输出结果为:2
++i;//也可以放在变量的前面	自动加1

System.out.println(i);// 输出结果为:3
2) 混合运算

和其他变量放在一起,先++后++就产生了不同。

  • 先++\--先运算后取值
int i1 = 1;
int i2 = ++i1;
System.out.println(i1);//计算结果是2
System.out.println(i2);//计算结果是2

变量a自己加1,将加1后的结果赋值给b,也就是说a+1 计算得到2,然后复制给b,
因此,a和b的结果都是2。

  • 后++\--先取值后运算
int a = 1;
int b = a++;
System.out.println(a);//计算结果是2
System.out.println(b);//计算结果是1

变量a先把自己的值1赋值给变量b,此时变量b的值就是1。然后变量a再去自己再加1
因此,a的结果是2b的结果是1

2.1.4 + 字符串中的拼接操作

+ 符号在遇到字符串的时候,表示==连接、拼接==的含义。

“a”+"b"的结果是“ab”,连接含义

System.out.println("5+5="+5+5);//输出5+5=55

注意:当道和加法运算结合在一起的时候,要注意用() 提升运算优先级

	int i6 =5;
	int i7= 6;
	System.out.println(i6+"x"+i7+"="+i6*i7);
	//当道和加法运算结合在一起的时候,要注意用() 提升运算优先级
	System.out.println(i6+"+"+i7+"="+(i6+i7));

2.2 赋值运算符

运算符说明
=等于号
+=加等于
-=减等于
*=乘等于
/=除等于
%=取模等

1)赋值运算符=

=右边的值,赋给左边的变量。其实我们昨天在学习定义变量的时候就接触了。如:

int i1 = 5;		//将整数常量5赋值给i1。
int i2 =i1;		//将i1变量的值赋值给i2变量。
int i3 =i1+i2; 	//将i1+i2的运算结果赋值给变量i3 

10 = 100

2)+= ,-=,*=,/=,%=

算术运算符和赋值运算符的结合使用。当运算的时候,有时我们会遇到如下运算需求:

int i1=10;
i1=i1+100;//变量自身参与运算,结果赋值返回给自身

i1+=100;
System.out.println(i1);

int i2 =10;
i2=i2*10;
i2*= 10;


int i3=10;
i3=i3%3;--> i3%=3;


可以使用运算符和赋值符号相结合:

int i1=10;
i1+=100;// i1=i1+100; 变量自身参与运算,结果赋值返回给自身
System.out.println(i1);

3)+= ,-=,*=,/=,%=:自动类型强转功能

在运算过程中,如果涉及到值强转,会自动操作不需要我们干涩。

byte b1=1;
//b1= b1+ 256;//编译报错
b1+=256; 
System.out.println(b1);//值为1,而不是257. int 强转为 byte ,溢出

int i1=10;
i1*=1.234;	
System.out.println(i1);//值为12,而不是12.34 double 强转为 int ,精度损失

2.3 比较运算符

比较运算符说明
==比较符号两边数据是否相等,相等结果是true。
<比较符号左边的数据是否小于右边的数据,如果小于结果是true。
>比较符号左边的数据是否大于右边的数据,如果大于结果是true。
<=比较符号左边的数据是否小于或者等于右边的数据,如果小于结果是true。
>=比较符号左边的数据是否大于或者等于右边的数据,如果大于结果是true。
!=不等于符号 ,如果符号两边的数据不相等,结果是true。

比较运算符,是两个数据之间进行比较的运算,运算结果都是布尔值true或者false

public static void main(String[] args) {
    System.out.println(1==1);//true
    System.out.println(1<2);//true
    System.out.println(3>4);//false
    System.out.println(3<=4);//true
    System.out.println(3>=4);//false
    System.out.println(3!=4);//true
}

2.4 逻辑运算符

逻辑运算符其实就是**与(并且),或(或者),非(不是)**,用来连接两个布尔类型结果的运算符。其运算结果都是布尔值(truefalse

1>2 并且 1<2 false 并且 true -->false

逻辑运算符称呼使用说明
&&双与
短路与
1. 两边都是true,结果是true
2. 一边是false,结果是false
**短路特点:**一假即假。符号左边是false,右边不再运算,效率比单与高。
||短路或
双或
1. 两边都是false,结果是false
2. 一边是true,结果是true
**短路特点:**一真即真,符号左边是true,右边不再运算,效率比单或高
取反1. ! true 结果是false
2. ! false结果是true

**1)**逻辑运算符的普通使用

    //逻辑与(并且) 一假即假
    System.out.println(true && true);//true
    System.out.println(true && false);//false
    System.out.println(false && true);//false,右边不计算
      //逻辑或(或者)一真即真
    System.out.println(false || false);//falase
    System.out.println(false || true);//true
    System.out.println(true || false);//true,右边不计算
        //逻辑非(不是)
    System.out.println(!false);//true

2) &&短路测试 一假即假

int i1=1;
int i2=1;
//		    短路    false && true 
System.out.println(++i1<1 && i2++>1);//false 
System.out.println(i1);	//2
System.out.println(i2);	//1

3)|| 短路测试 一真即真

//	||(短路或) 一真即真
int i1=1;
int i2=1;
//			短路     true || true 
System.out.println(++i1>1 || ++i2>1);
System.out.println(i1);//2
System.out.println(i2);//1

2.5 三元运算符

三元运算符: 操作三个数据进行运算.

++: 一元运算符

当一个**布尔表达式(条件运算)**的结果( true 或者 false) 需要对应两种不同的结果时, 我们可以使用三元运算符.

表达式可: 由变量常量操作符组成的式子构成。

比如: 成绩>= 60 分 ? true 及格 : false 不及格

在java中 布尔表达式 ? 真值结果 : 假值结果

什么是表达式: 我们使用运算符去连接若干个变量或者是常量时 1>2 -->false a

格式如下:

1)三元运算符格式:

 数据类型 变量名 = 布尔类型表达式 ? 真值 : 假值;
 
 
 int score=80;// 如果大于等于60 及格	否则 不及格
 
  String status = score>=60 ? "及格" : "不及格" ; // 不及格

System.out.println(status); // score=80 及格	score=59 不及格

2)三元运算符执行顺序:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-if15uY0D-1575363436855)(img/三元运算符运算顺序.png)]

  1. 布尔类型表达式结果是true,三元运算符整体结果为真值,赋值给变量。
  2. 布尔类型表达式结果是false,三元运算符整体结果为假值,赋值给变量。
public static void main(String[] args) {
    int a=1;
    int b=2;
    
    //a>b么?是 c=true,不是 c=false
    boolean c= a>b ? true : false;
  
    int i = (1==2 ? 100 : 200);
    System.out.println(i);//200
    int j = (3<=4 ? 500 : 600);
    System.out.println(j);//500
}

注意: 后面真值和假值的数据类型要和 变量接收的类型要==匹配== (一致或者是满足自动类型转换)

第三章 方法入门 (Method)

3.1 概述

我们在学习运算符的时候,都为每个运算符单独的创建一个新的类和main方法,我们会发现这样编写代码非常的繁琐,而且重复的代码过多。能否避免这些重复的代码呢,就需要使用方法来实现。

那么什么是方法呢?

Java方法是语句的集合,它们在一起执行一个功能。

  1. 方法是解决一类问题步骤的有序组合
  2. 方法包含于类或对象中( 面向对象)
  3. 方法在程序中被创建,在其他地方被引用

方法的优点

  1. 使程序变得更简短而清晰。
  2. 有利于程序维护。
  3. 可以提高程序开发的效率。
  4. 提高了代码的重用性。

3.2 方法的定义

  • 定义格式:
方法的声明()
修饰符  返回值类型 方法名 (参数列表)

方法体
{
    	代码...	
    	代码...	
   		代码...	
   		return ;//方法的结束  返回对应的值public static void main (String[] args)

{

		逻辑代码
		代码
}

//参照main方法,方法名改下,参数列表删掉

  • 定义格式解释:
    • 修饰符: 目前固定写法 public static
    • 返回值类型: 目前固定写法 void ,其他返回值类型在后面的课程讲解。
    • 方法名:(小驼峰)为我们定义的方法起名,满足标识符的规范,用来调用方法。
    • 参数列表: 目前无参数, 带有参数的方法在后面的课程讲解。
    • return:方法结束。因为返回值类型是void,方法大括号内的return可以不写。
  • 举例:
public static void methodName() {
  	System.out.println("这是一个方法");
}

3.3 方法的调用

方法在定义完毕后,方法不会自己运行,必须被调用才能执行,我们可以在主方法main中来调用我们自己定义好的方法。在主方法中,直接写要调用的方法名字就可以调用了。

public static void main(String[] args) {
    //调用定义的方法method
    method();
}
//定义方法,被main方法调用
public static void method() {
  	System.out.println("自己定义的方法,需要被main调用运行");
}

3.4 调用练习

将三元运算符代码抽取到自定义的方法中,并调用。

public static void main(String[] args) {
    //调用定义的方法operator
    operator();
}
//定义方法,方法中定义三元运算符
public static void operator() {
    int i = 0;
    i = (1==2 ? 100:200);
    System.out.println(i);
    int j = 0 ;
    j = (3<=4 ? 500:600); 
    System.out.println(j);
}

3.5 注意事项

  • 方法定义时方法的位置注意事项:

    • 必须定义在类中方法外
    • 不能定义在另一个方法的里面即方法不能嵌套
public class Demo {
    public static void main(String[] args){
       
    }
    //正确写法,类中,main方法外面可以定义方法
    public static void method(){}
}
public class Demo {
    public static void main(String[] args){
        //错误写法,一个方法不能定义在另一方法内部
        public static void method(){}
    }
}

第四章 JShell脚本工具

JShell脚本工具是JDK9的新特性

什么时候会用到JShell工具呢,当我们编写的代码非常少的时候,而又不愿意编写类,main方法,也不愿意去编译和运行,这个时候可以使用JShell工具。

启动JShell工具,在DOS命令行直接输入JShell命令。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lCkv4ZY3-1575363436856)(img/jshell开启.jpg)]

接下来可以编写Java代码,无需写类和方法,直接写方法中的代码即可,同时无需编译和运行,直接回车即可

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBIZUgz9-1575363436856)(img/jshell使用.jpg)]

小贴士:

JShell工具,只适合片段代码的测试,开发更多内容,建议编写在方法中。

第五章 扩展知识点

5.1 常量和变量的运算

下面的程序有问题吗?

public static void main(String[] args){
  byte b1=1;
  byte b2=2;
  byte b3=1 + 2;
  byte b4=b1 + b2;
  System.out.println(b3);
  System.out.println(b4);
}

分析:b3 = 1 + 212 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了1+2 的结果并没有超过byte类型的取值范围,可以赋值给变量b3 ,因此b3=1 + 2是正确的。

反之,b4 = b2 + b3b2b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。

在jshell中体现:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bDo7SfmH-1575363436857)(img/扩展.jpg)]

常量直接运算把结果赋值变量时:

 编译的是时候,可以直接获取结果,确定是否超过变量类型的范围
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值