2、Day02_java语言基础课程2
1、数据类型转换
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一数将发生类型的转换。
①自动类型转换
当数据类型不一样时,将会发生数据类型转换。
隐式转换:
public class Demo01DataType {
public static void main(String[] args) {
System.out.println(1024);//这就是一个整数,默认就是int类型
System.out.println(3.14);//这就是一个浮点数,默认就是double类型
//左边是long类型,右边是默认的int类型,左右不一样.
//一个等号代表赋值,将右侧的int常量,交给左侧的long变量进行存储
//int-->long,符合了数据范围从小到大的要求
//这一行代码发生了自动类型转换。
long num1 = 100;
System.out.println(num1);//100
//左边是double类型,右边是float类型,左右不一样
//float-->double,符合从小到大的规则
//也发生了自动类型转换
double num2 = 2.5F;
System.out.println(num2);//2.5
//左边是float类型,右边是1ong类型,左右不一样
//long-->float,范围是float更大一些,符合从小到大的规则
//也发生了自动类型转换
float num3 = 30L;
System.out.println(num3);//30.0
}
}
②强制类型转换
public class Demo2Conversion {
/*
强制转换:把一个表示数据范围大的数值或者变量赋值给另一个表示数据范围小的变量.
简单理解:大的给小的,不能直接给,需要强转
格式:目标数据类型 变量名=(目标数据类型)值或者变量;
*/
public static void main(String[] args) {
int a = 10; //int 4个字节
//byte b=a; //byte 1个字节 错误:不兼容的类型:从int转换到byte可能会有损失精度
byte b = (byte) a;
System.out.println(b);
double num1 = 12.9;
int num2 =(int)num1;
System.out.println(num2);//12 精度损失
}
}
错误例子:
public class Demo02DataType{
public static void main(String[]args){
//左边是int类型,右边是long类型,不一样
//long-->int,不是从小到大
//不能发生自动类型转换!
int num=100L;
System.out.println(num);
}
}
正确例子:
public class Demo02DataType {
public static void main(String[] args) {
//格式:范围小的类型 范围小的变量名=(范围小的类型)原本范围大的数据
int num = (int) 100L;
System.out.println(num)
}
}
③数据类型转换_注意事项
public class Demo3Conversion {
//请找出下列代码的错误,指出原因并解决.
public static void main(String[] args) {
byte a = 3;
byte b = 4;
/*
前置知识点铺垫:
隐式转换:当小的数据类型和大的数据类型在一起运算的时候,小的会先提升为大的之后,再进行运算
特殊关注:byte short char 在运算的时候,都会直接提升为int,然后再进行运算。
错误原因:
byte c=a+b;
这里的a和b是两个byte类型,它们在运算之前会将自己提升为int类型,然后再进行运算
两个int相加,结果还是int,想要把一个int类型的结果,赚值给byte类型的变量
大的给小的,不能直接给.
非要给的话,就需要强制类型转换.
解决方案:
首先让a和b进行相加,使用()提升算数优先级
再对相加的结果整体进行强转.
*/
//byte c=a+b; //错误:不兼容的类型:从int转换到byte可能会有损失
byte c =(byte)(a + b);
System.out.println(c);
}
}
public class Demo4Conversion {
/*
请找出下列代码的错误,指出原因并解决。
担心的问题:
3和4是两个常量,整数常量默认的数据类型是int
这里两个int相加,结果还是int,int给byte赋值.
emmm...应该需要强转吧
Java存在常量优化机制:
byte d=3+4;这里的3和4是两个常量,Java存在常量优化机制,会在编译的时候就会让3和4进行相加,然后会自动判断7是否在byte的取值范围内
不在范围内:编译出错
在范围内:通过编译
*/
public static void main(String[] args) {
byte d = 3 + 4;
System.out.println(d);
long num = 123456789123456789L;
}
}
public class Demo02DataType {
public static void main(String[] args) {
//long强制转换成为int类型
int num2 = (int) 6000000000L;
System.out.println(num2);
//显示结果为1705032704,发生数据溢出。
//double-->int,强制类型转换
int num3 = (int) 3.5;
System.out.println(num3);
//显示为3,发生精度损失。这并不是四舍五入,所有的小数位都会被舍弃掉
char zifu1 = 'A';//这是一个字符型变量,里面是大写字母A
System.out.println(zifu1 + 1);
//66,也就是大写字母A被当做65进行处理
//计算机的底层会用一个数字(二进制)来代表字符A
//一旦char类型进行了数学运算,那么字符就会按照一定的规则翻译成为一个数字
byte num4 = 40;//注意!右侧的数值大小不能超过左侧的类型范围
byte num5 = 50;
//byte result1=num4+num5;
//输出错误,因为首先会将byte提升成为int再相加的,而左边却是byte
int result1 = num4 + num5;
// byte+byte-->int+int-->int
//要把左边写成int类型才是正确的
System.out.println(result1);//90
short num6 = 60;
//byte+short-->int+int-->int
//int强制转换为short:注意必须保证逻辑上真实大小本来就没有超过short范围,否则会发生数据溢出
short result2 = (short) (num4 + num6);
System.out.println(result2);//100
}
}
2、ASCII编码表
数字和字符的对照关系表(编码表):
ASCII码表:American Standard Code for Information Interchange,美国信息交换标准代码。
Unicode码表:万国码。也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含有更多字符。
只要记住这三个就好:
48-‘0’
65-‘A’
97-‘a’
public class Demo03DataTypeChar {
public static void main(String[] args) {
char zifu1 = '1';
System.out.println(zifu1 + 0);//49
char zifu2 = 'A';//其实底层保存的是65数字
char zifu3 = 'c';
//左侧是int类型,右边是char类型,
//char-->int,确实是从小到大
//发生了自动类型转换
int num = zifu3;
System.out.println(num);//99
char zifu4 = '中';//正确写法
System.out.println(zifu4 + 0);//20013
}
}
3、算术运算符_四则与取模运算
对于一个整数的表达式来说,除法用的是整除,整数除以整数,结果仍然是整数。只看商,不看余数。
注:只有对于整数的除法来说,取模运算符才有余数的意义。
注意事项:
1.一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
public class Demo1operator {
/*运算符:
对[常量]或[变量]进行操作的符号
算数运算符
+ - * :跟小学数学的运算方式一样
/:整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算
%(取模):取余数
*/
public static void main(String[] args) {
System.out.println(10 + 20);
System.out.println(10 - 20);
System.out.println(10 * 20);
System.out.println("---------------------");
/*
/:整数相除,结果只能得到整数,如果想要得到带有小数的结果,必须加入小数(浮点类型)的运算
*/
System.out.println(10 / 2);//5
System.out.println(10 / 3);//3
System.out.println(10 / 3.0);//3.3333333333333335
System.out.println(10.0 / 3);//3.3333333333333335
System.out.println("---------------------");
/*
%(取模):取余数
*/
System.out.println(5 % 2);//5/2=商2,余数为1
}
}
public class Demo04operator {
public static void main(String[] args) {
//两个常量之间可以进行数学运算
System.out.println(20 + 30);
//两个变量之间也可以进行数学运算
int a = 20;
int b = 30;
System.out.println(a - b);//-10
//变量和常量之间可以混合使用
System.out.println(a * 10);//200
int x = 10;
int y = 3;
int result1 = x / y;
System.out.println(result1);//3
int result2 = x % y;
System.out.println(result2);//余数,模,1
//int+double-->double+double-->double
double result3 = x + 2.5;
System.out.println(result3);//12.5
}
}
4、算术运算符_加号的多种用法
public class Demo2Operator {
/*
字符串的+操作
当+操作中出现字符串时,这个+是[字符串连接符],而不是算术运算。
*/
public static void main(String[] args) {
//字符串可以使用+号,跟[任意数据类型]拼接
System.out.println("itheima" + 666);
System.out.println("itheima" + true);
//从左往右运算和连接
System.out.println(1 + 99 + "年黑马"); //100年黑马
System.out.println("5+5=" + 5 + 5); //5+5=55
System.out.println("5+5=" + (5 + 5)); //5+5=10
}
}
四则运算当中的加号“+”有常见的三种用法:
1.对于数值来说,那就是加法。
2.对于字符char类型来说,在计算之前,char会被提升成为int,然后再计算。
char类型字符,和int类型数字,之间的对照关系表:ASCII、Unicode
3.对于字符串String(首字母大写,并不是关键字)来说,加号代表字符串连接操作。
任何数据类型和字符串进行连接的时候,结果都会变成字符串
public class Demo05Plus {
public static void main(String[] args) {
//字符串类型的变量基本使用
//数据类型 变量名称=数据值;
String strl = "Hello";
System.out.println(str1);//Hello
System.out.println("Hello" + "World");//HelloWorld
String str2 = "Java";
//String+int-->
System.out.println(str2 + 20);//Java20
//优先级问题
//String+int+int
//String +int
//String
System.out.println(str2 + 20 + 30);//Java2030
System.out.print1n(str2 + (20 + 30));//Java50
}
}
import java.util.Scanner;
public class Test {
/*
需求:键盘录入一个三位数,将其拆分为个位、十位、百位后,打印在控制台
运行结果:
请输入一个三位数:
123
整数123个位为:3
整数123十位为:2
整数123百位为:1
分析:
1:使用scanner键盘录入一个三位数
2:个位的计算:数值 %10
3:十位的计算:数值 /10%10
4:百位的计算:数值 /100
5:将个位,十位,百位拼接上正确的字符串,打印即可
*/
public static void main(String[] args) {
//1:使用scanner键盘录入一个三位数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个三位数");
int num = sc.nextInt();
//2:个位的计算:数值 %10
int ge = num % 10; //123 % 10=3
//3:十位的计算:数值 /10%10
int shi = num / 10 % 10; //123 / 10=12 12 % 10=2
//4:百位的计算:数值/100
int bai = num / 100;//123/100=1
//5:将个位,十位,百位拼接上正确的字符串,打印即可
System.out.println("整数" + num + "个位为:" + ge);
System.out.println("整数" + num + "十位为:" + shi);
System.out.println("整数" + num + "百位为:" + bai);
}
}
5、算术运算符_自增自减运算符
public class Demo3operator {
/*
自增自减运算符:
++:变量自身+1
--:变量自身-1
++和--既可以放在变量的后边,也可以放在变量的前边。
注意:
单独使用的时候,++和--无论是放在变量的前边还是后边,结果是一样的
*/
public static void main(String[] args) {
int a = 10;
a++; // a = a+1
System.out.println(a); //11
int b = 10;
b--;
System.out.println(b); //9
}
}
public class Demo4operator {
/*
参与操作:
++在前:先对该变量做自增(++)或者自减(--),然后再拿变量参与操作。
++在后:先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减
(--)。
*/
public static void main(String[] args) {
//++在前:先对该变量做自增(++)或者自减(-一),然后再拿变量参与操作。(先自增再操作)
int a = 10;
int b = ++a;
System.out.println(a); //11
System.out.println(b); //11
//++在后:先将该变量原本的值,取出来参与操作,随后再进行自增(++),自减(-一)。(先操作再自增)
int aa = 10; //bb=10 先把10给bb,然后aa再自增,所以bb=10
int bb = aa++;//aa=11 把10给bb,然后aa再自增1,所以aa=11
System.out.println(aa); //11
System.out.println(bb); //10
int num = 123;
System.out.println(num++); //123 先把123拿出来操作,如果再打印num,num再自增
System.out.println(num); //124
System.out.println(10++);
//10++;10=10+1;错误代码,常量不可以改变数值,不可以用自增自减
}
}
public class Demoe60perator {
public static void main(String[] args) {
int num1 = 10;
System.out.println(num1);//10
++num1;//单独使用,前++
System.out.println(numl);//11
num1++;//单独使用,后++
System.out.println(num1);//12
System.out.println("================");
//与打印操作混合的时候
int num2 = 20;
//混合使用,先++,变量立刻马上变成21,然后打印结果21
System.out.println(++num2);//21
System.out.println(num2);//21
System.out.println("===============");
int num3 = 30;
//混合使用,后++,首先使用变量本来的30,然后再让变量+1得到31
System.out.println(num3++);//30
System.out.println(num3);//31
int num4 = 40;
//和赋值操作混合
int result1 = --num4;
//混合使用,前--,变量立刻马上-1变成39,然后将结果39交给result1变量
System.out.println(result1);//39
System.out.println(num4);//39
System.out.println("=================");
int num5 = 50;
//混合使用,后--,首先把本来的数字50交给result2,然后我自己再-1变成49
int result2 = num5--;
System.out.println(result2);//50
System.out.println(num5);//49
System.out.println("=================");
int x = 10;
int y = 20;
//11+20=31
int result3 = ++x + y--;
System.out.println(result3);//31
System.out.println(x);//11
System.out.println(y);//19
//30++;//错误写法!常量不可以使用++或者--!
}
}
6、赋值运算符
注意事项:
1.只有变量才能使用赋值运算符,常量不能进行赋值。
2.复合赋值运算符其中隐含了一个强制类型转换。
public class Demo2Operator {
//阅读下列代码,查看是否存在问题,如果有请指出并修正
public static void main(String[] args) {
short s = 1;
//s是short类型,1默认是int类型
//short和int相加,short会先提升为int,然后再进行运算
//提升之后,就是两int相加,两个int相加,结果还是int,将int赋值给short
//需要加入强转。
//s=s+1;//错误:不兼容的类型:从int转换到short可能会有损失
s = (short) (s + 1);
System.out.println(s);
short ss = 1;
ss += 1; //ss=(short)(ss +1);
//注意:扩展赋值运算符底层会自带强转功能
System.out.println(ss);
}
}
public class Demo070perator {
public static void main(String[] args) {
int a = 10;
//按照公式进行翻译:a=a+5
//a = 10+5;
//a = 15;
//a本来是10,现在重新赋值得到15
a += 5;
System.out.println(a);//15
int x = 10;
//x = x%3;
//x = 10%3;
//x = 1;
//x本来是10,现在重新赋值得到1
x %= 3;
System.out.println(x);//1
byte num = 30;//num=num+5;
//num= byte+int
//num=int+int
//num=int
//num=(byte)
int num+=5;
System.out.println(num);//35
}
}
7、比较运算符
注意事项:
1.比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false
2.如果进行多次判断,不能连着写。
数学当中的写法,例如:1<x<3
程序当中【不允许】这种写法。
public class Demo1Operator {
/*
关系运算符(比较运算符):
(>)(>=)(<)(<=)(=)(l=)
*/
public static void main(String[] args) {
System.out.println(10 > 20); //false
System.out.println(10 >= 20); //false
System.out.println(10 < 20); //true
System.out.println(10 <= 20); //true
System.out.println(10 == 20); //false
System.out.println(10 != 20); //true
}
}
public class Demo08Operator {
public static void main(String[] args) {
System.out.println(10 > 5);//true
int numl = 10;
int num2 = 12;
System.out.println(numl < num2);//true
System.out.println(num2 >= 100);//false
System.out.println(num2 <= 100);//true
System.out.println(num2 <= 12);//true
System.out.println("===============");
System.out.println(10 == 10);//true
System.out.println(20 != 25);//true
System.out.print1n(20 != 20);//false
int x = 2;
//system.out.print1n(1<x<3);//错误写法!编译报错!不能连着写。
}
}
8、逻辑运算符
注意事项:
1.逐辑运算符只能用于boolean值。
2.与、或需要左右各自有一个boolean值,但是取反只要有唯一的一个boolean值即可。
3.与、或两种运算符,如果有多个条件,可以连续写。
两个条件:条件A && 条件B
多个条件:条件A && 条件B && 条件c
TIPS:对于1<x<3的情况,应该拆成两个部分,然后使用与运算符连接起来:
intx=2;
1<x && x<3
public class Demoloperator {
/*
逻辑运算符作用:用于[整合]多个比较表达式的条件
1.连接多个比较表达式
2.连接true或false
最终得到的结果都是boolean类型的true或false.
应用场景:
需求:键盘录入学生成绩,面果是90-100之间,程序输出[优秀]
判断条件(score>=90 & score<=100)
需求:键盘录入工人工号,只要3号或者5号或者7号.
判断条件(id==3 | id==5 | id==7)
*/
public static void main(String[] args) {
int x = 10;
//true&true
//x>5并且x<15
System.out.println(x > 5 & x < 15); //true
}
}
public class Demo2Operator {
/*
逻辑运算符分类:
&(与):并且,遇false则false,只有符号左右两边同时为true,结果才为true.
|(或):或者,遇true则true,只有符号左右两边同时为false,结果才为false.
!(非):取反
^(异或):相同为false,不同为true.
*/
public static void main(String[] args) {
//&(与):并且
system.out.println(true & true); //true
System.out.println(false & false); //false
System.out.println(true & false); //false
System.out.println(false & true); //false
system.out.println("-------------------");
//|(或):或者
Syatem.out.println(true | true); //true
System.out.println(false | false); //false
System.out.println(true | false); //true
System.out.println(false | true); //true
system.out.println("-------------------");
//!(非):取反
System.out.println(!true); //false
System.out.println(!!true); //true !!相当于取反两次,先取反为false,再取反为true
system.out.println("-------------------");
//^(异或):
System.out.println(true ^ true); //false
System.out.println(false ^ false); //false
System.out.println(true ^ false); //true
System.out.println(false ^ true); //true
}
}
public class Demo3Operator {
/*
&和&&的区别:
&: 无论符号左边是true还是false,右边都要继续执行
&&:具有短路效果,符号左边为false的时候,右边就不执行了.
如果符号左边为true,右边要继续执行。
*/
public static void main(String[] args) {
int x = 3;
int y = 4;
// false & true
// 4=4 & 4<5
System.out.println(++x > 4 & y-- < 5);//false 左边已经是false,所以整个逻辑判断就是false
System.out.println("x=" + x);//4
System.out.println("y=" + y);//3
//对比:
int x = 3;
int y = 4;
// false & true
// 4=4 & 4<5
System.out.println(++x > 4 && y-- < 5);//false,左边为false,右边y--<5就没有执行
System.out.println("x=" + x);//4
System.out.println("y=" + y);//4
}
}
public class Demo09Logic {
public static void main(String[] args) {
System.out.println(true && false);//false
//true && true-->true
System.out.println(3 < 4 && 10 > 5);//true
System.out.println("============");
System.out.println(true || false);//true
System.out.println(true || true);//true
System.out.println(false || false);//false
System.out.println("============");
System.out.println(true);//true
System.out.println(!true);//false
int a = 10;
//false && ...
System.out.println(3 > 4 && ++a < 100);//false,左边为false,右边++a<100就没有执行
System.out.println(a);//10
System.out.println("============");
int b = 20;
//true ||...
System.out.println(3 < 4 || ++b < 100);//true 左边为true,右边++b<100就没有执行
System.out.println(b);//20
}
}
9、三元运算符
一元运算符:只需要一个数据就可以进行操作的运算符。例如:取反!、自增++、自减–
二元运算符:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=
三元运算符:需要三个数据才可以进行操作的运算符。
格式:
数据类型 变量名称 = 条件判断 ?表达式A:表达式B;
流程:
首先判断条件是否成立:
如果成立为true,那么将表达式A的值赋值给左侧的变量;
如果不成立为false,那么将表达式B的值赋值给左侧的变量;
二者选其一。
注意事项:
1.必须同时保证表达式A和表达式B部符合左侧数据类型的要求。
2.三元运算符的结果必须被使用。
public class Demo1Operator {
/*
三元运算符:
格式:关系表达式?表达式1:表达式2;
执行流程:
首先计算关系表达式的值
如果值为true,取表达式1的值
如果值为false,取表达式2的值
需求:求两个变量的最大值
*/
public static void main(String[] args) {
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max);//20
}
}
public class Test {
/*
1.定义三个变量用于保存和尚的身高
2.用三元运算符,比较前两个变量,获取较大值。
3.用三元运算符,让较大值和第三个变量比较,获取最大值。
4.输出结果
*/
public static void main(String[] args) {
//1.定义三个变量用于保存和尚的身高
int a = 150;
int b = 210;
int c = 165;
//2.用三元运算符,比较前两个变量,获取较大值。
int tempMax = a > b ? a : b;
//3.用三元运算符,让较大值和第三个变量比较,获取最大值。
int max = tempMax > c ? tempMax : c;
//4.输出结果
System.out.println(max);
}
}
public class Demo10Operator {
public static void main(String[] args) {
int a = 10;
int b = 20;
//数据类型 变量名称 = 条件判断 ?表达式A:表达式B;
//判断a>b是否成立,如果成立将a的值赋值给max;如巢不成立将b的值赋值给max。二者选其一
int max = a > b?a:
b;//最大值的变量
System.out.println("最大值:" + max);//最大值:20
//int result = 3>4?2.5:10;//错误写法!2.5是double类型
System.out.println(a > b?a:b);//正确写法!
//a>b?a:b;//错误写法!正确应该要么给它赋值,要么给它直接打印输出!
}
}
10、方法入门_概念引入
public class Demo11Method {
public static void main(String[] args) {
//农民伯伯
System.out.println("播种");
System.out.println("浇水");
System.out.println("施肥");
System.out.println("除虫");
System.out.println("收割");
System.out.println("卖给小商版");
//小商
System.out.println("运输到农贸市场");
System.out.println("抬高价格");
System.out.println("吆喝");
System.out.println("卖给厨子");
//厨子
System.out.println("洗菜");
System.out.println("切菜");
System.out.println("炒菜");
System.out.println("装盘");
//我
System.out.println("吃");
}
}
11、方法入门_方法的定义
定义一个方法的格式:
public static void 方法名称(){
方法体
}
方法名称的命名规则和变量一样,使用小驼峰。
方法体:也就是大括号当中可以包含任意条语句。
注意事项:
1.方法定义的先后顺序无所谓。
2.方法的定义不能产生嵌套包含关系。
3.方法定义好了之后,不会执行的。如果要想执行,一定要进行方法的【调用】。
public class Demo1lMethod {
public static void main(String[] args) {
}
//农民伯伯
public static void farmer() {
System.out.println("播种");
System.out.println("浇水");
System.out.println("施肥");
System.out.println("除虫");
System.out.println("收割");
System.out.println("卖给小商版");
}
//小商
public static void seller() {
System.out.println("运输到农贸市场");
System.out.println("抬高价格");
System.out.println("吆喝");
System.out.println("卖给厨子");
}
//厨子
public static void cook() {
System.out.println("洗菜");
System.out.println("切菜");
System.out.println("炒菜");
System.out.println("装盘");
}
//我
public static void me() {
System.out.println("吃");
}
}
12、方法入门_方法的调用
如何调用方法,格式:
方法名称();
public class Demo11Method{
public static void main(String[] args) {
farmer();//调用农民的方法
seller();//调用小商贩的方法
cook();//调用厨子的方法
me();//调用我自己的方法
}
//农民伯伯
public static void farmer() {
System.out.println("播种");
System.out.println("浇水");
System.out.println("施肥");
System.out.println("除虫");
System.out.println("收割");
System.out.println("卖给小商版");
}
//小商
public static void seller() {
System.out.println("运输到农贸市场");
System.out.println("抬高价格");
System.out.println("吆喝");
System.out.println("卖给厨子");
}
//厨子
public static void cook() {
System.out.println("洗菜");
System.out.println("切菜");
System.out.println("炒菜");
System.out.println("装盘");
}
//我
public static void me() {
System.out.println("吃");
}
}