二 面向对象
概述
Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想。咱们在面向对象思想的指引下,
使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具有本身的属性和行为。面
向对象思想就是在计算机程序设计过程当中,参照现实中事物,将事物的属性特征、行为特征抽象出来,描述成计算 机事件的设计思想。
它区别于面向过程思想,强调的是经过调用对象的行为来实现功能,而不是本身一步一步的去 操做实现。
面向过程:强调步骤。
面向对象:强调对象
类:是一组相关属性和行为的集合
属性:该事物的状态信息
行为:该事物可以作什么
类与对象的关系
类是对一类事物的描述,是抽象的
对象是一类事物的实例,是具体的
类是对象的模板,对象是类的实体
三种特性
封装
原则:将属性隐藏起来,若须要访问某个属性,提供公共方法对其访问
步骤:使用private关键字来修饰成员变量 ; 对须要访问的成员变量,提供对应的一对一的get××× 和set×××方法
封装操做private的含义
private是一个权限修饰符,表明最小权限
能够修饰成员变量和成员方法
被private修饰后的成员变量和成员方法,只在本类中才能访问
封装优化this方法
使用 this 修饰方法中的变量,解决成员变量被隐藏的问题
继承
类的继承描述的是类与类之间的关系
继承关系–经过已有的类,建立出新类的机制
已有的类咱们叫父类【超类】 建立出来的新类咱们叫子类
经过extends关键字完成一个继承关系
具体格式:
访问修饰符 class 子类类名 extends 父类类名{
}
java中只支持单继承【一个类只能由一个父类】
充当父类的java类绝对不能用final关键字修饰【被final关键字修饰的类是没有子类的】
多态
前提是继承
格式:
父类 对象名称 = new 子类名称(); //父类与子类有继承关系
接口名称 对象名称 = new 实现类名称();
class Dog extends Animal{
//狗 是 狗
Dog d = new Dog();
//狗 是 动物
Animal d = new Dog();
}java
抽象
将没有方法主体的方法称为抽象方法
权限修饰符
public
protected
private
default
抽象方法必须在抽象类中
抽象类能够没有抽象方法
抽象方法不能new 不是子类不能new
若是子类继承了父类,就必须继承抽象方法,必须重写方法体
抽象类不能new的缘由:
由于有抽象方法,没有构造方法
接口
抽象类 接 口
构造方法 有 没有
成员变量 有普通成员变量 没有
普通方法 能够包含非抽象的 不可包含
访问类型 能够是public protected 只能是public(默public abstract)
静态方法 能够 不能够
静态成员变量 访问类型能够任意 接口中定义的变量只能是public static final类型数组
一个类能够实现多个接口
一个类只能够继承一个类(单继承)
一个类只能够继承一个类,而且实现多个接口
一个接口能够继承另外一个接口
一个接口能够继承多个接口
一个接口不能继承类
一个接口不能够实现另外一个接口
关键字
this 当前的
super 父类的
static 静态化的安全
优势
1.可使用【类名 方法名称】进行调用,没必要再建立对象
2.优于构造函数先执行------> 任何一个类都会有一个默认的无参数的构造方法
构造方法/函数的做用:为了使类可实例化【就是为了能够new】
3.静态成员被全部对象所共享(静态数据达到成为共享数据)
4.随着类的加载而加载(也就是说类运行了,静态成员也就跟随运行了)多线程
缺点
1.访问出现局限性 只能访问静态
2.静态成员的生命周期过长
3.不能够与this | super关键字同用
(1)由于this表明使当前类对象,而静态存在时,有可能没有对象
(2)由于super表明的是父亲对象,而静态存在时,有可能没有对象,并且静态优先于对象存在
4.静态方法只能访问静态成员,非静态方法既能够访问静态又能够访问非静态并发
final 最终化的jvm
构造方法
做用:是为了给对象进行初始化而存在的
没有构造方法就不能new
当你没有写构造方法,jvm会自动给你加上一个无参数的构造方法
成员变量or局部变量
public class Car{
String color; //成员变量
public void driver(){
int speed = 80; //局部变量
System.out.println("时速:" + speed);
}
}函数
在类中的位置不一样 ★
成员变量:类中,方法外
局部变量:方法中或者方法声明上(形式参数)
做用范围不同 ★
成员变量:类中
局部变量:方法中
初始化值的不一样 ★
成员变量:有默认值【int为0 boolean为false】
局部变量:没有默认值 必须先定义,赋值,最后使用
在内存中的位置不一样 了解
成员变量:堆内存
局部变量:栈内存
生命周期不一样 了解
成员变量:随着对象的建立而存在,随着对象的消失而消失
局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
补:
若是private私有化了,就必定可以得提供公有方法 Getter and Setter方法 string是类
equals看的是汉字是否同样
== 看的是两方汉字的地址值是否同样
三.集合
单列集合 collection / 表示为泛型
List【线程不安全性】工具
派生类
ArrayList 查询块、增删慢
LinkedList 查询慢、增删块
Vector 查询慢、增删更慢 【线程安全性】优化
特色
使用线性存储
能够重复添加
存入与取出顺序一致this
Set【线程不安全性】
派生类
HashSet
TreeSet
特色
使用哈希表存储
不能够重复添加
存入与取出顺序不一致
为何不能够重复添加数据?
加入Set里面的元素必须定义equals()方法以确保对象的惟一性
set插入数据时,先比较hashCode
1.若是hashCode相同才会比较equals,equals相同,则两个对象相同,不能插入,equals不一样,能够插入;
2.若是hashCode不一样,就直接插入了,两个对象hashCode不相等,他们equals必定是false
接口:继承了Iterable,迭代器
foreach
双列集合 Map /表示为泛型 key value键值对
泛型:限定类型,泛型中的不可使用基础数据类型,只能使用引用数据类型
HashMap 【线程不安全性】
迭代器iterator使用
三种迭代器方法
keyset()
先获取键
经过键获取值
打印值 能打印键
entryset()
能够获取键
也能够获取值
均可以打印
values()
直接获取值
打印值 不能打印键
都须要使用迭代器
Iterator it = Set.iterator();
while (it.hasNext()){
it.next();
}
TreeMap 【线程不安全性】
HashTable【线程安全性】
properties 既是io流 也是集合
list与Map不能转换
set与Map能够转换 共同点有【都是线程不安全性 都是接口 都间接的继承了Iterable这个接口】
在双列集合接口中,并无继承Iterable,意味着Map集合中没有迭代器
工具类 Collections
Collections是专门用于对Collection集合进行操做的工具类,它提供了一些便捷的方法,如排序,查找,求最值等等
四. 异常
Error错误
CPU中央处理器
单核处理器(并行)
多核处理器(并发线程)
若是是单核处理器,就不是同时在执行
运行速度很是快,快到觉得是同时
多核处理器真的能够同时在执行,处理器多了能够分开执行
Exception异常
系统定义好的/官方的预约义
编译时异常
写代码过程当中,写完未执行时,报错
运行时异常
已写完后,已经开始运行时,报错
自定义异常
致使缘由
算数异常
数组异常
图片异常
图标异常
音频异常
io异常
解决方案
1.捕捉异常
try{
catch{
finally{
}
2.声明式异常
在方法名称的括号后加上一个 throws
eg:
ClassNotFoundException 找不到类异常
NoClassDefoundError 没有定义类的异常
ArrayIndexOutOfBoundsException 数组角标超出范围的异常
NullPointerException 空指针异常
★ RuntimeException 运行时异常
五.多线程
进程和线程定义和关系:
进程(表面):正在进行中的程序(任务管理器 ctrl+_alt+del)
线程(内在):是存在进程中的一个执行单元(没有箱子,可是有组件)
进程和线程的关系:每个进程中至少存在一个线程,也可拥有多个线程
多线程
并行:针对于多个线程,在同一时间内发生 (重在指一段时间内)
并发:针对于多个线程,在同一时刻发生 (指的是同时)
线程调度 【Java的继承机制:仅单继承,不能够多继承】
分时调度
按方式调度
设置线程:Run()方法
开启线程:Start()方法
实现多线程的三种方法
继承java.lang.Thread类【extend Thread】
实现java.lang.Runnable接口(重写Run方法)【implements Runnable】
实现Callable接口(接口中必定不容许存放变量,不可以存放常量)
Thread和Runnable的区别(实现接口比继承类的优点)
①能够避免单继承的局限性【若一个类继承 Thread的话,则不适合资源共享;但若实现 Runnable 接口的话,就很容易实现资源共享】
②适合多个相同的程序代码的线程去处理同一个资源
③加强程序的扩展性,下降耦合性(避免牵一发而动全身)【代码能够被多个线程共享,代码和数据独立】
④线程池只能放入实现 Runnable 或 Callable 类的线程,不能直接放入继承 Thread 的类
线程的状态能够分为5种:
新建new:
当一个线程新建出来,例如 Thread thread = new Thread() 此时,线程状态就是new。
可运行Runnable:
当新建的线程调用start方法,线程状态就变为runnable,此时线程随时等待CPU调度执行,但未执行。
正在运行running:
CPU开始调度执行此线程,须要注意的是,线程running状态只能从runnable转换过来。
阻塞blocked:
当处于正在运行的线程由于一些状况放弃争夺CPU资源,此时就进入了阻塞状态,若是线程须要再次运行必须先转变成runnable状态。
死亡dead:
线程运行完成或出现异常,线程S生命周期结束。
线程安全、线程同步、线程互斥、线程通讯
线程安全:
是指多线程执行同一份代码每次执行结果都和单线程同样。
线程同步:
对临界区的共享数据,A线程去操做数据,而且须要另外一线程B的操做才能继续完成,这种线程之间协做的就是线程同步。
线程互斥:
对临界区的共享数据,两个线程都有修改状况,若是没有加锁或cas等的操做会形成数据混乱异常,这种就是线程互斥。
线程通讯:
能够认为是线程同步的扩展,由于wait/notify必须获取了对象锁才能使用,经过wait/notify这种方式实现两个线程的等待唤醒。
线程同步的7种方式
线程状态转换进程的基本状态新建状态:建立一个线程对象就绪状态:等待系统分配处理器运行状态:占有处理器正在运行等待状态(阻塞状态):等待某个事件的完成进程状态变化新建态 -------> 就绪态 【进程建立】运行态 -------> 等待态 【等待某个事件发生】等待态 -------> 就绪态 【等待事件完成】就绪态 -------> 运行态 【进程调度】运行态 -------> 就绪态 【时间片完成】