Java编程基础(七)
接口
理解:特殊的接口类,接口中只能有静态常量(使用static或final修饰的属性)和抽象方法
[public] interface<接口名>{
[<常量>]
[<抽象方法>]
}
接口具备三个特征:public、static、final
应用场景:定义标准
注意:JDK1.8的新特性–接口中可以有静态方法和默认方法,实现时仅需要使用default关键字来定义。
深入接口
类–接口的关系:
类与类:单继承(一个类只能有一个父类)
类与接口:多实现(一个类可以实现多个接口)
接口与接口:多继承(一个接口可以继承多个接口)
多态
多态分为两大类:特定的、通用的;四小类:强制的、重载的、参数的、包含的
OCP - 开闭原则
O - open - 在需求升级时,对于创建类是欢迎的
C - close - 在需求升级时,对于修改原有的类是拒绝的
P - principle - 原则
内部内
内部类:一个类中还有另一个类
A类的对象只在B类中使用,并且A类使用到了B类所有的成员属性,就可以将A类变作为B类的成员内部类
A类的对象只在B类中使用,并且A类使用到了B类的静态属性,就可以将A类变作为B类的静态内部类
分类
成员内部类:类似于成员变量;重点:成员内部类可以调用外部类的所有属性
静态内部类:类似与静态变量;重点:静态内部类不可以调用外部类的成员属性,只能调用外部类的静态属性
接口内部类:类似于静态内部类;重点:接口内部类中可以调用接口的静态常量
局部内部类:类似于局部变量
重点:
1、不能使用访问修饰符修饰局部内部类
2、局部内部类调用外部类方法中的局部变量,在JDK1.8开始该变量会自动使用final修饰,变成常量(原因:内部类对象可能被传送到外界,该方法结束后,i作为常量存储咋常量池中,保证了内部类对象在外界正常使用到常量i)
匿名内部类:抽象类的子类对象只使用一次,就可以使用匿名内部类
接口的实现类对象只使用一次,就可以使用匿名内部类
对象转型
1、向上转型;子类类型转父类类型
可以调用父类的非私有化成员变量
可以调用父类的非私有化成员方法
可以调用子类重写父类的成员方法
扩展:向上转型其实就是多态
多态的优点:符合OCP原则的开发,需求更改时,项目的可维护性高
多态的缺点:不能调用子类独有的成员变量和成员方法
2、向下转型:父类类型转子类类型
注意:向下转型是不安全的
向上转型后,才能向下转型;向下转型一定要用instanceof判断,否则可能会有类型转型异常的风险
包装类
含义:Java为每种基本数据类型封装的类
出现原因:Java为纯面向对象语言,但是8种基本数据类型不能创建对象,那么就破坏了Java为纯面向对象语言的特征,所以Java又为每种基本数据类型封装了对应的类,这种类叫做封装类/包装类
StringBuffer
StringBuffer代表可变的字符序列
StringBuffer称为字符串缓冲区
工作原理:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列
StringBuilder
StringBuilder代表可变的字符序列。
StringBuilder称为字符串缓冲区
它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。
StringBuilder vs StringBuffer
共同点:StringBuilder和StringBuffer都是继承AbstractStringBuilder,所有使用的功能都是调用的父类里的方法,所以这两个类使用上都是一模一样的
StringBuilder:线程不安全的(没有上锁、解锁的过程),单线程的情况下使用
StringBuffer:线程安全的(上锁、解锁的过程),多线程的情况下使用,比起StringBuilder,效率低
深入String创建对象
频繁的字符串拼接请使用StringBuilder或StringBuffer