第一章 java语言概述
声明为public的类应与文件名一致
虚拟机栈,即为平时提到的栈结构。我们将局部变量存储在栈结构中
堆,我们将new出来的结构(比如:数组、对象)加载在堆空间中。补充:对象的属性(非static的)加载在堆空间中
方法区:类的加载信息、常量池、静态域
第2章 基本语法
1、关键字和保留字2、标识符
3、变量
基本数据类型
基本数据类型变量间转换
基本数据类型与String间转换
进制与进制间转换
4、运算符 、程序流程控制
2.1 关键字和保留字
Java保留字:现有的java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字(goto,const)
2.2 标识符
1、凡是自己可以起名字的地方
比如:类名,变量名,方法名,接口名,包名
2、标识符的命名规则:
由26个英文字母大小写,0-9,_或 $ 组成
数字不可以开头
不可以使用关键字和保留字,但能包含关键字和保留字
Java中严格区分大小写,长度无限制。
标识符不能包含空格
3、java中的名称命名规范:
包名:多单词组成时所有字母都小写:xxxyyyzzz
类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz
变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz
常量名:所有字母都大写、多单词是每个单词用下划线连接:XXX_YYY_ZZZ
2.3 变量
变量的使用
1、 java定义变量的格式:数据类型 变量名 = 变量值
2、 说明:
① 变量必须先声明,后使用
② 变量都定义在其作用域内。在作用域内,它是有效的,换句话说,出了作用域就失效了
③ 同一个作用域内,不可以声明两个同名的变量
2.3.1 基本数据类型
变量的分类:
1、 按数据类型
对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间
① 基本数据类型:
数值型:整数类型(byte\short\int\long)、浮点类型(float\double)
字符型(char)
布尔型(boolean)
② 引用数据类型:类(字符串在这里)、接口、数组
2、按声明的位置不同
① 成员变量:在方法体外,声明的变量
实例变量(不以static修饰)、类变量(以static修饰)
② 局部变量:在方法体内部声明的变量称为局部变量
形参(方法、构造器中定义的变量)、方法局部变量(在方法内定义)、代码块局部变量(在代码块内定义)
注意:二者在初始化值方面的异同:都有生命周期,局部变量除形参外,需显式初始化
2.3.2 基本数据类型之间的运算规则
1、自动类型提升:
结论:当容器小的数据类型的变量与容量大的数据类型的变量做运算时,结果自动提升为容器大的数据类型。byte、char、short–>int–>long–>float–>double
特别的:当byte、char、short三种数据类型的变量做运算时,结果为int型。
2、强制类型转换
自动类型提升的逆运算
① 需要使用强转符:()
② 注意点:强制类型转换,可能导致精度损失
整型常量,默认类型为int型
浮点型常量,默认类型为double型
2.3.3 字符串类型String
1、String属于引用数据类型,翻译为:字符串
2、声明String;类型的变量时,使用一对””
3、String可以和8中基本数据类型变量做运算,且运算只能是连接运算:+
4、运算的结果仍然是String类型
2.3.4 进制
对于正数,三码合一(都一样)
对于负数
计算机底层都以补码的方式来存储数据!
2.4 运算符
算数运算符
赋值运算符
比较运算符
逻辑运算符
位运算符
三元运算符
表达式1和表达式2要求是一致的,
三元运算符可以嵌套使用
凡是可以使用三元运算符的地方,都可以改写成if……else
2.5 程序流程控制
分支结构
分支一:If……else
Scanner
Random
分支二:switch case
多个case后续结果一样,则可以合并
循环结构
for
练习题:
求最小公倍数和最大公约数
While
一、循环结构的4个要素
①初始化条件
②循环条件–>是boolean类型
③循环体
④迭代条件
二、while循环的结构
①
while(②){
③;
④;
}
执行过程:①-②-③-④-②-③-④-……-②
说明:
1、写while循环千万小心不要丢了迭代条件。一旦丢了,就看导致死循环!
2、我们写程序,要避免出现死循环。
for循环和while是可以相互转换的
死循环:
do while
嵌套循环:
break和continue的区别:
第3章 数组
3.1 一维数组
3.1.1 声明和初始化
3.1.2 调用数组指定位置的元素
3.1.3 获取数组长度
3.1.4 遍历数组元素
3.1.5 数组元素初始化数值
3.2 二维数组
3.2.1声明和初始化
3.2.2 调用指定位置的元素
3.2.3 获取数组长度
3.2.4 遍历二维数组
3.2.5 二维数组的使用
引用类型的变量,要么存地址值,要么是nul;
3.3 算法
3.3.1 数组的复制
算法的考查,数组的复制、反转、查找(线性查找、二分法查找)
3.3.2 数组的反转
3.3.3 线性查找![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9690c054c9844b68a83c7ef53a3de1a4.png)
3.3.4 二分法查找
3.3.5 排序算法
算法的5大特征
输入(input):有0个或多个输入数据,这些输入必须有清楚的描述和定义
输出(output):至少有1个或者多个输出结果,不可以没有输出结果
又穷性(有限性,finiteness):算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
确定性(明确性,definiteness):算法中的每一步都有确定的含义,不会出现二义性
可行性(有效性,effectiveness):算法的每一步都是清楚且可行的,能让用户用纸笔计算而求出答案
冒泡排序
快速排序
排序算法的选择:
3.4 Arrays工具类
Arrays工具类的使用
java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。
3.5 数组中常见异常
数组角标越界异常
空指针异常
第4章 面向对象编程(上)
Java类及类的成员
面向对象的三大特征
其他关键字
4.1 面向过程与面向对象
面向过程(POP)与面向对象(OOP)
二者都是一种思想,面向对象是相对于面向过程而言的。
面向过程,强调的是功能行为,以函数为最小单位,考虑怎么做。
面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位。考虑谁来做
面向对象更加强调运用人类在日常的思维逻辑中采用的思想方法与原则,如抽象、分类、继承、聚合、多态等。
面向对象三大特征:封装、继承、多态
面向对象思想概述
程序员从面向过程的执行者,转化成了面向对象的指挥者。
4.2 Java基本元素:类和对象
4.3 对象的创建和使用
创建类的对象=类的实例化=实例化类
思想落地(分三步)):
4.4 类的成员之一:属性(成员变量)
成员变量和局部变量的异同点:
4.5 类的成员之二:方法
4.5.1 方法: 类应该具有的功能
4.5.2 方法的声明
说明:static、final、abstract 来修饰方法
4.5.3 说明
3、说明
3.1 关于权限修饰符,默认方法的权限修饰符先都是用public
java规定的4中权限修饰符:private、public、缺省、protected
3.2 返回值类型:有返回值vs无返回值
如果方法有返回值,则必须在方法声明时,指定返回值的类型。同时,方法中,需要使用return关键字来返回指定类型的变量或常量:return 数据
如果方法没有返回值,则方法声明时,使用void来表示。通常,没有返回值的方法中,就不使用return。但是,如果使用的话,只能“return;”,表示结束此方法。
4.5.4 return关键字的使用
4.5.5 方法的使用中,可以调用当前类中的属性和方法
特殊:方法A中调用A方法—递归
方法中不可以定义方法
4.5.6 匿名对象的使用
但是当作为实参传递的时候,可以用多次
4.5.7 再谈方法
方法的重载
可变形参的方法
jdk5.0新增的内容
方法参数的值传递机制
递归方法
4.6 OOP特征之一:封装与隐藏
二、封装性的体现:
我们将类的属性xxx私有化(private),同时,提供公共的(public)方法来获取(getXxx)和设置(setXxx)此属性的值
拓展:封装性的体现:①如上②不对外暴露的私有的方法③单例模式……
三、封装性的体现,需要权限修饰符来配合
1、java规定的四种权限修饰符:private、缺省、protected、public
4.7 类的成员之三:构造器(构造方法)
任何一个类都有构造器
Javabean
UML类图
4.8 关键字:this
不要形成闭环
4 .9 关键字:package、import
一、package
MVC设计模式
二、import
包名.类 变量名=new 包名.类名();
import的落脚点是类、接口
import static的落脚点是类中的结构,而非类:
第5章 面向对象编程(中)
OOP特征之二:继承性
方法的重写(override)
四种访问权限修饰符
关键字:super
子类对象实例化过程
OOP特征三:多态性
5.1 OOP特征之二:继承性
一、继承的好处
二、继承的格式
三、java中关于继承的规定
注:java.lang.Object类的理解
5.2 方法的重写
子类和父类中的同名同参的方法要么都声明为static(考虑重写),要么都声明为非static的(不是重写)–static修饰的方法不能被覆盖,是随着类的加载被加载的
5.3 四种访问权限修饰符
5.4 super关键字
5.5 子类对象实例化过程
虽然创建子类对象时调用了父类构造器,但是自始至终就创建过一个对象,即为new的子类对象
5.6 OOP之三:多态性
1、理解多态性
可以理解为,一个事物的多种形态
2、何为多态性
对象的多态性:父类的引用指向子类的对象(或子类的对象赋给父类引用)
p2.eat();
3、多态的使用,虚拟方法的调用
编译看左边,运行看右边(左边部分让秘书去喊个人来,右边部分秘书去给你指定的这个人赋值;p2.eat()—执行这个方法,看秘书叫来的是女人还是男人,执行子类当中对应重写过后的方法)
4、多态性使用的前提:①类的集成关系②方法的重写
5、对象的多态性,只适用于方法,不适用于属性(编译和运行都看左边)
6、向下转型
有了对象的多态性以后,内存中实际上是加载了子类特有的属性和方法的,但是由于变量声明为父类类型,导致编译时,只能调用父类中声明的属性和方法。子类特有的属性和方法不能调用。
p2.smoking();----是错误的
如何才能调用子类中特有的属性和方法?
Man m1=(Man)p2;//使用强制类型转换符,向下转型
m1.smoking;//这样就对了
7、instanceof关键字的使用
因为上边就是new Man()
5.7 Object类的使用
5.7.1 ==和equals的区别:
==
equals
5.7.2 toString()
1、当我们输出一个对象的引用是马士基上就是调用当前对象的toString()
5.7.3 单元测试
5.8 包装类的使用
1、基本数据类型---->包装类
2、包装类---->基本数据类型
3、Jdk5.0新特性
自动装箱
替代基本类型到包装类的转换(不用再new构造器):
int num2=10;
Integer int1=new Integer(num2);
自动拆箱
4、基本数据类型、包装类---->String
String 重载的ValueOf(Xxx xxx);
5、String类型—>基本数据类型、包装类
调用包装类的ParseXxx(String s);
面试题
1、以下两种写法的区别
2、运行结果
第6章 面向对象编程(下)
关键字:static
理解main方法的语法
类的成员之四:代码块
关键字:final
抽象类和抽象方法
接口
类的成员之五:内部类
6.1 关键字static
实例对象随着对象的创建而加载,静态变量(类变量)随着类的加载而加载
“类.静态变量”
6.1.1 static修饰属性
类变量的加载vs实例变量内存解析
6.1.2 static修饰方法
上述是它们各自的声明周期决定的
“晚出生的可以调用早出生的,早出生的无法调用晚出生的”
6.1.3 如何确定是否需要使用静态
6.1.4 单例设计模式
单利模式优点:
由于单例模式只生成了一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
饿汉式和懒汉式
1、 饿汉式
2、 懒汉式
目前是线程不安全的
6.2 main()方法的语法
6.3 类的成员之四:代码块
代码块的作用:用来初始化类、对象
代码块如果有修饰的话,只能使用static;分类:静态代码块vs非静态代码块
static{
}
或
{
}
6.4 final
native(本地的)是接下来要调用底层的c或者c++,不再用java代码来实现,所以不对外开放
static final 用来修饰属性:全局常量
6.5 抽象类与抽象方法
随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征。有时将一个父类设计得非常抽象,以至于它没有具体的实例,这样的类叫做抽象类。
4 、abstract修饰方法
抽象方法只有方法的声明,没有方法体
如果在一个类中存在抽象方法,这个类一定是抽象类。
6.6 接口
Java8 中接口的新特性
可以定义静态方法和默认方法
知识点1:接口中定义的静态方法,只能通过接口来调用
知识点2:通过实现类的对象们可以调用接口中的默认方法
如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
知识点3:如果子类(或者实现类)继承的父类和实现的接口中声明了同名同参数的方法,
那么子类在没有重写此方法的 情况下,默认调用的是父类中的同名同参数的方法->类优先原则
知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法
那么实现类没有重写此方法的情况下–>报错,接口冲突
这就需要我们必须在实现类中重写此方法。
知识点5:如何在子类(或实现类)的方法中调用父类或者接口中被重写的方法
6.7 类的内部成员之五:内部类
第7章 异常
1、异常概述与异常体系结构
2、常见异常
3、异常处理机制一:try-catch-finally
4、异常处理机制二:throws
5、手动抛出异常:throw
6、用户自定义异常类
7.1 异常概述与异常体系结构
广义上的“异常”,包括以上两种。狭义的异常,也就是我们通常所说的异常,指Exception
对于这些错误,一般有两种解决方法:
一是遇到错误就终止程序的运行;
另一种方法是由程序员在编写程序时,就考虑到错误的检测、错误消息的提示,以及错误的处理。
7.2 常见异常
1、空指针异常
//数组空指针
//对象空指针
2、角标越界
数组角标越界
字符串越界
3、类型转换异常
4、
5、输入不匹配
6、算数异常
7.3 异常处理机制一:try-catch-finally
开发中出现运行时异常,一般我们不做try…catch处理
编译时异常一定要加。
finally的使用
7.4 异常处理机制二:throws
7.5 手动抛出异常:throw
throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。(产生异常)
throws 属于异常处理的一种方式,声明在方法的声明处(解决异常)
7.6 用户自定义异常类
自定义异常,必须继承自异常体系
只有异常体系的类才可以throw
小结:
世界上最遥远的距离,是我在if里你再else里,似乎一直相伴又永远分离
世界上最痴心的等待,是我当case你是switch,或许永远哦度选不上自己
世界上最真情的相依,是你再try我在catch。无论你发神马脾气,我都默默承受,静静处理。到那时,再来期待我们的finally。
第8章 多线程
8.1 基本概念:程序、进程、线程
多个线程共享一个进程中的方法区和堆
单核CPU和多核CPU的理解
并行与并发
为什么使用多线程
什么时候使用多线程
补充:线程的分类
守护线程,用户线程
8.2 线程的创建和使用
多个线程共享一个进程中的方法区和堆
方法一 继承Thread类
主线程和分线程有一定的交互性,每次运行结果可能不一样
两个注意点:
如果想要启动两个线程,必须使用.start方法,而不能用.run
因为用run的话,实际上还是主线程在运行
线程的调度
方法二 实现Runnable接口
比较两种创建线程的方式:
8.3 线程的生命周期
从产生到消亡
线程的声明周期
8.4 线程的同步
问题及解决方案
方式一,同步代码块
P433-436
synchronize()
方式二,同步方法
使用同步机制将单例模式中的懒汉式改写为线程安全的
死锁
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,
就形成了线程死锁
说明:
1)出现死锁后,不会显示异常,不会出现提示,只是所有逇线程都出于阻塞状态。无法继续
2) 我们使用同步时,要尽量避免死锁。
方式三:lock锁—JDK5.0新增
练习
8.5 线程的通信
8.6 JDK5.0新增线程创建方式
方法三 实现Callable接口
方法四 使用线程池
相应速度提高了,提高了资源的重用率,便于管理
新增方式二:使用线程池
线程池相关API
第9章 java常用类
9.1 字符串相关的类
String类及常用方法
StringBuffer、StringBuilder
9.2 JDK8之前的日期时间API
System静态方法、Date类、Calendar类、SimpleDateFormat类
9.3 JDK8中的新日期时间API
LocalDate、LocalTime、LocalDateTime、Instance、DateTimeFormatter、其他类
9.4 Java比较器
Comparable接口
Comparator接口
9.5 System类
9.6 Math类
9.7 BigInteger与BigDecimal
第10章 枚举类&注解
第11章 java集合
在内存层面存储数据
第12章 泛型
新特性
第13章 IO流
把内存中的数据写入到硬盘可存储的文件中
第14章 网络编程
第15章 Java反射机制
在java运行过程中动态调用某些类
第16章 java8的其他新特性
Lambda表达式与stream API的使用
第17章 java9&10&11新特性
some 面试题
equals和==的区别
重载与重写的区别
final、、finally、finalize的区别
抽象类与接口有什么异同?
常见的异常有哪些?
throw和throws有什么区别?
Collection和collections
String、StringBuffer、StringBuilder
ArrayList、LinkList
HashMap、LinkedHashMap
sleep()、wait()的异同?
1、相同点:一旦执行方法,都可以使得当前的线程进入阻塞状态
2、不同点:
1)两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
2)调用的位置不同:sleep()可以在任何需要的场景下调用,wait()必须使用在同步代码块或同步方法中
3)关于是都释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不会释放锁,wait()会释放锁
谈谈对程序,进程,线程的理解
synchronized与lock的异同
解决线程安全问题,有几种方式?