第五周

接口

接口的定义

  • 接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似
  • 使用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

  • 集合工具类,定义了除了存取以外的集合常用方法