文章目录
- 1.方法
- 2.面向对象
- 3.内部类
- 4.异常
- 5.多线程
- 6.逻辑运算符(逻辑与、逻辑或、逻辑异或、非、短路与、短路或)
- 7.八大基本类型
- 8.标识符
- 9.关键字
- 10.注释
- 11.数组
- 12.冒泡排序算法
- 13.Static关键字
- 14.拓展小案例
- 15.构造代码块
- 16.局部代码块
- 17.静态代码块
- 18.final关键字
- 19.static关键字(静态)
- 17.Object类
- 18.String类
- 17.正则表达式
1.方法
1.在定义方法的过程中,不能够将方法定义在方法里面。
2.方法名称区分大小写。
3.方法必须先定义后才可以调用,否则程序将会报错。
4.形参和实参:
- 形参:方法定义中的参数。
- 实参:方法调用中的参数。
5.方法定义的注意事项:
- 方法里面不能嵌套方法
- void表示无返回值,可以省略return,也可以单独的书写return,后面不加数据。
6.方法的重载:指同一个类中定义的多个方法之间的关系,满足下列条件的多个方法,相互构成重载
-
多个方法在同一个类中
-
多个方法具有相同的方法名
-
多个方法的参数类型不相同,类型不同或者数量不同
方法重载与方法的返回类型无关,不能够通过方法的方法类型判断方法的重载
7.方法的参数传递基本类型
- 对于基本数据类型的参数,形参的改变,不会影响到实参数的值(方法调用完后就出栈了,形参值的改变不影响实参的值)
图中change方法调用完后已经出栈!
8.方法的参数传递引用类型
对于引用类型的参数,形参的改变,会影响到实参的值(因为引用类型的内存地址不改变)
2.面向对象
1.类:类是对现实生活中一类具有共同属性和行为的事物的抽象,是对具有相同属性和行为的一组对象的集合
2.new单个对象内存图:
对象是存放在堆空间的,对象在堆里面会返回一个内存地址,方法存放在栈里(压栈),方法执行完后就会出栈(栈遵循先进后出原则)
代码System.out.println()输出一个对象输出的是一个地址,通过该内存地址找到该对象,进行对象的成员属性值的修改
3.成员变量和局部变量:
- 成员变量:在类中方法外定义的变量就是成员变量
- 局部变量:在类中方法里面定义的变量就是局部变量
- 局部变量想使用的话必须先赋值才可以使用
- 成员变量有默认初始化值,int类型的默认值就是0(例如this.成员变量)
- 在方法里面传递的参数(形参),也属于该方法里面的局部变量
4.private修饰符:
5.get和set方法(前提是用private修饰符定义成员变量):
- get方法:直接获取成员变量的值 获取的操作
- set方法:就是给我们的成员变量赋值 赋值的操作
6.this关键字:
7.构造方法:
8.this使用细节
2.1封装
2.2继承
总结:继承就是继承父类的成员属性和方法,子类继承父类后可以调用父类的成员属性和方法,子类也可以继续拓展在定义新的成员属性和方法。
继承的优缺点:
继承中变量的访问特点:
super关键字:
super访问父类中构造方法:
总结:每个子类构造方法的第一行代码默认都是:super(),只是没有显示出来
父类中没有无参构造方法的话就在子类用super方法调用父类中的有参构造方法解决
继承中成员方法访问特点:
方法重写:
注意事项:方法的 方法名称(参数列表) 必须与父类保持一致!
权限修饰符:
方法重写注意事项:
Java中继承注意事项:
2.3多态
1.多态的基本概念:
多态的3个前提条件需要注意!
2.多态的访问特点:
3.多态的优点和缺点:
4.多态的转型:
父类转为子类类型可能发生类型转换异常
5.图片笔记:
2.4抽象类
1.抽象类的概念:注意:继承抽象类的子类必须重写抽象类里所有的抽象方法,非抽象方法子类是没有必须强制要重写的
2.抽象类特点:
抽象类中是可以定义成员属性的
3.abstract关键字不能和哪些关键字共存?
4.图片笔记:
2.5接口
1.接口的定义特点:
2.接口成员特点:
接口中是可以定义非抽象方法的:用default关键字修饰!
3.类和接口的关系:
4.抽象类和接口的区别:
5.图片笔记:
3.内部类
3.1什么是内部类
总结:外部类想要访问内部类的成员和方法必须先创建内部类的对象,然后再通过内部类对象.方法名访问
3.2成员内部类
3.3静态内部类
MayiktA.MayiktB = new MayiktA.MayiktB()
3.4局部内部类
3.5匿名内部类
本质:在底层帮你实现或继承了一个类
3.6图片笔记
4.异常
4.1什么是异常
4.2try catch 用法
4.3catch顺序问题
4.4Exception异常
Throwable类是java语言中所有错误和异常的超类
4.5throw成员方法
4.6编译时与运行时异常区别
4.7异常处理之throws
总结:哪个方法调用到有抛出异常的方法,那么该方法也需要try catch后者throws抛出异常
4.8自定义异常
- 自定义的异常类,实现编译时异常,直接继承Exception
- 自定义的异常类,实现运行时异常,直接继承RuntimeException
4.9图片笔记
5.多线程
5.1什么是线程和进程
5.2为什么在进程中还需要线程
总结:线程之间互不影响,每个线程执行自己的任务,一条线中一个进程中只有一个线程是不可行的。
5.3为什么需要使用多线程(并行与串行的区别)
总结:
- 多线程相互之间不影响,提高效率,节省时间
- 单线程遇到问题便不可执行其他任务,耗时
5.4使用多线程一定提高效率吗
总结:
- 线程的状态有就绪状态、运行状态、死亡状态,线程被cpu调度后,状态由就绪状态变为运行状态,这个过程叫做上下文切换,也就是cpu从执行该线程切换到执行另外的线程
- cpu调度时间(简称cpu调度时间片),一般只调度几十毫秒(所以底层执行并不是真正意义上的多线程,只是每个线程的调度时间很短,这里指的时单核的cpu)
- 程序计数器可以保存当前线程执行到的位置,下次在被cpu调度时可以直接通过程序计数器往下执行
- 利用多核多线程的性能,如果你的cpu是多核(4核、8核),这样的话每个线程都能分配到cpu就不会发生上下文切换,线程也不会争抢cpu。如果有上百个线程,那样线程就会争抢cpu,对于电脑的性能、代码的效率会有一定的影响。
5.5多线程应用场景
下图示例总结:其实就是多开几个线程分别去执行【发送短信线程】、【发送邮件线程】,这样客户端请求服务器端时,服务器端响应的时间会变短很多
5.6同步与异步之间的区别
总结:个人理解区别就在于代码1、2、3是串行执行还是并行执行,串行执行就是同步,并行执行就是异步
5.7创建线程的几种方式
5.8继承Thread类创建线程
5.9实现Runnable接口创建线程
5.91使用匿名内部类的方式创建线程
5.92使用lambda表达式创建线程
5.93synchronize锁同步
1.什么是线程安全问题
总结:多个线程通过执行Thread.sleep()方法,线程从执行状态变为休眠状态,再从休眠状态变为就绪状态–>执行状态,这个时候多个线程之间就会争抢cpu的执行权,导致一会是这个线程对这个全局变量做写的操作,一会是那个线程对全局变量做写的操作,这样就很容易出现问题,出现错误
写的操作—就是修改的意思
2.如何解决线程安全问题
3.synchronized锁基本的用法(加在代码块)
4.synchronized锁基本的用法(加在实例方法和静态方法)
5.synchronized死锁问题
5.如何诊断synchronized死锁
6.使用wait、notify方法注意事项
6.逻辑运算符(逻辑与、逻辑或、逻辑异或、非、短路与、短路或)
7.八大基本类型
1.八大基本类型速查表
2.Java给8大基本类型都提供了对应的“工具箱”
3.char类型
- 字符型可以保存一个数字、字母、汉字,而且字符型永远只能存一个;
- char类型也可以存不被单引号包裹的数字,但是打印的并不是数字,而是会到Ascill码表中去查这个数字对应的字符打印出来,比如97对应’a’,128~65535这个范围的数字也可以保存,只不过eclipse一般显示为?(问号)
- 字符用char存储,但是char本身是16位无符号整数,包含在int中,所以int也可以存
4.5条字面值规则
5.5条运算规则
6.类型转换
8.标识符
- 由字母、数字、下划线、$(美元符号)组成
- 不能以数字开头
- 严格区分大小写
- 见名知意,并且不要使用拼音或者中英文夹杂的方式
- 不能使用关键字的名字命名
9.关键字
- 被Java提前指定好的全小写单词,一共有50个;
- 2个保留字:const和goto,目前还没有明确意义的关键字;
- 还有3个不可以用作标识符的单词:true,false,null;(true和false不是关键字)
10.注释
用来解释代码,方便看看代码的人去理解代码的话
- 注释并不会影响程序的执行,会被编译器忽略掉
- 单行注释: // 可以注释一行的内容
- 多行注释:/ * * / 可以注释多行的内容
- 文档注释:/** */ 也可以注释多行内容,还可以添加一些额外的信息,比如:作者/时间/版本…
11.数组
1.数组概述
- 数组的内存空间是连续的
- int是基本类型,int[]代表的是int数组,是引用类型,而数组类型的变量比如a,保存的就是数组的地址值,而不是数组中的多个具体元素
- 数组一旦创建,长度不可改变,如果想要增加/删除数组中的元素,只能先创建一个新长度的数组,再将原来的数据复制过去
2.数组的扩容与缩容
3.数组的截取
4.数组的排序
12.冒泡排序算法
13.Static关键字
1.static概述
2.静态关键字访问特点
3.静态关键字应用场景
4.static修饰常量
public static final int CODE_200 = 200;
14.拓展小案例
1.编写一个计算器
package cn.tedu.review;
import java.util.Scanner;
/**本类用于实现简易计算器*/
public class TestCalc {
public static void main(String[] args){
f0();//调用一个实现计算器的方法
}
private static void f0() {
while(true){
System.out.println("请您输入要计算的第1个数:");
int a = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的第2个数:");
int b = new Scanner(System.in).nextInt();
System.out.println("请您输入要计算的运算符,支持:+ - * / :");
String s = new Scanner(System.in).nextLine();
switch(s){
case "+":f1(a,b);break;
case "-":f2(a,b);break;
case "*":f3(a,b);break;
case "/":f4(a,b);break;
default: System.out.println("您输入的运算符不正确!");
}
//询问用户是否想继续运算
System.out.println("如果想退出,请输入1,如果想继续,请输入2");
int flag = new Scanner(System.in).nextInt();
if(flag==1) break;
}
}
private static void f1(int a, int b) {
System.out.println(a+"和"+b+"做加法的结果为:"+(a+b));
}
private static void f2(int a, int b) {
System.out.println(a+"和"+b+"做减法的结果为:"+(a-b));
}
private static void f3(int a, int b) {
System.out.println(a+"和"+b+"做乘法的结果为:"+(a*b));
}
private static void f4(int a, int b) {
System.out.println(a+"和"+b+"做除法的结果为:"+(a/b));
}
}
15.构造代码块
16.局部代码块
17.静态代码块
18.final关键字
19.static关键字(静态)
17.Object类
18.String类
17.正则表达式
1.概述:
正确的字符串格式规则
常用来判断用户输入的内容是否符合格式的要求,注意是严格区分大小写的。
2.常见语法:
3.String提供了支持正则表达式的方法
Matches(正则) : 当前字符串能否匹配正则表达式
replaceAll(正则,子串) : 替换子串
split(正则) : 拆分字符串
4.测试输入身份证号
import java.util.Scanner;
/*本类用于正则表达式入门案例*/
//需求:接收用户输入的身份证号,并将判断的结果输出
public class TestRegex {
public static void main(String[] args) {
//1.编辑正则表达式
//身份证号的规律:一共是18位,前17位是数子,第18位有可能是数字,也有可能是X
//String regex = "[0-9]{17}[0-9X]";
/*单个\在Java中有特殊的含义,表示转义符号,不认为是一个斜杠
* 所以如果想要表示斜杠,需要在它的前面加一个用来转义的\
* 也就是\\才表示成一个单纯的斜杠
* \t -- 制表符 \r回车符 \n换行符*/
String regex = "\\d{17}[0-9X]";
//2.定义变量用来接收用户输入的身份证号:
String input;
//3.判断用户输入的数据是否符合正则表达式,如果不正确,继续输入
do {
System.out.println("请输入您的身份证号:");
input = new Scanner(System.in).nextLine();
if (input.matches(regex)) {//如果身份证号正确
System.out.println("恭喜你!输入正确!");
return;//结束本方法
}
} while (!input.matches(regex));//只要不符合正则表达式,就继续输入
}
}