java多态
-
即同一个方法可以根据发送对象的不同而采用多种不同的行为方式。
-
一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类、有关系的类)
-
多态存在的条件
- 有继承关系
- 子类重写父类方法
- 父类引用指向子类对象 (子类不能指向父类)
-
注:多态是方法的多态,属性没有多态性
注: 不能重写的
- static方法, 属于类,它不属于实例
- final 常量
- private方法
抽象类
抽象类的作用类似于“模板”,其目的是方便开发人员根据抽象类的格式来修改和创建新类
抽象类主要用于继承,有利于程序的扩展
-
abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果修饰类,那么该类就是抽象类。
-
抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类.
-
抽象类,不能使用new类关键字来创建对象,它是用来让子类继承的.
-
抽象方法;只有方法的声明,没有方法的实现(方法体),它是用来让子类实现的
-
子类继承抽象类,那么就必须要实现抽象类、抽象方法,否则该子类也要声明为抽象类
方法重载
- 方法重载应用于同一个类中
- 构造方法也可以重载
- 方法的返回类型不做为区分方法重载的条件
重载与重写的区别
重载(overload) | 重写(override) |
---|---|
方法的名称相同,参数个数,类型不同 | 方法名称、参数列表和返回类型完全与父类一致 |
方法的访问范围不要求 | 子类中提供的重写方法的范围不能比父类中的小 |
应用在一个类的内部 | 应用于子父类继承关系中 |
接口
- 接口是某个事物对外提供的一些功能的声明
- 可以利用接口实现多态,同时接口也弥补了Java单一继承的弱点
- 使用interface关键字定义接口
- 一般使用接口声明方法或变量,接口中的方法只能是声明,不能是具体的实现
- 一个类如果实现了一个接口,则要实现该接口的所有抽象方法。接口可以继承多个接口,但不能实现(implements)接口
- Java语言中一个类只能继承一个父类,但是一个类可以实现多个接口。随着默认方法在Java 8中的引入,有可能出现一个类继承了多个名称一样的方法。
//定义一个接口
interface IComputer {
public static final boolean flag = true;
public int add(int x,int y);
public int minus(int x,int y);}
}
//建立类实现接口
class Computer implements IComputer { //通过implements实现接口
public int add(int x,int y) {
return x+y;}
public int minus(int x,int y) {
return x-y;}
}
//用接口引用子类对象,访问接口的方法
IComputer icomputer = new Computer();
int total = icomputer.add(90,10);
1.8前使用接口
- 接口允许多继承
- 接口没有构造方法
- 接口中的属性默认是用public static final修饰的
- 接口中的方法默认是用public abstract修饰的
- 接口继承接口用 extends,不能 implement
1.8后使用接口
- 接口中的成员:成员变量、抽象方法、默认方法、静态方法
- 静态方法由static修饰符修饰,通过接口名.方法名()调用
1.8接口默认方法
-
默认方法:
- 一个接口中可以有多个默认方法,默认方法使用 default 关键字定义。
-
默认方法不是抽象方法,子类实现接口的时候,可以直接调用接口中的默认方法。
-
为什么要有默认方法
- 在Java 8之前,接口与其实现类之间的耦合度太高,当需要为一个接口添加方法时,所有的实现类都必须随之修改。默认方法解决了这个问题,它可以为接口添加新的方法,而不会破坏已有的接口的实现。
方法优先级
规则一:类中的方法优先级最高,类或父类中声明的方法的优先级高于任何接口中声明为默认方法的优先级。
规则二:如果第一条无法判断,那么子接口的优先级更高:方法名称相同时,优先选择拥有最具体实现的默认方法的接口, 即如果B继承了A,那么B就比A更加具体。
规则三:如果使用第一、二条还是无法判断,继承了多个接口的类必须通过显式覆盖和调用期望的方法,显式地选择使用哪一个默认方法的实现。
抽象类对比接口
抽象类 | 接口 |
---|---|
抽象类有构造方法 | 接口没有构造方法 |
抽象类不允许多继承 | 接口允许多继承 |
有抽象方法的类一定是抽象类,抽象类不一定有抽象方法 | 1.8 以前接口中的属性是用public、static和final修饰的,接口的方法是用public、abstract修饰的,1.8以后可以有默认方法和静态方法 |
instanceof运算符
- 用于判断运算符前面的引用变量是否是运算符后面的类型,或其子类型的实例
- instanceof 运算符的前一个操作数通常是一个引用类型变量,后一个操作数通常是一个类