细节一: 有多种类型的数据混合运算时, 系统首先自动将所有数据转换成容量最大的那种数据类型, 然后再进行计算
int n1 = 10;
float n2 = n1 + 3.5; // 错误 double -> float
double n3 = n1 + 3.5;
double n4 = n1 + 3.6d;
float n5 = n1 + 3.3f;
细节二:当我们把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时, 就会报错, 反之就会进行自动类型转换
int n6 = 1.5; // 错误 double -> int
细节三:(byte, short) 和 char 之间不会相互自动转换
当把具体数赋给byte时,先判断该数是否在byte范围内,如果是就可以
byte b1 = 10; // 对 , -128-127
int n2 = 1; // n2 是 int
byte b2 = n2; // 错误,原因: 如果是变量赋值,判断类型
char c1 = b1; // 错误, 原因: byte不能自动转成char
细节四:byte,short,char 他们三者可以计算,在计算时首先转换为 int 类型
byte b2 = 1;
byte b3 = 2;
short s1 = 1;
short s2 = b2 + s1; //错, b2 + s1 => int
int s2 = b2 + s1; //对, b2 + s1 => int
byte b4 = b2 + b3; //错误: b2 + b3 => int
细节五:boolean 不参与转换
boolean pass = true;
int num100 = pass; // boolean 不参与类型的自动转换
细节六:自动提升原则, 表达式结果的类型自动提升为 操作数中最大的类型
char a1 = 10;
short a2 = 15;
int a3 = 20;
double a4 = 25;
System.out.println(a1 + a2 + a3 + a4); // double 70.0
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型,使用时要加上强制转换符 ( ),但可能造成精度降低或溢出,要格外注意
int i = (int) 1.1;
System.out.println(i); // 1
int j = 10;
byte b = (byte) j;
System.out.println(b); // 10
细节一:当进行数据的大小,从大到小,就需要使用到强制转换
int k = 100;
char k1 = (char) k;
System.out.println(k1);
细节二:强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级
int x = (int) 10 * 3.5 + 6 * 1.5; // 编译错误: double -> int
int x = (int) (10 * 3.5 + 6 * 1.5); // (int) 44.0 -> 44
System.out.println(x); // 44
细节三:char类型可以保存int的常量值,但不能保存int的变量值,需要强转
char c1 = 100;
int m = c1;
// char c2 = m; // 错误
char c3 = (char) m;
System.out.println(c3); // 100对应的字符是d
细节四:byte,short,char类型再进行运算时,当作int类型处理
同1.1.1细节四
在程序开发中,我们经常需要将基本数据类型转换成String类型,或者将String类型转换成基本数据类型。
语法:将基本类型的值 + “”即可。
int n1 = 100;
float f1 = 1.1F;
double d1 = 4.5;
boolean b1 = true;
String s1 = n1 + "";
String s2 = f1 + "";
String s3 = d1 + "";
String s4 = b1 + "";
System.out.println(s1 + " " + s2 + " " + s3 + " " + s4);
语法:通过基本类型的包装类调用parseXXX方法即可。
String s5 = "123";
int num1 = Integer.parseInt(s5);
double num2 = Double.parseDouble(s5);
float num3 = Float.parseFloat(s5);
long num4 = Long.parseLong(s5);
byte num5 = Byte.parseByte(s5);
boolean b = Boolean.parseBoolean("true");
short num6 = Short.parseShort(s5); System.out.println("==================="); System.out.println(num1); //123
System.out.println(num2); //123.0
System.out.println(num3); //123.0
System.out.println(num4); //123
System.out.println(num5); //123
System.out.println(num6); //123
System.out.println(b); //true
得到字符串的第一个字符
s5.charAt(0) // 得到s5字符串的第一个字符1
System.out.println(s5.charAt(0));
1、在将 String 类型转成 基本数据类型时,比如我们可以把 “123” ,转成一 个整数,但是不能把 “hello” 转成一个整数。
2、如果格式不正确,就会抛出异常,程序就会终止。
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
//++的使用
int i = 10;
i++; //自增 等价于 i = i + 1; => i = 11
++i; //自增 等价于 i = i + 1; => i = 12
System.out.println("i=" + i); //12
作为表达式使用:
前++: ++i 先自增后赋值
后++: i++先赋值后自增
int j = 8;
int k = ++j; // 等价 j=j+1;k=j;
int k = j++; // 等价 k =j;j=j+1;
System.out.println("k=" + k + "j=" + j); // 8 9
System.out.println(10 / 4); //从数学来看是2.5, java中是2
System.out.println(10.0 / 4); //java中是2.5
// 在 % 的本质:a % b = a - a / b * b
-10 % 3 => -10 - (-10) / 3 * 3 = -10 + 9 = -1
10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1
-10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1
System.out.println(10 % 3); //1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); //1
System.out.println(-10 % -3); //-1
1、关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false
2、关系表达式 经常用在 if 结构的条件中或循环结构的条件中
1、关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false。
2、关系运算符组成的表达式,我们称为关系表达式。 a > b
3、比较运算符"==“不能误写成”="。
用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean 值。
1、a&b : & 叫逻辑与:规则:当 a 和 b 同时为 true ,则结果为 true, 否则为 false
2、 a&&b : && 叫短路与:规则:当 a 和 b 同时为 true ,则结果为 true,否则为 false
3、 a|b : | 叫逻辑或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
4、a||b : || 叫短路或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
5、!a : 叫取反,或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 true
6、a^b : 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
名称 | 语法 | 特点 |
---|---|---|
短路与&& | 条件 1&&条件 2 | 两个条件都为 true,结果为 true,否则 false |
逻辑与& | 条件 1&条件 2 | 两个条件都为 true,结果为 true,否则 false |
1、&&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高
2、& 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低
3、开发中, 我们使用的基本是使用短路与&&, 效率高
名称 | 语法 | 特点 |
---|---|---|
短路或 | 条件 1||条件 2 | 两个条件中只要有一个成立,结果为 true,否则为 false |
逻辑或 | 条件 1|条件 2 | 只要有一个条件成立,结果为 true,否则为 false |
1、||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
2、| 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
3、开发中,我们基本使用 ||
名称 | 语法 | 特点 |
---|---|---|
! 非(取反) | !条件 | 如果条件本身成立,结果为 false,否则为 true |
a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
赋值运算符就是将某个运算后的值,赋给指定的变量。
基本赋值运算符 int a = 10;
复合赋值运算符 += ,-= ,*= , /= ,%= 等
如: a += b; [等价 a = a + b; ] a -= b; [等价 a = a - b; ]
1、运算顺序从右往左 int num = a + b + c;
2、赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值 int num = 20; int num2= 78 * 34 - 10; int num3 = a;
3、复合赋值运算符等价于下面的效果 比如:a+=3;等价于 a=a+3; 其他类推
4、复合赋值运算符会进行类型转换。 byte b = 2; b+=3; b++;
条件表达式 ? 表达式 1: 表达式 2;
- 如果条件表达式为 true,运算后的结果是表达式 1;
- 如果条件表达式为 false,运算后的结果是表达式 2;
1、表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)
int a = 3;
int b = 8;
int c = a > b ? (int)1.1 : (int)3.4; // 可以
double d = a > b ? a : b + 3; // 可以,满足 int -> double
2、三元运算符可以转成 if--else 语句
1、运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序,上一行运算符总优先于下一行。
2、只有单目运算符、赋值运算符是从右向左运算的
1、包名:多单词组成时所有字母都小写:aaa.bbb.ccc
2、类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz [大驼峰] 比如: TankShotGame
3、变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小 驼峰, 简称 驼峰法] 比如: tankShotGame
4、常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ 比如 :定义一个所得税率 TAX_RATE
定义:被 Java 语言赋予了特殊含义,用做专门用途的字符串
特点:关键字中所有字母都为小写
Java 保留字:现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留 字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const。
在编程中需要接收用户输入的数据,就可以使用键盘输入语句来获取。Input.java , 需要一个 扫描器(对象), 就是 Scanner
1、导入该类的所在包, java.util.*
2、创建该类对象(声明变量)
3、调用里面的功能
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("username:");
String username = scanner.next(); // 接收用户输入String
System.out.print("age:");
int age = scanner.nextInt(); // 接收用户输入int
System.out.print("salary:");
double salary = scanner.nextDouble(); // 接收用户输入double
System.out.println("username=" + username + " age=" + age + " salary=" + salary);
}
}
输出:
username:allen
age:18
salary:19000.50
username=allen age=18 salary=19000.5