JAVA学习之基础学习(一)
数据类型转换
自动转换
-
自动转换:将取值范围小的类型自动提升为取值范围大的类型
int i = 1; byte b = 2;
i 和 b 相加结果为int类型
转换规则
范围小的类型向范围大的类型提升, byte、short、char 运算时直接提升为 int 。
byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double
强制转换
- **强制类型转换:**将
取值范围大的类型
强制转换成取值范围小的类型
转换格式:
数据类型 变量名 = (数据类型)被转数据值;
-
注:
浮点转成整数,直接取消小数点,可能造成数据松狮精度
int强制转成short砍掉2个字节,可能造成数据丢失
运算符
算数运算符
-
变量 前++ :变量a自己加1,将加1后的结果赋值给b,也就是说a先计算。a和b的结果都是2。
-
变量 后++ :变量a先把自己的值1,赋值给变量b,此时变量b的值就是1,变量a自己再加1。a的结果是2,b
的结果是1。
方法入门
方法的定义
修饰符 返回值类型 方法名 (参数列表){ 代码... return ; }
注意事项
- 方法定义注意事项
- 方法必须定义在一类中main方法外
- 方法不能定义在另一个方法里边
JSell脚本
JShell脚本工具是JDK9的新特性
相当于Python的交互式解释器
扩展知识点
+=符号的扩展
分析: s += 1
逻辑上看作是 s = s + 1
计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围
大的类型赋值到取值范围小的类型。但是, s=s+1
进行两次运算 , +=
是一个运算符,只运算一次,并带有强制转换的特点,
也就是说 s += 1
就是 s = (short)(s + 1)
,因此程序没有问题编译通过,运行结果是2.
常量和变量的运算
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 + 2 , 1 和 2 是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没
有超过byte类型的取值范围,可以赋值给变量 b3 ,因此 b3=1 + 2 是正确的。
反之, b4 = b2 + b3 , b2 和 b3 是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什
么,因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
选择语句
-
switch语句格式
switch(表达式) { case 常量值1: 语句体1; break; case 常量值2: 语句体2; break; ... default: 语句体n+1; break; }
case的穿透性
在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运
行,直到遇到break,或者整体switch结束。
IDEA常用快捷键
快捷键 | 功能 |
---|---|
Alt+Enter | 导入包,自动修正代码 |
Ctrl+Y | 删除光标所在行 |
Ctrl+D | 复制光标所在行的内容,插入光标位置下面 |
Ctrl+Alt+L | 格式化代码 |
Ctrl+/ | 单行注释 |
Ctrl+Shift+/ | 选中代码注释,多行注释,再按取消注释 |
Alt+Ins | 自动生成代码,toString,get,set等方法 |
Alt+Shift+上下箭头 | 移动当前代码行 |
数组
-
格式
数组存储的数据类型[] 数组名字 = new 数组存储的数据类型[长度];
数组越界异常
抛出 ArrayIndexOutOfBoundsException
数组越界异常。
数组空指针异常
抛出 NullPointerException
空指针异常。
数组作为方法参数和返回值
- 数组作为方法参数传递,传递的参数是数组内存的地主地址
- 数组作为方法的返回值,返回的是数组内存地址
注:方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.
类与对象、封装、构造方法
对象的使用
创建对象:
类名 对象名 = new 类名();
成员变量和局部变量的区别
- 在类中的位置不同
- 成员变量:类中,方法外
- 局部变量:方法中或者方法声明上(形式参数)
- 作用范围不一样
- 成员变量:类中
- 局部变量:方法中
- 初始化值的不同
- 成员变量:有默认值
- 局部变量:没有默认值。必须先定义,赋值,最后使用
- 在内存中的位置不同
- 成员变量:堆内存
- 局部变量:栈内存
- 生命周期不同
- 成员变量:随着对象的创建而存在,随着对象的消失而消失
- 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
封装
封装的步骤
- 使用 private 关键字来修饰成员变量
- 对需要访问的成员变量,提供对应的一对 getXxx 方法 、 setXxx 方法
private的使用格式
private 数据类型 变量名 ;
封装优化1–this关键字
this的含义
this代表所在类的当前对象的引用(地址值),即对象自己的引用
注:方法被哪个对象调用,方法中的this就代表那个对象。即谁在调用,this就代表谁
this使用格式
this.成员变量名;
封装优化2–构造方法
构造方法的定义格式
修饰符 构造方法名(参数列表) {
//方法体
}
构造方法的写法上,方法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚至不需要void。使用 构造方法后,代码如下:
public class Student {
private String name;
private int age;
//无参构造方法
public Student() {}
// 有参构造方法
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
注:
如果你不提供构造方法,系统会给出无参数构造方法。
如果你提供了构造方法,系统将不再提供无参数构造方法。
构造方法是可以重载的,既可以定义参数,也可以不定义参数。