继承:
1. 提高代码复用性
2. 让类与类之间产生关系,有了关系,才有了多态的特性
注意:不能为了简化代码而继续.java只支持单继承,支持多层继续,也就是一个继承体系。
必须是类与类之间有所属关系才可以继承。所属关系is-a ;
查阅父类功能,创建子类对象使用功能。
Super代表父类对象的引用
覆盖
1. 子类覆盖父类,必须保证子类权限大于父类权限。
2. 静态只能覆盖静态
重载:只看同名函数的参数列表
重写:子父类方法要一模一样
子类中所有构造函数默认第一行都是super();
子类的所有构造函数,默认都会访问父类中的空参数构造函数
当父类中没有空参数的构造函数时,子类必须手动通过super语句形式来指定要访问的父类的构造函数。
final,修饰符
1. 可以修饰类,函数,变量
2. 被final修饰的类不可以被继承。为了避免被继承,被子类覆写功能。
3. 被final修饰的方法不可以被覆写
4. 被final修饰的变量是一个常量只能赋值一次,即可以修饰成员变量,又可以修饰局部变量
5. 内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
抽象类
当多个类中出现相同功能,但是功能主体不同
这时可以进行向上抽取,只抽取功能定义,而不抽取功能主体
抽象类的特点
1. 抽象方法一定在抽象类中
2. 抽象方法和抽象类都必须被abstract关键字修饰
3. 抽象类不可以用new创建对象。因为调用抽象方法没有意义。
4. 抽象类汇总的方法要被使用,必须由子类覆写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,则该子类还是一个抽象类
接口,interface
接口格式
1. 接口中常见定义:常量,抽象方法
2. 接口中的成员都有固定修饰符
a) 常量: public static final
b) 方法:public abstract
接口中的成员都是public
不可创建对象,因为有抽象方法,需被子类实现,子类对接口汇总的抽象方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类。可以被类多实现
接口的特点:
1. 接口是对外暴露规则
2. 接口是程序的功能扩展
3. 接口可以用来多实现
4. 类与接口直接是实现关系,而类可以继承一个类的同时实现多个接口
5. 接口与接口之间也可以有继续关系
多态:可以理解为事物存在的多种体现形态。
多态的体现
父类引用指向了自己的子类对象。
父类的引用也可以接收自己的子类对象。
多态的前提
必须是类与类之间有关系。要么继承,要么实现。
存在覆盖
多态的好处
多态的出现大大的提高了程序的扩展性
多态的弊端
提高了扩展性,但是只能使用父类的引用访问父类中的成员。
多态的应用
在多态中成员函数的特点
在编译时期,参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过。
在运行时期,参阅对象所属的类中是否有调用的方法。
成员函数在多态调用时,编译看左边,运行看右边。
在多态中成员变量的特点,无论编译和运行都参考左边(引用型变量的类型)
在多态中,静态成员函数的特点,无论编译和运行都参考左边。
内部类访问规则:
1. 内部类可以直接访问外部类中的成员,包括私有;内部类中持有了一个外部类引用this
2. 外部类要访问内部类,必须建立内部类对象。
访问格式
1当内部类定义在外部类的成员位置上,而且非私有,可以访问外部其他类
可以直接建立内部类对象
外部类名.内部类名 变量名=外面了对象.内部类对象
2当内部类在成员位置上,就可以被成员修饰符所修饰,比如
Private:将内部类在外部类中进行封装
Static:内部类就具备static特性
只能直接访问外部类中的static成员。出现了访问限制。
当内部类中定义了静态成员,该内部类必须是static
外部类中的静态方法访问内部类时,内部类也必须是static的
异常体系
Throwable
Error
Exception
RuntimeException
Throws使用在函数上,后面跟异常来,可以跟多个用逗号隔开
Throw使用在函数内,后面跟异常对象
Finally:一定执行的代码块
关闭资源
异常覆盖:
1. 子类在覆盖父类是,如果父类的方法抛出异常,那么子类覆盖方法,只能抛出父类的异常或者该异常的子类。
2. 如果父类方法抛出多个异常,那么子类在覆盖方法时只能抛出父类异常的子集
3. 如果父类或者接口的方法中没有异常抛出,那么子类在覆盖方法时,也不可以抛出异常。如果子类方法发生了异常,只能进行try处理。
Finally只有一种情况不会执行,当执行到System.exit(0);
进程:正在进行中的程序。
每个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中第一个独立的控制单元。线程在控制着进程的执行。
一个进程至少有一个线程。
创建线程的第一种方式:继承Thread类,重写run方法,调用start方法(启动线程,调用run方法)。
创建线程的第二种方式:定义类实现Runnable接口,然后实现该接口的run方法,通过Thread类建立线程对象,将Runnable接口的子类对象作为实际参数传递给thread类的构造函数,调用thread类的start方法
join抢夺CPU执行权,当前线程暂停执行,直到抢夺线程执行完毕。
yield 暂停当前线程对象,并执行其他线程
线程状态
String类覆写了Object类中的equals方法,该方法用于判断字符串是否相同。
String常量池,在方法区中
StringBuffer是字符串缓冲区,是一个容器。
1. 长度可变化
2. 字节操作多中数据类型
3. 最终会通过toString方法别变成字符串
StringBuilder和StringBuffer类似。1.5版本出现,StringBuffer线程同步,StringBuilder线程不同步。单线程下StringBuilder效率较高,在多线程使用StringBuffer。
集合
集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
数组虽然也可以存储对象,但是长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合中存储的都是对象的引用(地址)。
迭代器,就是集合的取出元素的方式。
在迭代时,不可以通过集合对象的方法操作集合中的元素
/**
*Conllection
* |--List:元素是有序的,元素可以重复。因为该集合体系有索引。
* |--ArrayList:底层的数据结构使用的是数组结构,查询速度快,增删慢。线程不同步。
* |--LinkedList:链表结构,增删速度快,查询慢
* |--Vector:底层是数组数据机构。线程同步。枚举是Vector特有的取出方式。
* |--Set:元素无序,元素不可以重复
* |--HashSet:哈希表机构
* 通过元素的两个方法保证元素唯一性,hashcode和equals来完成
* 如果元素的hashcode值相同,才判断equals是否为true
* 线程非同步
* |--TreeSet
* 可以对Set集合进行排序
* 底层数据结构是二叉树
* 保证元素唯一性依据
* TreeSet排序的第一种方式:让元素自身具备比较性。
* 元素实现Comparable接口,覆盖compareTo方法。(自然顺序,默认顺序)
* TreeSet排序的第二种方式:让集合自身具备比较性。
* 比较器。
* 定义一个类,实现Comparator接口,覆盖compare方法。
*
* 当两种方式都存在时以比较器为主。
*hashcode+ equals
*
*List
* 特有方法,凡是可以操作角标的方法都是该体系特有的方法。
*/
/*
* Map
* |--hashtable 底层是哈希表数据结构,不可以存入null键null值 JDK1.0
* |--HashMap 底层是数据结构,允许使用null键和null值,效率高JDK1.2
* |--TreeMap 底层是二叉树,线程不同步,可以用于给Map集合中的键进行排序
* Map的两种取出方式:
* 1.keySet:将map所有的键存入到set集合,因为set具备迭代器
* 以迭代方式取出所有的键,再根据get方法,获取每个键对应的值
* 2.entrySet:将map集合中的映射关系存入到set集合汇总,而这个关系就是Map.entry();
*
* Set底层使用Map集合
*/
高效/方便书写/安全
泛型:用于解决安全问题,是一种类型安全机制
好处:将运行期出现的ClassCastException,转移到编译时期,方便解决问题,让运行时期问题减少,安全。
避免强制转换
泛型通常使用在集合框架中。
泛型类,当类中要操作的引用数据类型不确定的时候,早期定义Object来完成扩展,现在定义泛型来扩展。泛型类定义的泛型在整个类中有效。
泛型方法,让不同方法可以操作不同类型,而起类型还不确定。
静态方法不可以访问类上定义的泛型。如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上。
泛型定义在接口上
泛型限定
---------------------- android培训、java培训、期待与您交流!
----------------------详细请查看:http://edu.youkuaiyun.com/heima