接口
接口,是Java语言中一种引用类型,是方法的集合,如果说类的内部封装了成员变量、构造方法和成员方法,那么 接口的内部主要就是封装了方法,包含抽象方法(JDK 7及以前),默认方法和静态方法(JDK 8),私有方法 (JDK 9)。 接口的定义,它与定义类方式相似,但是使用 interface 关键字。它也会被编译成.class文件,但一定要明确它并 不是类,而是另外一种引用数据类型。
- 引用数据类型:数组,类,接口。
接口的使用,它不能创建对象,但是可以被实现( implements ,类似于被继承)。一个实现接口的类(可以看做 是接口的子类),需要实现接口中所有的抽象方法,创建该类对象,就可以调用方法了,否则它必须是一个抽象 类。
- 含有抽象方法 抽象方法:使用 abstract 关键字修饰,可以省略,没有方法体。该方法供子类实现使用。
public interface InterFaceName {
public abstract void method();
}
- 含有默认方法和静态方法 默认方法:使用 default 修饰,不可省略,供子类调用或者子类重写。 静态方法:使用 static 修饰,供接口直接调用。
public interface InterFaceName {
public default void method() {
// 执行语句
}
public static void method2() {
// 执行语句
}
}
- 含有私有方法和私有静态方法 私有方法:使用 private 修饰,供接口中的默认方法或者静态方法调用。
public interface InterFaceName {
private void method() {
// 执行语句
}
}
抽象方法的使用 :必须全部实现 默认方法的使用 :可以继承,可以重写,二选一,但是只能通过实现类的对象来调用。 静态方法的使用 :静态与.class 文件相关,只能使用接口名调用,不可以通过实现类的类名或者实现类的对象调用 私有方法的使用 :
-
私有方法:只有默认方法可以调用。
-
私有静态方法:默认方法和静态方法可以调用。
如果一个接口中有多个默认方法,并且方法中有重复的内容,那么可以抽取出来,封装到私有方法中,供默认方法 去调用。从设计的角度讲,私有的方法是对默认方法和静态方法的辅助。
多态
多态是继封装、继承之后,面向对象的第三大特性。 生活中,比如跑的动作,小猫、小狗和大象,跑起来是不一样的。再比如飞的动作,昆虫、鸟类和飞机,飞起来也 是不一样的。可见,同一行为,通过不同的事物,可以体现出来的不同的形态。多态,描述的就是这样的状态。
- 多态: 是指同一行为,具有多个不同表现形式。
前提【重点】
- 继承或者实现【二选一】
- 方法的重写【意义体现:不重写,无意义】
- 父类引用指向子类对象【格式体现】
多态的好处
实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展 性与便利。所以,多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展。
引用类型转换
多态的转型分为向上转型与向下转型两种:
- 向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。 当父类引用指向一个子类对象时,便是向上转型。
//Test10 Test11 Test12
//方法的多态性
// |~方法的重载:同一个方法名称可以根据参数的类型及个数的不同调用不同的方法体
// |~方法的覆写:同一个父类的方法,可能根据实例化的子类不同也有不同的实现
//对象的多态性(前提:方法覆写):
// 【自动】|~对象的向上转型:父类 父类对象 = 子类实例;
// 【强制】|~对象的向下转型:子类 子类对象 = (子类)父类实例;
class A {
public void print(){
System.out.println("【A】public void print(){}");
}
}
class B extends A {
public void print() {
System.out.println("【B】public void print(){}");
}
public void funB(){//这个方法只有子类有
System.out.println("【B】public void funB(){}");
}
}
public class Day10 {
public static void main(String[] args) {
A a = new B();//实例化子类对象
System.out.println(a instanceof A);//instanceof判断
System.out.println(a instanceof B);//避免了ClassCastException问题
a.print();//调用被覆写过的方法
if (a instanceof B){
B b = (B)a;//向下转型
b.funB();//并不是所有的父类都能向下转型,
}
// 向上转型之后才能向下转型,例如:
// A a = new A();
// B b = (B)a;
// 报错:ClassCastException
}
}