【廖雪峰Java入门】学习汇总


网址:Java教程-廖雪峰的官方网站


一、快速入门


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 四大名著了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值