Java基础-抽象和接口
一、抽象类和抽象方法:
1、abstract关键字的使用
(1)abstract:抽象的
(2)abstract可以用来修饰的结构:类、方法
a、abstract修饰类:抽象类
》此类不能是实例化
〉抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
》开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
b、abstract修饰方法:抽象方法
》抽象方法只有方法的声明,没有方法体
〉包含抽象方法的类一定是抽象类;反之,抽象类中可以没有抽象方法
》若子类重写了父类中的所有抽象方法(直接父类和间接父类)后,此子类方可实例化;若子类没有重写父类中的所有抽象方法后,次子类也是一个抽象类,子类需要使用abstract修饰
如下,继承中,可以重写抽象方法中的方法,加上方法体;也可以在抽象类前面加上abstract,这两个方式来继承抽象方法.
2、抽象的应用场景
抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类:父类提供抽象方法,子类可以显示的去继承,重写抽象方法
3、abstract使用中的注意点
(1)abstract不能用来修饰:属性、构造器等结构
(2)abstract不能用来修饰私有方法、静态方法、final的方法、final的类
4、创建抽象类的匿名子类对象
二、接口:interface
1、接口的使用
(1)接口使用interface来定义
(2)java中,接口和类是并列的两个结构
(3)如何定义接口:定义接口中的成员
(3.1)JDK7及以前:只能定义全局敞亮和抽象方法
》全局常量:public static final的,但是书写时可以省略不写
〉抽象方法:public abstract的
(3.2)JDK8及以后:除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法(略)
(3.3)接口中不能定义构造器,意味着接口不可以实例化
(3.4)java开发中,接口都是通过类去实现(implement)的方式来使用
如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
如果实现类没有覆盖接口中的所有抽象方法,则此实现类仍然是一个抽象类
2、接口的多实现和接口的继承性:
(1)可以实现多个接口弥补了java单继承的局限性
格式:class AA extends BB implements CC,DD,EE
(2)接口和接口之间叫做继承,并且可以多继承
接口和类之间叫实现关系;类和类之间叫做继承关系
(3)接口的具体使用,体现多态性
(4)接口实际上可以看做是一种规范
eg:USB体现了一种规范;如下也体现了接口使用上的多态性
eg2:
面向接口编程
(5)、 创建接口匿名实现类的对象
3、接口的应用
(1)代理模式:
eg:
4、java8中接口的新特性
除了定义全局常量和抽象方法外,还可以定义静态方法、默认方法(略)
(1)接口中定义的静态方法,只能通过接口来调用
(2)通过实现类的对象可以调用接口中的静态方法 ;如果实现类重写了接口的默认方法,调用时,仍然调用的是重写以后的方法
eg:
eg2:接口类中定义了method3,实现一个父类,也定义了method3,现在让其继承于父类的同时去实现接口
(3)结论:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法.---》类优先原则
结果:
(4)如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,会报错,这叫做接口冲突;那么就需要在实现类中重写此方法
eg:新增一个文件,下面没有父类,但是有多个接口,下面会报错
解决报错:在实现类中重写此方法
如果有父类也不会报错
(5)如何在子类(实现类)的方法中调用父类、接口中被重写的方法
5、内部类的分类
(1)、java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
(2)、内部类的分类:成员内部类(直接在类内定义一个类) VS 局部内部类(方法类,代码块内,构造器内)
(3)成员内部类:
一方面,作为外部类的成员
》调用外部内的结构
〉可以被static修饰
》可以被四种不同的权限修饰(private,protect,default,public)
另一方面,作为一个类
》类内可以定义属性、方法、构造器
〉可以用final修饰,表示此类不可被继承,言外之意,不使用final就可以被继承
》可以被abstract修饰
(4)关注一下3个问题
a、如何实例化成员内部类的对象
eg:在上面截图代码的基础上:
b、如何在成员内部类中区分调用外部类的结构
c、 开发中局部内部类的使用
方式二:匿名内部类 :创建接口匿名实现类的匿名对象
(5)局部内部类使用注意点(安卓开发需要特别注意):
a、局部内部类的方法(show())中,如果调用局部内部类所声明的方法(method())中的局部变量的话,要求此局部变量声明为final的.(在jdk8以上,默认加上了final,jdk7下会报错)