JAVA第二天
1.1java中的数据类型(b)
java中的数据类型: 基本数据类型 和 对象类型 java是一种强语言,严格遵循类型匹配原则。也就是说 我们存储数据的时候 什么样的数据就必须使用什么样的类型去接收。 对象类型: 无数种 基本数据类型:八种 public static void main(String[] args){ /* 整型 4个 */ byte a1 = 20; 字节型 short a2 = 20; 短整型 int a3 = 30; 整型 long a4 = 60L; 长整型 /* 浮点型 2个*/ float b1 = 20.5F; 单精度浮点型 double b2 = 30.6; 双精度浮点型 精确到小数点后面的位数不一样 boolean c1 = true; 布尔类型 boolean c2 = false; char d1 = 'a'; 字符型 char d2 = '你'; char d3 = 100; System.out.println(d3); } 问题: 我们存储整数 就有四种?我什么时候用哪一种呢? java语言设计的时候 就希望我们能在功能实现的基础之上尽量的节省内存。 所以java就设计了多种数据类型 ,每一种所占据的内存空间和存储的范围是不一样的 所以java就希望我们存储数据的时候 不同的场景使用不同的数据类型,例如 我们要存储人的年龄 我们可以使用 byte 存储银行卡的余额 double类型 所以我们需要记住 各种类型的所占内存和取值范围
问题: 一个字节 两个字节是啥概念? 1G = 1024MB 1MB=1024KB 1KB=1024B 1B就是一字节 1B=8b 面试题: java中的char类型 能否存储一个汉字? 其他语言中char类型占一个字节,一个汉字占两个字节,但是java中的char类型占俩字节 问题: 一个汉字占2字节,一个字母或者数字占1个字节,char类型能存储2个字节 --- char能否存储两个数字或字母? Too many characters in character literal char d1 = 'aa'; java中的对象类型: 其中一种是 String 字符串类型
1.2 自动类型转换和强制类型转换(b)
java是遵循类型匹配原则 不一样的类型不能胡乱赋值 int a = "123"; 但是 public static void main(String[] args){ byte a = 20; int b = a; } 此时我们将byte类型的数据赋值给int类型 发现不报错。这是为什么? 此时发生了 自动类型转换: 所占字节数小的 赋值给 所占字节数大的 可以完成赋值。 此时有一张图 记录了 自动类型转换的方向
此时如果违背这个图 就会报错 public static void main(String[] args){ int a = 20; byte b = a; } 此时我就想将 a的值赋值给 b 此时就需要 强制类型转换。 public static void main(String[] args){ int a = 20; byte b = (byte) a; } 在变量的前面添加一个 () 里面写数据类型 写什么类型代表转换成什么类型 注意:int a = (int)"123"; 不能转换 此时强制类型转换 就是欺骗个编译器 依然会出现数据溢出的情况 public static void main(String[] args){ int a = 130; /* -128----127*/ byte b = (byte) a; System.out.println(b);// -126 }
1.3 运算结果(b)
一目运算符: ++ -- 二目运算符: + - * / % += -= == != > < >= <= 三目运算符: (条件表达式)? (真):(非真) a++和++a有什么区别? public static void main(String[] args){ int a = 10; int b = a++; int c = ++a; System.out.println(a); // 12 因为无论 a++ 还是 ++a 都是对a的值进行自增1 System.out.println(b); // 10 先计算a++ 11 然后将a++之前的值赋值给b System.out.println(c); // 12 先计算++a 12 然后将++a之后的值赋值给c } + 在java中也有两种运算形式: A 数学相加 B 字符串拼接 并且java中的内容 进行运算的时候 结果会 自动提升 public static void main(String[] args){ int a = 10; int b = 20; float c = a/b; //0.0 System.out.println(c); } 此时我们需要分布去看代码: 首先计算 a/b 得到的结果是 0.5 ,java中结果也需要数据类型 此时结果的数据类型取决于参与运算的变量并且会选择大的(自动提升)所以结果是int类型 所以就变成了0 然后将0 赋值给 float类型的 c 输出 0.0 public static void main(String[] args){ int a = 10; float b = 20; float c = a/b; //0.0 System.out.println(c); }
1.4 隐式转换(b)
我们发现一个问题:写这个代码会报错 public static void main(String[] args){ byte a = 128; float b = 20.5; } Incompatible types. Required:byte Found:int Incompatible types. Required:float Found:double 问题是 found int? 所以就证明一件事情 10 20 30 50 100 200 数字也是有数据类型的 并且是 int 类型 20.5 30.6 40.8 小数数字也是有数据类型的 并且是 double 类型 此时我们发现 赋值 127的时候 明明是 int给 byte 不能给的但是不报错 因为发生了 隐式类型转换。编译器会发现127在byte范围之内 所以底层会偷偷地帮我们转换 public static void main(String[] args){ byte a = 20; } 所以 float类型的要赋值需要添加F long类型的要加L public static void main(String[] args){ float a = 20.5F; long b = 99999999999999L; } 请问以下代码会有什么问题? short a = 20; // 20是int类型 但是在short范围之内 所以隐式转换 a = a+5; // 先计算 a+5; 得到结果25 自动提升为int类型 所以将int类型的25 赋值给 short类型的 a 报错 short b = 30; b += 6; // b+=6 在底层编译成字节码文件的时候 是 b = (short)( b+6 ); 请问以下代码会有问题吗? public static void main(String[] args){ short b = 30; byte a = 60; short c = a+b; } 此时这个代码报错 Incompatible types. Required:short Found:int 提高了性能但是浪费了内存。所以这是JDK后来才有的操作,因为大家的电脑内存都变大了 没必要纠结那一个两个字节了
1.5 流程控制
if if-else for while switch
1.6 局部变量作用域(b)
public class Haha { /** 成员变量 字段 属性 全局变量 */ int b = 30; public static void main(String[] args) { /*定义到函数内部的变量*/ int a = 20; } } 局部变量的作用域 指的是 定义的局部变量在哪可以使用: 从定义开始 到所在的结束大括号 public static void main(String[] args) { for (int i=0;i<666;i++){ } for (int i=0;i<666;i++){ } } 同一作用域内 不能重复定义变量名 public static void main(String[] args) { int a = 20; //Variable 'a' is already defined in the scope int a = 30; }
1.7 输出路径
src 用来写源文件 out 用来存放编译后的字节码文件