【廖雪峰Java入门】学习汇总
- 一、快速入门
- 1. 基本概念
- 2. 语言基础
- 3. 流程控制
- 4. 数组操作
- 二、面向对象编程
- 1. 面向对象基础
- 2. Java核心类
- 三、The End
一、快速入门
1. 基本概念
1)Java技术体系至少包括四个部分:
- 1.Java程序设计语言
- 2.各种平台上的Java虚拟机(JVM)
- 3.Java API类库
- 4.一系列辅助工具,如javac
其中,1+2+3+4=JDK;2+3=JRE(Java运行时环境)
JDK>JRE>JVM
2)两个版本JDK
Oracle JDK vs Open JDK
3)Java技术体系所划分的三大平台
JavaSE vs JavaEE(里面的框架,该学的) vs JavaME
4)语言 和 实际应用的鸿沟:框架
2. 语言基础
1)Java入口程序规定的方法必须是静态方法,方法名必须为main,括号内的参数必须是String数组
public class Hello {
public static void main(String[] args) { // 方法名是main
// 方法代码...
} // 方法定义结束
}
2)在定义变量的时候,不写初始值,就相当于给它指定了默认值。默认值总是0
3)变量不但可以重新赋值,还可以赋值给其他变量
4)基本数据类型
整数类型:byte,short,int,long
浮点数类型:float,double
字符类型:char
布尔类型:boolean
5)计算机内存的最小存储单元是字节(byte),一个字节就是一个8位二进制数,即8个bit。它的二进制表示范围从00000000-11111111,换算成十进制是0-255,换算成十六进制是00-ff。
6)不同的数据类型占用的字节数不一样。Java基本数据类型占用的字节数
byte恰好就是一个字节,而long和double需要8个字节
7)整型
对于整型类型,Java只定义了带符号的整型,因此,最高位的bit表示符号位(0表示正数,1表示负数)。各种整型能表示的最大范围如下:
- byte:-128 ~ 127
- short: -32768 ~ 32767
- int: -2147483648 ~ 2147483647
- long: -9223372036854775808 ~ 9223372036854775807
8)long型的结尾需要加L
对于float类型,需要加上f后缀
float类型可最大表示3.4x10 ^38,而double类型可最大表示1.79x10 ^308
9)Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符
10)定义变量的时候,如果加上final修饰符,这个变量就变成了常量
11)对byte和short类型进行移位时,会首先转换为int再进行位移。
仔细观察可发现,左移实际上就是不断地×2,右移实际上就是不断地÷2
12)运算优先级
13)类型自动提升与强制转型
- 在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int。
14)关于浮点数
- 在计算机中,浮点数虽然表示的范围大,但是,浮点数有个非常重要的特点,就是浮点数常常无法精确表示。
- 比较两个浮点数是否相等,通常是比较他们的绝对值之差是否小于一个特定的值
15)布尔运算
- 短路运算,注意
- 三元运算符,注意:b ? x:y ,其中x和y必须同类型
16)字符和字符串
- 字符串连接
可以使用 + 连接任意字符串和其他数据类型
连接字符串和其他数据类型,会将其他数据类型先转化为字符串,再连接 - 多行字符串
从Java13开始,字符串可以用 “”"…"""表示多行字符串 - 不可变性,注意
- 注意要区分空置null和空字符串 “” ,空字符串是一个有效的字符串对象,他不等于null
17)数组类型
- 数组所有元素的初始化为默认值,整型都是0,浮点数是0.0,布尔型是false
- 数组一旦创建后,大小不可改变
- 可以用 .length 获取数组大小
- 数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型
3. 流程控制
1)输入和输出
- 输出
print ——不换行输出
println ——换行输出
printf ——格式化输出 - 占位符
%d %x:十六进制整数 %f %e:科学计数法表示的浮点数 %s:格式化字符串 - Java提供Scanner对象来方便输入,读取对应的类型可以使用:scanner.nextline() / nextInt() / nextDouble() /…
2)判断引用类型相等
- 判断引用类型的变量是否相等,== 表示 是否指向同一个对象,不是表示内容是否相等
- 要判断引用类型的变量内容是否相等,必须使用 equals() 方法
- 注意要避免 NullPointerException 报错
3)switch 多重选择
- 使用switch,要注意有没有写 break 语句 和 default 语句
- 从Java12开始,switch加入 -> 新语法,使用新语法,不但不需要break,还可以直接返回值
- yield
如果需要复杂的语句,我们可以写很多语句,放到 {…} 里,然后yield返回一个值作为switch语句的返回值 - switch 的计算结果必须是 整数、字符串或枚举类型
4. 数组操作
1)使用 Arrays.toString() 函数可以快速获取一维数组内容
2)排序
- 调用Java标准库里的 Arrays.sort() 函数,可以对数组排序
- 对于非引用型数组,实际上修改了数组的本身
- 对于引用指向型数组,只是元素的指向变化了
3)使用 Arrays.deepToString() 函数可以获取二维数组内容
4)命令行参数
- 命令行参数类型是String[] 数组
- 命令行参数有JVM接收用户输入并传给main方法
二、面向对象编程
1. 面向对象基础
1)参数绑定
- 基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响
- 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方
2)构造方法
- 可以定义多个构造方法,new 来调用,通过参数数量、位置、类型来区分
- 一个构造方法可以调用其他构造方法,这样做的目的是便于代码的复用。调用其他的构造方法的语法是 this(…)
3)方法重载
- 方法重载是指多个方法的方法名相同,但各自的参数不同
- 重载方法应该完成类似的功能
- 重载方法返回值类型应该相同
4)继承
- 被继承的:超类、父类、基类;继承得到的:子类、拓展类
- Java只允许一个class继承自一个类。所以一个类有且仅有一个父类
- 子类无法访问父类的 private 字段或 private 方法
- private
为了让子类可以访问父类的字段,我们需要把 private 改成 protected。用 protected 修饰的字段可以被子类访问 - super()
在Java中,任何class的构造方法,第一行语句必须是调用父类的构造方法。如果没有明确地调用父类的构造方法,编译器会自动加一句 super();
如果父类没有默认的构造方法,子类就必须显示调用 super() 并给出参数以便让编译器定位到父类的一个合适的构造方法
子类不会继承任何父类的构造方法 - 向上转型 / 向下转型
向下转型很可能会失败。失败会报错:ClassCastException
可以使用 instanceof 函数,来检查实例是不是某类 - 可以安全的向上转型为更抽象的类型;可以强制向下转型,最好借助 instanceof 判断
5)多态
- 方法名相同,方法参数相同,但方法返回值不同,也是不同的方法
- 加上 @Override 可以让编辑器帮助检查是否进行了正确的覆写。希望进行覆写,但不小心写错了方法签名,编译器会报错
- Java的实例方法调用是基于运行时的”实际类型“的动态调用,而非变量的声明类型
- 在子类的腹泻方法中,如果要调用父类的被覆写的方法,可以用 super 来调用
- final 修饰符作用:
修饰的方法可以阻止被覆写
修饰的class可以阻止被继承
修饰的field 必须在创建对象时初始化,随后不可修改
6)抽象类
- 通过 abstract 定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范
- 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法
- 如果不是先抽象方法,则该子类仍是一个抽象类
7)接口
- 如果一个抽象类没有字段,所有方法全部都是抽象方法,就可以把该抽象类改为接口 : interface 。所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有
- 当一个具体的class去实现一个 interface 时,需要使用 implements 关键词
- 一个类可以实现多个 interface
- 一个 interface可以继承自另一个 interface 。使用extends
- default 方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的时default 方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法
8)静态字段和静态方法
- 最好用类名访问静态字段。可以把静态字段理解为描述 class 本身的字段,非实例字段
- 调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用
- 静态方法属于 class 而不属于实例,因此,静态方法内部,无法访问 this 变量,也无法访问实例字段,它只能访问静态字段
- 接口的静态字段
interface也可以有静态字段,且静态字段必须为final类型
9)包
- 在定义class的时候,我们需要在第一行声明这一个class属于哪个包
- 包作用域
位于同一个包的类,可以访问包作用域的字段和方法。不用 public protected private 修饰的字段和方法就是包作用域 - import
如果有两个class名称相同,例如,mr.jun.Arrays 和 java.util.Arrays,那么只能import其中一个,另一个必须写完整类名 - JDK的核心类使用java.lang包,编译器会自动导入
10)一个.java文件只能包含一个public类,但可以包含多个非public类
2. Java核心类
详见 教程网站内容。
三、The End
有了一些语法基础,开始看 Java 四大名著了