
一、基础语法
1、注释
- 单行注释
- // 注释信息
- 多行注释
- /注释信息/
- 文档注释
- /注释信息/
2、关键字
- 关键字的字母全部小写
3、常量
- 字符串常量
- 双引号括起来的内容,如 “helloworld”
- 整数常量
- 不带小数的数字,如 22,33
- 小数常量
- 带小数的数字,如 22.3
- 字符常量
- 用单引号括起来的内容,如 ‘A’,’我’
- 布尔常量
- true,false
- 空常量
- 一个特殊的值,null
4、数据类型
- 基本数据类型
- 数值型
- 整数(byte,short,int,long)
- 浮点型(float,double)
- 字符(char)
- 非数值型
- 布尔(boolean)
- 数值型
- 引用数据类型
5、变量
- 默认为int和double类型
- 当要定义long类型的变量时,后面要加一个L,如 l = 100000000L
- 当定义float类型的变量时,后面加一个F,如 f = 13.14F
6、标识符
- 规则
- 由数字、字母、下划线、美元符组成
- 不能以数字开头
- 不能是关键字
- 区分大小写
- 命名法
- 小驼峰命名法
- 方法和变量
- 大驼峰命名法
- 类class
- 小驼峰命名法
7、类型转换
- 自动类型转换
- 强制类型转换
二、运算符
1、算术运算符
- 加、减、乘、除、取余
- 算术表达式中包含多个基本数据类型时,整个算术表达式的类型会自动提升
- byte、short、char类型会将被提升到int类型
- 等级顺序 byte,short,char->int->long->float->double
- 字符串拼接
2、赋值运算符
- =
- +=
3、自增自减运算符
- i++ i– 先用再加
- ++i –i 先加再用
4、关系运算符
- == !=
- < >
- <= >=
5、逻辑运算符
- & | ^ !
- && ||
6、三元运算符
- a>b?a:b
三、数据输入
1、Scanner
- 导包
1 | import java.util.Scanner; |
- 创建对象
1 | Scanner sc = new Scanner(System.in); |
- 接收数据
1 | int i = sc.nextInt(); |
- 关闭
1 | sc.close(); |
四、分支语句
1、流程控制
- 顺序结构
- 分支结构
- 循环结构
2、if语句
- if语句
1 | if(关系表达式) { |
- if/else语句
1 | if(关系表达式) { |
- if/连else语句
1 | if(关系表达式) { |
3、switch语句
1 | switch(表达式) { |
1 | switch(表达式) { |
五、循环语句
1、for循环语句
1 | for (int i=1; 条件判断语句; ) { |
2、while循环语句
1 | while(条件判断语句) { |
3、do/while循环语句
1 | do { |
4、三种循环语句
- 三种循环的区别
- for和while循环先判断条件是否成立,然后决定是否执行
- do…while循环先执行,在判断条件是否成立
- for和while的区别
- 条件控制语句所控制的自增变量,归属于for循环的语法结构中,在for循环结束后,就不能再被访问了
- 对于while循环来说不归属其语句结构中,while结构结束后,还可以访问
- 死循环
- for( ; ; ) {}
- while(ture) {}
- do {} while(ture);
5、跳转控制语句
- continue 跳过某次循环体内容的执行
- break 终止循环体内容的执行
6、循环嵌套
7、Random
1 | import java.util.Random; |
六、IDEA
1、IDEA的使用
- project-module-package
2、快捷语句
- psvm 快速生成main()方法
- sout 快速生成输出语句
- Ctrl+Alt+space 内容提示、代码补全
- Ctrl+Alt+L 格式化
3、模块
七、数组
1、数组定义格式
一种用于存储多个相同类型数据的存储模型
- 数据类型[] 变量名
- int[] arr
- 定义了一个int类型的数组,数组名是arr(推荐用这个)
- 数据类型 变量名[]
- int arr[]
- 定义了一个int类型的变量,变量名是arr数组
2、数组初始化
- 动态初始化
- 数据类型[] 变量名 = new 数据类型[数据长度]
- int[] arr = new int[3]
- int:说明数组中元素类型是int类型,[]:说明这是一个数组,arr:数组名称
- new:为数组申请内存空间,int:说明数组中的元素类型是int类型,[]:说明这是一个数组,3:数组长度
- 静态初始化
- 数据类型[] 变量名 = new 数据类型[] {数据1,数据2,…};
- int[] arr = new int[]{1,2,3};
- 数据类型[] 变量名 = {数据1,数据2,数据3,…};
- int[] arr = {1,2,3};
- 数据类型[] 变量名 = new 数据类型[] {数据1,数据2,…};
3、数组元素访问
- 数组名[索引]
- 索引从0开始
- 索引是连续的
- 索引逐一增加,每次加1
4、内存分配
- 栈内存
- 堆内存
5、常见问题
- 索引越界
- ArrayIndexOutOfBoundsException
- 空指针异常
- NullPointerException
6、数组常见操作
- 遍历
1 | int[] arr = {11,22,33}; |
- 获取最值
八、方法
1、方法概述
将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码块
- 方法定义
- 方法调用
2、方法的定义和调用
- 定义
1 | public static void 方法名() { |
- 调用
1 | 方法名(); |
3、带参数方法的定义和调用
定义
- public static void 方法名() {……}
- public static void 方法名(数据类型 变量名, 数据类型 变量名) {……}
调用
- 方法名(参数);
- 方法名(变量名1/常量名1, 变量名2/常量名2);
形参和实参
- 形参:方法定义中的参数
- 实参:方法调用中的参数
4、带返回值方法的定义和调用
- 定义
1 | public static 数据类型 方法名() { |
- 调用
- 数据类型 变量名 = 方法名(参数);
5、方法的注意事项
- 方法不能嵌套
- void表示无返回值
6、方法重载
在同一个类中定义的多个方法之间的关系
7.形参实参
- l
- 引用类型
九、面向对象基础
1、类和对象
对一类具有共同属性和行为的事物的抽象
- 类是对象的数据类型
- 类是具有相同属性和行为的一组对象的集合
1 | public class 类名{ |
2、成员变量和局部变量
区别 | 成员变量 | 局部变量 |
---|---|---|
类中位置不同 | 类中方法外 | 方法内或方法声明上 |
内存中位置不同 | 堆内存 | 栈内存 |
生命周期不同 | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用完毕而消失 |
初始化值不同 | 有默认的初始化值 | 没有默认的初始化值,必须先定义赋值才能使用 |
3、封装
4、构造方法
1 | //完成对象数据的初始化 |
- 构造方法的构建
- 如果没有定义构造方法,系统将给出一个默认的构造方法
- 如果定义了构造方法,系统将不再提供默认的构造方法
- 构造方法的重载
- 如果自定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参数构造方法
- 推荐
无论如何使用,都建议书写无参数构造方法
十、字符串
1、API
Application Programming Interface
2、String
- java程序中的双引号字符串,都是String类的对象
- 字符串不可变,他们的值在创建后不能被更改
- 虽然String的值是不可变的,但是他们可以被共享
- 字符串效果上相当于字符数组(char[]),但是底层原理是字节数组(byte[])
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc” | 直接赋值的方式创建字符串对象,内容就是abc |
方法名 | 说明 |
---|---|
public boolean equals(Object anObject) | 比较字符串的内容 |
public char charAt(int index) | 返回指定索引处的char值 |
public int length() | 返回此字符串的长度 |
3、StringBuilding
可变的字符串类
方法名 | 说明 |
---|---|
public StringBuilder() | 创建一个空白可变字符串对象,不含有任何内容 |
public StringBuilder(String str) | 根据字符串的内容,来创建可变字符串对象 |
方法名 | 说明 |
---|---|
public StringBuilder append(任意类型) | 添加数据,并返回对象本身 |
public StringBuilder reverse() | 返回相反的字符序列 |
4、String和StringBuilder互相转换
- StringBuilder转换为String
- public String toString()
- String转换为StringBuilder(String s)
- public StringBuilder(String s):StringBuilder构造函数
十一、集合基础
1、集合概述
提供一种存储空间可变的存储模型,存储的数据容量可以发生改变
- ArrayList< E >:
- 可调整大小的数组实现
- < E >:是一种特殊的数据类型,泛型
- 如:ArrayList< String >,ArrayList< Student >
方法名 | 说明 |
---|---|
public ArrayList() | 创建一个空的集合对象 |
public boolean add(E e) | 将指定的元素追加到此集合的末尾 |
public void add(int index,E element) | 在此集合中的指定位置插入指定元素 |
- ArrayList常用方法
方法名 | 说明 |
---|---|
public boolean remove(Object o) | 删除指定的元素,返回删除是否成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被删除的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
十二、继承
1、继承概述
1 | public class 子类名 extends 父类名 {} |
2、好处及弊端
- 好处
- 提高了代码的复用性
- 提高了代码的维护性
- 弊端
- 子类和父类耦合性提高,独立性降低
3、super
- this代表本类对象的引用
- super代表父类存储空间的标识
关键字 | 访问成员变量 | 访问构造方法 | 访问成员方法 |
---|---|---|---|
this | this.成员变量 | this(…) | this.成员方法() |
super | super.成员变量 | super(…) | super.成员方法() |
4、继承中构造方法的访问特点
- 子类中所有的构造方法默认都会访问父类中无参的构造方法
- 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
- 每一个子类构造方法的第一条语句默认都是:super()
- 如果父类中没有无参构造方法,只有带参构造方法,该如何办?
- 通过使用super关键字去显示的调用父类的带参构造方法
- 在父类中自己提供一个无参构造方法
5、继承中成员方法的访问特点
- 通过子类对象访问一个方法
- 首先在子类成员范围找
- 然后在父类成员范围找
- 如果都没有就报错
6、方法重写
- 子类中出现和父类中一模一样的方法声明
- 方法重写的应用
- 当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容。
@Override
- 是一个注解
- 可以帮助检查重写方法声明的正确性
7、方法重写的注意事项
- 私有方法不能被重写(父类私有成员子类是不能继承的)
- 子类方法访问权限不能更低(public>默认>私有)
8、java中继承的注意事项
- Java中类只支持单继承,不支持多继承
- java中类支持多层继承
十三、修饰符
1、包
就是文件夹,对类进行分类管理
- 自动建包
- 编译 javac -d . HelloWorld.java
- 运行 java 包名.HelloWorld
2、导包
- 可以直接使用,写清类的全路径 包名.函数()
- 如 java.util.Scanner
- 导包
- import java.util.Scanner
3、修饰符
1、权限修饰符
修饰符 | 同一类中 | 同一包中的子类或无关类 | 不同包的子类 | 不同包的无关类 |
---|---|---|---|---|
private | T | |||
默认 | T | T | ||
protected | T | T | T | |
public | T | T | T | T |
2、状态修饰符
- final
可以修饰成员方法,成员变量,类
- 修饰方法:表明该方法是最终方法,不能被重写
- 修饰变量:表明该变量是常量,不能再次被赋值
- 修饰类:表明该类是最终类,不能被继承
修饰局部变量
- 变量是基本类型:final修饰指的是基本类型的数据值不能发生变化
- 变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址里面的内容可以发生变化
- static
修饰成员方法,成员变量
- 被类的所有对象共享
- 可用通过类名调用(推荐)
- 非静态成员方法访问特点
- 可以访问所有,静态或非静态成员变量,静态或非静态成员方法
- 静态成员方法
- 只可以访问静态成员方法或变量
十四、多态
1、多态概述
同一个对象,在不同时刻表现出来的不同形态
- 多态的前提和体现
- 有继承/实现关系
- 有方法重写
- 有父类引用指向子类对象
- 多态中成员访问特点
- 成员变量:编译看左边,执行看左边
- 成员方法:编译看左边,执行看右边
- 为什么成员变量和成员方法的访问不一样呢
- 因为成员方法有重写,而成员变量没有
- 多态转型
- 向上转型
- 从子到父
- 父类引用指向子类对象
- 向下转型
- 从父到子
- 父类引用转为子类对象
- 向上转型
2、抽象类
在java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
- 抽象类和抽象方法必须使用abstract关键字修饰
1 | public abstract class Animal { |
- 抽象类中不一定有抽象方法,但抽象方法的类一定是抽象类
- 抽象类不能实例化
- 抽象类如何实例化呢?参照多态的方式,通过子类对象实例化,这叫抽象类多态
- 抽象类的子类
- 要么重写抽象类中的所有抽象方法
- 要么是抽象类
- 抽象类的访问特点
- 成员变量
- 可以是变量,也可以是常量
- 构造方法
- 有构造方法,但是不能实例化
- 构造方法的作用:用于子类访问父类数据的初始化
- 成员方法
- 可以有抽象方法,限定子类必须完成某些方法(即必须重写)
- 可以有非抽象方法,提高代码复用性
- 成员变量
3、接口
接口就是一种公共的规范标准,java中的接口更多的体现在对行为的抽象
- 接口特点
- 接口用关键字interface修饰
- public interface 接口名{}
- 类实现接口用implement表示
- public class 类名 implements 接口名 {}
- 接口不能实例化
- 接口如何实例化?参照多态形式,通过实现类对象实例化
- 多态的形式:具体类多肽,抽象类多态,接口多态
- 多态的前提:有继承或实现关系;有方法重写;有父(类/接口)引用指向(子/实现)类对象
- 接口的实现类
- 要么重写接口中的所有抽象方法
- 要么是抽象类
- 接口用关键字interface修饰
- 接口的成员特点
- 成员变量
- 只能是常量
- 默认修饰符:public static final
- 构造方法
- 接口没有构造方法,因为接口主要对行为进行抽象的,没有具体存在
- 一个类如果没有父类,默认继承自Object类
- 成员方法
- 只能是抽象方法
- 默认修饰符:public abstract
- 成员变量
- 类和接口的关系
- 类和类的关系
- 继承关系,只能单继承,但是可以多层继承
- 类和接口的关系
- 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
- 接口和接口的关系
- 继承关系,可以单继承,也可以多继承
- 类和类的关系
- 抽象类和接口的区别
- 成员区别
- 抽象类:变量,常量;有构造方法;有抽象方法,也有非抽象方法
- 接口:常量;抽象方法
- 设计理念区别
- 抽象类:对象抽象,包括属性、行为
- 接口:对行为抽象,主要是行为
- 成员区别
十五、形参和返回值
1、形参和返回值
1、类名作为形参和返回值
- 方法的形参是类名,其实需要的是该类的对象
- 方法的返回值是类名,其实返回的是该类的对象
2、抽象类名作为形参和返回值
- 方法的形参是抽象类名,其实需要的是该抽象类的子类对象
- 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象
3、接口名作为形参和返回值
- 方法的形参是接口名,其实需要的是该接口的实现类对象
- 方法的返回值是接口名,其实返回的是该接口的实现类对象
2、内部类
内部类:就是在一个类中定义一个类
- 内部类可以直接访问外部类的成员,包括私有
- 外部类要访问内部类的成员,必须创建对象
1、成员内部类
- 格式 外部类名.内部类名 对象名 = 外部类对象.内部类对象;
- 如 Outer.Inner oi = new Outer().new Inner();
2、局部内部类
- 局部内部类是在方法中定义的类,所以外界是无法直接使用,需要在方法内部创建对象并使用
- 该类可以直接访问外部类的成员,也可以访问方法内的局部变量
3、匿名内部类-局部内部类一种
1 | new 类名或者接口名() { |
本质:是一个继承了该类或者实现了该接口的子类匿名对象
3、常用API
1、MATH
2、System
- exit():非零表示异常终止
- currentTimeMillis():返回当前时间与1970年1月1日之间的时间(ms)
3、Object
Object是类层次结构的根
- tostring()返回对象的字符串表示形式,建议重写,自动生成
- equals()比较对象是否相等,默认是比较地址,重写可以比较内容,自动生成
4、Arrays
- 冒泡排序
对要进行排序的数据中相邻的数据进行两两比较,将较大的数据放在后面,依次对所有的数据进行操作,直至所有数据按要求完成排序。
- toString()返回指定数组的内容的字符串表示形式
- sort()按照数字顺序排列指定的数组
5、基本类型包装类
将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据常用的操作之一:用于基本数据类型与字符串之间得转换
- Interger
- valueof
- int和string相互转换
- int->string
- 1、String s1 = “” + number;
- 2、String s2 = String.valueOf(number);
- string->int
- 1、Integer i = Integer.valueOf(s); int x = i.intValue();
- 2、int y = Integer.parseInt(s);
- int->string
- 自动装箱和拆箱
- 装箱:把基本数据类型转换为对应的包装类类型
- 拆箱:把包装类类型转换成对应的基本数据类型
- 在使用包装类型时,如果要操作,最好先判断是否为NULL
6、日期类
1、基本
- Date();
- getTime(); 获取的是日期对象从1970.1.1到现在的毫秒值
- setTime();
2、SimpleDateFormat
- 日期格式化和解析
- y-年 M-月 d-日 H-时 m-分 s-秒
- 格式化(从Date到String)
- format(Date date):从日期格式化成日期/时间字符串
- 解析(从String到Date)
- parse(String source):从给定字符串的开始解析文本以生成日期
3、Calendar
- get() 返回给定日历字段的值,int year = c.get(Calendar.YEAR)
- add()
- set() 设置当前日历的年月日
4、异常
- try{} catch() {}
- throws 异常类名
- throw
1、Throwable
- getMessage() 返回此throwable的详细消息字符串
- toString() 返回此可抛出的简短描述
- printStackTrace() 把异常的错误信息输出在控制台
十六、集合进阶
- 集合
- Collection 单列
- List 元素可重复
- ArrayList
- LinkedList
- Set 元素不可重复
- HashSet
- TreeSet
- List 元素可重复
- Map 双列
- HashMap
- Collection 单列
1、Collection
1、常用方法
- add() 添加元素
- remove() 从集合中移除指定元素
- clear() 清空集合中的元素
- contains() 判断集合中是否存在指定的元素
- isEmpty() 判断集合是否为空
- size() 集合的长度,即集合中元素个数
2、遍历
Iterator:迭代器,集合专用遍历方式
- Iterator
iterator:返回此集合中元素的迭代器 - E next():返回迭代中的下一个元素
- bolean hasNext():如果迭代具有更多元素,则返回true
1 | Iterator<String> it = c.iterator(); |
2、List
有序集合(序列)
1、方法
add()
remove()
set()
get()
并发修改异常
- 原因:迭代过程中,通过集合对象修改了集合中元素的长度,造成了迭代器获取元素中判断预期修改值和实际修改值不一致
- 解决方案:用for循环遍历,然后用集合对象做相应操作即可
2、迭代器ListIterator
- E next();
- boolean hasNext();
- E previous();
- boolean hasPrevious();
- void add(E e);
3、增强for循环
1 | int[] arr = {}; |
3、数据结构
- 栈 先进后出
- 队列 先进先出
- 数组 查询快,增删慢
- 链表 增删快,查询必须从头(head)开始(对比数组)
4、list集合子类
- ArrayList:底层数据结构是数组,查询快,增删慢
- LinkedList:底层数据结构是链表,查询慢,增删快
5、set集合
1、Hash值
哈希值:是jdk根据对象的地址或者字符串或者数字算出来的int类型的数值
- 默认情况下,同一对象的哈希值是相同的,不同对象的哈希值是不同的
- 通过方法重写,可以实现不同对象的哈希值是相同的
6、HashSet
- 哈希表
7、LinedHashSet
- 哈希表和链表实现的set接口,具有可预测的迭代顺序
- 由链表保证元素有序,元素存储和取出的顺序是一致的
- 由哈希表保证元素唯一,没有重复的元素
8、TreeSet
- 元素有序
- TreeSet():根据其元素的自然排序进行排序,如从小到大,从a到z
- TreeSet(Comparator comparator):根据指定额比较器进行排序
- 没有带索引的方法,不能使用普通for循环遍历
- 不包含重复元素
比较器排序Comparator的使用
- 用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
- 比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1, T o2)方法
- 重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
9、泛型
1、泛型类
1 | public void show(T t) {} |
2、泛型方法
1 | public <T> void show(T t) {} |
3、泛型接口
1 | public interface Generic<T> {} |
4、类型通配符
- 类型通配符:<?>
- List<?>:可以匹配任意类型
- 类型通配符上限:<? extends 类型>
- List<? extends Number>:表示的类型是Number或者其子类型
- 类型通配符下限:<? super 类型>
- List<? super Number>:表示的类型是Number或者其父类型
10、Map/HashMap
1、方法
- put():添加元素
- remove():根据键删除键对应元素
- clear():移除所有的键值对元素
- containsKey():判断集合是否包含指定的键
- containsValue():判断集合是否包含指定的值
- isEmpty():判断集合是否为空
- size():集合的长度
2、遍历
- 法一
1 | Set<String> keySet = map.keySet(); |
- 法二
1 | Set<Map.Entry<String, String>> entrySet = map.entrySet(); |
11、Collections
1、方法
- public static <T extends Comparable<? super T>> void sort(List
list):将指定的列表按升序排序 - public static void reverse(List<?> list):反转指定列表中元素的顺序
- public static void shuffle(list<?> list):指定默认的随机源随机排列指定的列表
十七、文件、IO流数据处理
1、File类
File:是文件和目录路径名的抽象表示
文件和目录是可以通过File封装成对象的
File(String pathname):通过给定的路径名字符串转换成抽象路径名来创建新的File实例
File(String parent, String child):从父路径名字符串和子路径名字符串创建新的File实例
File(File parent, String child):从父抽象路径名和子路径名字符串创建新的File实例
createNewFile():当具有该文件名称的文件不存在时,创建一个由该抽象路径名的新空文件夹
mkdir():创建由此抽象路径名命名的目录
mkdirs():创建由此抽象路径名命名的目录,包括任何必须但不存在的父目录
递归
2、字节流
多线程
方法
- 启动多线程 myThread.start()
- setName():设置线程名称
- getName():返回此线程名称
- currentThread():获取当前线程名称
线程调度
- setPriority():设置线程优先级,1-10
- getPriority():获取线程优先级
- sleep():使当前正在执行的线程停留指定毫秒数
- join():等待这个线程死亡
- setDaemon(boolean on):守护线程
网络编程
网络编程三要素:IP地址,端口和协议
1、InetAddress
- static InetAddress getByName(String host):确定主机名称的IP地址。主机名称可以是机器名称,也可以是IP名称
- String getHostName():获取此IP地址的主机名
- String getHostAddress():返回文本显示中的IP地址字符串
lambda
- 格式:(形式参数) -> {代码块}
- 形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空
- ->:由英文中画线和大于号组成,固定写法。代表指定动作
- 代码块:具体要做的内容
- 适用前提:有一个接口,接口中有且仅有一个抽象方法
模块化
- 本文标题:Java基础学习笔记
- 本文作者:Kang
- 创建时间:2021-01-10 17:15:41
- 本文链接:ykhou.github.io2021/01/10/Java基础学习笔记/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!