1-4-4 Java面向对象--多态.抽象类,接口
多态
多态分类
1.编译时多态(设计时多态):方法重载.
2.运行时多态:Java运行时系统根据调用该方法的实例的类型来选择用哪个方法称为运行时多态.
我们平时说的多态,多指运行时多态.
必要条件
1.满足集成关系
2.父类引用指向子类对象
向上类型转换:将子类型转换为父类型.
1.隐式/自动类型转换,是小类型到大类型的转换.
2.对于向上的类型转换,不需要显示指定.即不需要加上前面的小括号和父类型名
向下类型转换:将父类型转换为子类型
1.将一个指向子类对象的父类引用赋值给一个子类的引用.
2.强制类型转换,是大类型到小类型.
3.父类型的引用必须指向转型的子类对象面试指向谁才能转换成谁.不然会编译出错.
4.通过instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题,提高代码健壮性.
注意
1.父类引用指向子类实例时,可以调用子类重写父类的方法以及直接继承父类的方法,无法调用子类特有的方法.
2.静态static方法属于特殊情况,静态方法只能继承,不能重写.调用的时候用谁的引用,则调用谁的版本.
抽象类和抽象方法
1 pubic abstract class Animal {}
1 public abstract void eat();
使用规则
1.abstract定义抽象类
2.抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
3.abstract定义抽象方法,不需要具体实现.
4.包含抽象方法的类是抽象类.
5.抽象类中可以没用抽象方法.
6.子类如果没有重写父类所有的抽象方法,也要定义为抽象类.
7.abstract不能与static,final.private共存.
8.抽象方法在子类实现时访问权限必须大于等于父类方法.
接口
语法规则
1.接口及接口成员的默认权限为:public或默认
2.常量默认添加static final 关键字
3.抽象方法默认添加abstract关键字
4.只有default方法及static方法可以添加方法体(java8)
5.实现接口的类如果不能实现所有接口中待重写方法,则必须设置为抽象类
6.接口可以实现多继承,即一个子接口可以同时继承多个父接口
7.一个类可以继承自一个父类,同时实现多个接口
8.当一个类同时实现多接口,且其中同时具有相同方法时,实现类需重写该方法,否则编译会报错
默认方法
public default 返回值类型 方法名 (参数列表) {方法体}
其中,public可以省略,为默认访问修饰符
1.在实现类中需要通过接口引用进行访问
2.可以在实现类中重写与重载,重写时需要去掉default关键字
3.重写方法中,可以通过:接口.super.默认方法的方式调用接口中原有的默认方法
1 public interface INet { 2 default void say(){ 3 System.out.println("aaa"); 4 } 5 }
1 public class Demo implements INet { 2 3 @Override 4 public void say(){ 5 INet.super.say(); 6 } 7 8 public void say(String name){ 9 System.out.println("我是实现类的重载方法,接口引用调用不到"); 10 } 11 12 public static void main(String[] args) { 13 INet in = new Demo(); 14 in.say(); 15 } 16 }
静态方法
public static 返回值类型 方法名 (参数列表) {方法体}
其中,public可以省略,为默认访问修饰符
1.在实现类中需要通过接口名进行访问
2.实现类无法继承(即直接应用)接口中的静态方法
3.实现类无法重写静态方法,可以存在相同格式静态方法,但两者相距独立
1 public interface INet { 2 static void say(){ 3 System.out.println("aaa"); 4 } 5 }
1 public class Demo implements INet { 2 3 public static void say(){ 4 System.out.println("我是Demo类独有的方法,跟INet无关"); 5 } 6 7 public static void main(String[] args) { 8 INet.say(); 9 Demo.say(); 10 } 11 }

浙公网安备 33010602011771号