A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

二 面向对象
概述
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();
}

抽象
将没有方法主体的方法称为抽象方法
权限修饰符
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 最终化的

构造方法
作用:是为了给对象进行初始化而存在的
没有构造方法就不能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 查询慢、增删更慢 【线程安全性】

特点
使用线性存储
可以重复添加
存入与取出顺序一致

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种方式
- synchronized同步方法。如果是普通方法会锁住这个对象,如果是静态方法锁住的是整个类。
- synchronized同步代码块。
- volatile修饰变量。
- 重入锁ReenreantLock。实现了Lock接口,可重入,但效率低。
- ThreadLocal线程级别的变量共享。
- 阻塞队列LinkedBlockingQueue。主要通过synchronized的put、take实现。
- 原子变量。

线程状态转换
进程的基本状态
新建状态:创建一个线程对象
就绪状态:等待系统分配处理器
运行状态:占有处理器正在运行
等待状态(阻塞状态):等待某个事件的完成
进程状态变化
新建态 -------> 就绪态 【进程创建】
运行态 -------> 等待态 【等待某个事件发生】
等待态 -------> 就绪态 【等待事件完成】
就绪态 -------> 运行态 【进程调度】
运行态 -------> 就绪态 【时间片完成】

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马