一.对象和封装
1.类是对象的类型,对象是类的实例
2.方法重载
在一个类中定义多个方法名相同但是参数列表和返回值不同的方法
3.static关键字
static修饰符可以用来修饰属性、方法和代码块
用static修饰的成员不再属于对象,而属于整个类
适用于团体属性
static关键字修饰的属性允许通过对象调用,并且允许通过对象修改
在给方法添加静态关键字static时,该方法调用的变量必须全部为静态变量
在非静态方法总允许调用静态属性,反之不允许
final 代表常量
static、非private修饰 | 非static、private修饰 | |
---|---|---|
属性 | 类属性、类变量 | 实例属性、实例变量 |
方法 | 类方法 | 实例方法 |
调用方式 | 类名.属性 类名.方法() 对象.属性 对象.方法() | 对象.属性 对象.方法() |
归属 | 类 | 单个对象 |
4.封装
- 什么是?
将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问 - 如何实现?
1)修改类的属性可见性,设为private私有的
2)创建公有的get与set方法,用于属性的读写
3)在get或set方法中加入控制语句,对属性值进行合法性的判断 - 好处?
1)隐藏类的实现细节,调用都不需要知道具体是怎么实现的。
2)只能通过规定的方法访问数据,实现数据的安全性。
3)方便在提供的方法内加入控制语句。
4)方便修改实现。修改实现在内部修改,跟调用都无关。
二.继承
1.继承
1)符号is-a关系
2)使用extends关键字
3)代码复用
4)多重继承关系初始化顺序
父类属性 >父类构造方法 >子类属性 >子类构造方法
5)不能继承的父类成员
2.重写
1)方法名相同
2)参数列表相同
3)返回值类型相同或者是其子类
4)访问权限不能严于父类
3.super关键字
1)super关键字用来访问父类的成员
2)super只能出现在子类的方法和构造方法中
3)super调用构造方法时,只能是第一句
4)super不能访问子类的private成员
4.访问修饰符
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | |||
默认(friendly) | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
5.抽象类和抽象方法
1)抽象类不能被实例化
2)抽象类可以有0~多个抽象方法
3)非抽象子类必须重写父类的所有抽象方法
4)抽象方法没有方法体
5)抽象方法必须在抽象类里
6)抽象方法必须在子类中被实现,除非子类是抽象类
6.final修饰符
1)修饰的类,不能再被继承
2)修饰的方法,不能被子类重写
3)修饰的变量将变成常量,只能在初始化时进行赋值
三.多态
- 什么是?
同一个引用类型,使用不同的实例而执行不同操作
1)同过父类创建多种类型的子类对象
2)子类实现父类的抽象方法
3)通过父类对象调用子类方法
4)多态中最终执行功能的是子类 - 优点
1)减少类中代码量
2)提高代码的可扩展性和可维护性 - 实现多态几种方式?
1)使用多态实现思路(实现多态的三个要素)
编写具有继承关系的父类和子类
子类重写父类方法
使用父类的引用指向子类的对象
2)实现多态的两种形式
使用父类作为方法形参实现多态
使用父类作为方法返回值实现多态
3)向上转型——子类转换为父类,自动进行类型转换
向下转型——父类转换为子类,结合instanceof运算符进行强制类型转换
四.接口
一个类只能继承一个父类但可以实现多个接口
- 特性
1)接口不可以被实例化
2)实现类必须实现接口的所有方法
3)实现类可以实现多个接口
4)接口中的变量都是静态常量
【属性全都是全局静态常量】
【方法全都是全局抽象方法】
【无构造方法】 - 编码实现
//编写接口
public interface UsbInterface {
void service();
}
//实现接口(多个接口使用“,”隔开)
public class UDisk implements UsbInterface {
public void service() {
System.out.println("123");
}
}
//使用接口
UsbInterface uDisk = new UDisk();
uDisk.service();
五.异常
- 什么是?
异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序 - 如何进行异常处理
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
1)try:执行可能产生异常的代码
2)catch:捕获异常
3)finally:无论是否发生异常,代码总能执行
4)throws:声明方法可能要抛出的各种异常
5)throw:手动抛出异常
try {
// 代码段 1
// 产生异常的代码段 2
} catch (异常类型 ex) {
// 对异常进行处理的代码段3
return;
}finally{
// 代码段 4
}
}
public class Test {
public static void divide() throws Exception {//声明异常,多个异常用逗号隔开
//可能出现异常的代码
}
public static void main(String[] args) {
try {
divide();
} catch (Exception e) {
e.printStackTrace();
}
}
// public static void main(String[] args) throws Exception {
// divide();
// }
}
public class Person {
private String name = "";
private int age = 0;
private String sex = "男";
public void setSex(String sex) throws Exception {
if ("男".equals(sex) || "女".equals(sex))
this.sex = sex;
else {
throw new Exception(“性别必须是\"男\"或者\"女\"!");
}
}
}
- 常见异常类型
异常类型 | 说明 |
---|---|
Exception | 异常层次结构的父类 |
ArithmeticException | 算数错误情形,如以零做除数 |
ArrayIndexOutOfBoundsException | 数组下标越界 |
NullPointerException | 尝试访问null对象成员 |
ClassNotFoundException | 不能加载所需的类 |
IIIegalArgumentException | 方法接收到非法参数 |
ClassCastException | 对象强制类型转换出错 |
NumberFormatException | 数字格式转换异常,输入类型不匹配 |
六.集合框架
- 集合框架内容
1)Collection 接口存储一组不唯一,无序的对象
2)List 接口存储一组不唯一,有序(插入顺序)的对象
3)Set 接口存储一组唯一,无序的对象
4)Map接口存储一组键值对象,提供key到value的映射 - List接口的实现类
1)ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
List dogs = new ArrayList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置
System.out.println("共计有" + dogs.size() + "条狗狗。");
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);
… …
}
List接口常用方法
方法名 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0和列表中元素个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
2)LinkedList采用链表存储方式。插入、删除元素时效率比较高
LinkedList dogs = new LinkedList();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.addLast(meimeiDog);
dogs.addFirst(feifeiDog);
Dog dogFirst= (Dog)dogs.getFirst();
System.out.println("第一条狗狗昵称是"+dogFirst.getName() );
Dog dogLast= (Dog)dogs.getLast();
System.out.println("最后一条狗狗昵称是"+dogLast.getName());
dogs.removeFirst();
dogs.removeLast();
LinkedList的特殊方法
方法名 | 说明 |
---|---|
void addFirst(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFirst() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFirst() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
- Map接口
Map countries = new HashMap();
countries.put("CN", "中华人民共和国");
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚合众国");
String country = (String) countries.get("CN");
… …
System.out.println("Map中共有"+countries.size() +"组数据");
countries.remove("FR");
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));
System.out.println( countries.keySet() ) ;
System.out.println( countries.values() );
System.out.println( countries );
Map接口常用方法
方法名 | 说明 |
---|---|
Object put(Object key, Object val) | 以“键-值对”的方式进行存储 |
Object get (Object key) | 根据键返回相关联的值,如果不存在指定的键,返回null |
Object remove (Object key) | 删除由指定的键映射的“键-值对” |
int size() | 返回元素个数 |
Set keySet () | 返回键的集合 |
Collection values () | 返回值的集合 |
boolean containsKey (Object key) | 如果存在由指定的键映射的“键-值对”,返回true |
七.多线程
- 什么是?
1)如果在一个进程中同时运行了多个线程,用来完成不同的工作,则称之为“多线程”
2)多个线程交替占用CPU资源,而非真正的并行执行 - 好处
1)充分利用CPU的资源
2)简化编程模型
3)带来良好的用户体验 - 创建线程的方式
1)继承Thread类
编写简单,可直接操作线程
适用于单继承
2)实现Runnable接口
避免单继承局限性
便于共享资源 - 线程的状态
- 线程安全的类型
方法是否同步 | 效率比较 | 适合场景 | |
---|---|---|---|
线程安全 | 是 | 低 | 多线程并发共享资源 |
非线程安全 | 否 | 高 | 单线程 |
- 总结
八.File I/O
- 文件
File file = new File( String pathname );
File类常