第五周
接口
接口的定义
-
接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似
-
使用interface关键字定义接口
-
没有构造方法,不能创建对象
-
只能定义:公开静态常量、公开抽象方法
-
例子
interface MyInterface{
public static final String FIELD =“Value”;
public abstract void method();}
-
-
接口一种标准
-
接口是一种标准
接口与类的异同
-
相同:
- 可编译成字节码文件
- 不能创建对象
- 可以作为引用类型
- 具备Object类中所定义的方法
-
不同
- 所有属性都是公开静态常量,隐式使用public static fianl 修饰
- 所有属性都是公开静态常量,隐式使用 public abstract 修饰
- 没有构造方法、动态代码块、静态代码块
接口的应用
-
什么是接口:
-
微观概念:接口是一种能力和约定
- 接口的定义:代表了某种能力
- 方法的定义:能力的具体要求
-
经验:
- java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力
-
接口支持多实现,可为类扩充多种能力
-
-
接口的规范
- 任何类在实现接口,必须实现接口中所有的抽象方法,否则此类为抽象
- 实现接口中的抽象方法时,访问修饰符必须是public
-
接口的引用
-
同父类一样,接口也可声明为引用,并指向实现类对象
-
注意
- 仅可调用接口中所声明的方法,不可调用实现类中独有的方法
- 可强转回实现类本身类型,进行独有方法调用
-
接口的多态
-
例子
public class TestPolymorpfic{
public static void main(String[] args){
Dog myDog = new Dog(); Animal a = myDog; Runnable r =myDog; Swimmable s =myDog;
}
}
interface Runnale{
public absrtact void run();}
interface Swimmable{
public abstract void swim();}
abstract class Animal{
public void eat(){}//父类方法
public void sleep(){}//父类方法}
class Dog extends Animal implements Runnable ,Swimmable{
public void run(){}//接口方法
public void swim(){]//接口方法
public void shout(){} //独有方法}
- 多种类型的引用指向同一个对象时,表示看待对象的视角不同
- 不同引用所能看到的对象范围不同,只能调用自身类型中所声明的部分
-
不同引用类型,仅可调用自身类型中所声明的方法
接口常见关系
-
类与类
- 单继承
- extends 父类名称
-
类与接口
- 多实现
- implement 接口名称1,接口名称2,接口名称n
-
接口与接口
- 多继承
- extends 父接口1,父接口2,父接口n
接口的规范
- 任何类在实现接口时,必须实现接口中所有的抽象方法,否则此类为抽象类
- 实现接口中的抽象方法时,访问修饰符必须是public
常量接口
- 将多个常用于代表状态或固定值的变量,以将静态常量的形式定义在接口中统一管理,提高代码
接口回调
- 先有接口的使用者,后有接口的实现者
- 接口的回调:先有接口的使用者,后有接口的实现者 程序员:工具的调用 工具:接口的使用者 接口:标准 接口的实现者:程序员
接口的好处:
- 程序的耦合度降低
- 更自然的使用多态
- 设计与实现完全分离
- 更容易搭建程序框架
- 更容易更换具体的实现
常用类:
内部类
-
成员内部类
- 在类的内部定义,与实例变量、实例方法同级别的类
- 外部类的一个实例部分。创建内部类对象时,必须依赖外部类对象
- 当外部类、内部类存在重名属性时,会 优先访问内部类属性
- 成员内部类不能定义静态成员
-
静态内部类
- 不依赖外部类对象,可直接创建或通过类名访问,可声明静态成员
- 只能直接访问外部类的静态成员(实例成员需实例化外部类对象) outer.Inner inner = new Outer.Inner() Outer.Inner.show():
-
局部内部类
- 定义在外部类方法中,作用范围和创建对象范围仅限于当前方法
- 局部内部类访问外部类当前方法中的局部变量时,因无法保障变量的生命周期与自身相同,变量必须修饰为final
- 限制类的使用范围
-
匿名内部类
-
没有类名的局部内部类(一切特征都与局部内部类相同)
-
必须继承一个父类或者实现一个接口
-
定义类、实现类、创建对象的语法合并,只能创建一个该类的对象
-
优点:
- 减少代码量
-
缺点
- 可读性较差
-
-
内部类的概念:在一个类的内部再定义一个完整的类
-
内部类的特点
- 编译之后可生成独立的字节码文件
- 内部类可直接访问外部类的私有成员,而不破坏封装
- 可为外部类提供必要的内部功能组件
object类
-
超类、基类,所有类的直接或间接父类,位于继续树的最顶层
-
任何类,如果没有书写extends 显示继承某个类,都默认直接继承Object类,否则为间接继续
-
Object类中所定义的方法,是所有对象都具备的方法
-
Object类型可以存储任何对象
- 作为参数,可接受任何对象
- 作为返回值,可返回任何对象
getClass() 方法
- public fianl Class<?>get Class(){}
- 返回引用中存储的实际对象类型
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
hashCode()方法
- public int hashCode(){}
- 返回该对象的十六进制的哈希码值
- 哈希算法根据对象的地址或字符串或数字计算出来的int类型的数值
- 哈希码并不唯一,可保证相同对象返回相同哈希码,尽量保证不同对象返回不同哈希码
toString()方法
- public String toString(){}
- 返回该对象的字符串表示(表现形式)
- 可以根据程序需求覆盖方法,如:展示对象各个属性值
equals() 方法
- public boolean equals (Object obj){}
- 默认实现为(this==obj),比较两个对象地址是否相同
- 可进行覆盖,比较两个对象的内容是否相同
equals()方法覆盖步骤
- 比较两个引用是否指向同一个对象
- 判断obj 是否为null
- 判断;两个引用指向的实际对象类型是否一致
- 强制类型转换
- 依次比较各个属性值是否相同
finalize()方法
- 当对象被判定为垃圾对象时,由jvn 自动调用此方法,用以标记垃圾对象,进入回收队列
- 垃圾对象 :没有有效引用指向此对象时,为垃圾对象。
- 垃圾回收:由GG销毁垃圾对象,释放数据存储空间
- 自动回收机制:JVM内存耗尽,一次性回收所有垃圾对象
- 手动回收机制:使用System.gc():通知JVM执行垃圾回收
包装类
-
定义:
- 基本数据类型所对应的引用数据类型
-
Object可统一所有数据,包装类的默认值是null
-
基本数据类型
类型转换与装箱、拆箱
-
8种包装类提供不同类型间的转换方式
- Numer父类中 提供的6个共性方法
- parseXXX()静态方法
- valueOf()静态方法
-
注意:需包证类型兼容,否则抛出NumberFornamatException异常
-
JDK 5.0之后,自动装箱、拆箱。基本数据类型和包装类自动转换
整数缓存区
- java预先创建了256个常用的整数包装类型对象
- 在实际应用当中,对已创建的对象进行复用
String类
- 字符串是常量,创建之后不可改变
- 字符串字面值存储在字符串池,可以共享
- String s =“Hello”;产生一个对象,字符串池中存储
- String s = new String (“Hello”) ;// 产生两个对象,堆、池各存储一个
常用方法
- public char charAt(int index):根据下标获取字符
- public boolean contains(Stirng str):判断当前字符串中是否包含str
- public char[] toCharArray():将字符串转换成数组
- public int indexOf(String str):查找str 首次出现的下标,存在,则返回该下标;不存在。则返回-1
- public int lastIndexOf(Stirng str ):查找字符串在当前字符串中最后一次出现的下标索引
- public int length():返回字符串的长度
- public int length():返回字符串的长度
- public String trim():去掉字符串前后的空格
- public String toUpperCase():将小写转成大写
- public boolean endWith(String str):判断字符串是否以str结尾
- public String replace(char oldChar,char newChar):将字符串替换成新字符串
- public String[] split(String str):根据str做拆分
可变字符串
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全
BigDecimal
-
除法:Bigdecimal(BigDecimal bd ,int scal,RoundingMode mode)
-
参数scal :指定精确到小数点后几位
-
参数mode
- 指定小数部分的取舍模式,通常采用四舍五人的模式
- 取值为BigDecimal.ROUND_HALF_UP
常用类
集合
概念:对象容器。存储对象的对象,可代替数组
特点:容器的工具类 ,定义了多个对象进行操作的常用方法
位置: java.util.*
Collection 体系集合
该体系结构的根接口,代表一组对象成为“集合”
-
List
List 接口的特点:有序、有下标、元素可重复
- ArrayList
- LinkedList
- Vector
- 子主题 4
-
Set
Set 接口的特点:无序、无下标‘、元素不能重复
-
hashSet
-
SortedSet
- TreeSet
-
Collection 父接口
-
特点:代表一组任意类型的对象,无序、无下标
-
方法
- boolean add(Object obj)//添加一个对象
- boolean addAll(Collection c)//将一个集合中的所有对象添加到此集合中
- void clear() // 清空此集合中的所有对象
- Boolean contains(Object o)//检查此集合中是否包含o 对象
- boolean equals(Object o)// 比较此集合是否与指定对象相等
- boolean isEmpty()// 判断集合是否为空
- Boolean remove(Object o) //在此集合移除0对象
- int size()// 返回此集合中的元素个数
- Object[] toArray()// 将此集合转换成数组
List集合
-
List子接口
-
特点:有序、有下标、元素可以重复
-
方法
- void add(int index,Object o) //在index位置插入对象
- boolean addAll(int index ,Coolection c) // 将一个集合中的元素添加到此集合中的index位置
- Object get(int index )// 返回集合中指定位置的元素
- List subList(int fromIndex ,int toIndex) // 返回fromIndex和toIndex之间的集合元素
-
-
List实现类
-
ArrayList【重点】
- 数组结构实现,查询快、增删慢
- JDK1.2版本,运行效率快、线程不安全
- 必须开辟连续空间,查询快,增删慢
-
Vector
- 数组结构实现,查询快、增删慢
- JDK1.0版本,运行效率慢、线程安全
-
LinkedList
- 链表结构实现、增删 快、查询慢
- 无需开辟连续空间,查询慢、增删快
-
泛式集合
-
概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致
-
特点
- 编译时即可检查,而非运行时抛出异常
- 访问时, 不必类型转换(拆箱)
- 不同泛型之间引用不能相互赋值,泛型不存在多态
Colletions 工具类
-
概念:集合工具类,定义了除了存取以外的集合常用方法
-
方法
- public static void reverse(List<?> list)//反转集合中元素的顺序
- public static void shuffle(List<?> list )// 随机重置集合元素的顺序
- public static void sort(List list) //升序排序(元素类型必须实现 Comparable接口)
Set 集合
-
Set子接口
- 特点:无序、无下标、元素不可重复
- 方法:全部继承自Collection中的方法
-
Set实现类
-
Hash Set【重点】
- 基于HashCode实现元素不重复
- 当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
-
LinkedHashSet
- 链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序
-
TreeSet
- 基于排序顺序实现元素不重复
- 实现了SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,指定排序规则
- 通过CompareTo 方法确定是否为重复元素
-
Map体系集合
-
hashMap
-
SortedMap
-
map接口的特点
- 用于存储任意键值对(Key - value)
- 键:无序、无下标、不允许重复(唯一)
- 值:无序、无下标、允许重复
-
Map 父接口
-
特点
- 存储一对数据(key-Value),无序、无下标,键不可重复,值可重复
-
方法:
- V put(K key ,V value )// 将对象存入到集合中。关联键值。key 重复覆盖原值
- Object get(Object key)// 根据键获取对应的值
- Set // 返回包含所有值得Collection集合
- Set<Map.Entry<K,V>>// 键值匹配的Set 集合
-
-
Map集合的实现类
-
HashMap【重点】:
- JDK1,2版本,线程不安全,运行效率快;允许用null作为key 或是value
-
Hashtable
- JDK1.0版本,线程安全,运行效率慢;不允许null 作为key 或是value
-
Properties
- Hashtable的子类,要求key 和value都是String 。通常用于配置文件的读取
-
TreeMap
- 实现了SortedMap接口(是Map的子接口),可以对Key 自动排序
-
总结
集合的概念
- 对象的容器,存储对象的对象,定义了对多个对象进行操作的常用方法
List集合
- 有序、有下标、元素可重复。(ArrayList,LinkedList、Vector)
Set集合
- 无序、无下标、元素不可重复。(HashSet、LinkedList、TreeSet)
Map集合
- 存储一对数据,无序、无下标,键不可重复,值可重复。(hashmap、HashTable)
Collections
- 集合工具类,定义了除了存取以外的集合常用方法