多态:
前提: 有继承(继承普通的类,或者继承抽象类)关系(或者实现的关系)
有方法的重写
我们在使用多态的时候 就是为了使用 让父类的引用来调用子类重写的方法
如果没有方法的重写就没有意义了 也就不叫多态了
有父类的引用指向子类对象
多态中成员变量的使用:
编译看左边 运行也看左边
多态中成员方法的使用:
编译看左边 运行看右边
多态中静态成员的使用:
编译看左边 运行也看左边
在多态的时候 父类的引用除了子类重写的方法是调用的子类的之外 其他的都是调用的父类的
如果父类没有 编译就报错
多态的利弊
好处:提高了代码的扩展性和维护性
一般把父类的引用当做形式参数来用(开发中都这样用 接收一个任意的子类对象,方法里面调用子类重写的方法)
坏处:不能使用子类特有的方法和属性
如果非要用?
向下转型和向上转型
如果父类的引用非要用子类特有的东东,把父类的引用强制向下转型为子类
抽象类abstract:
特点:
1)抽象类里面可以没有抽象方法,但是有抽象方法的类必须得是抽象类
2)抽象类不能被实例化
3)普通子类继承抽象类,必须全部重写抽象类里面的抽象方法,要不子类也是抽象类
成员特点
成员变量:抽象类里面可以有变量 也可以有常量, 注意abstract不能修饰变量和常量
构造方法:有 (是为了给子类创建对象的时候初始化父类用的);
成员方法:可以有抽象方法 也可以没有
面试题:
1)一个类中,没有抽象方法,可不可以定义为抽象类呢?可以! 这样的话 是强制要求外界不能创建这个类的对象
2)abstract不能和哪些关键字共存
private:private是不能被继承的,所以不能被重写,而abstract强制要求子类重写,矛盾
final: final表示最终的意思,修饰方法,不能被重写,而abstract强制要求子类重写,矛盾
static: static是为了让所有对象共享,为了让类名调用,来执行一些方法里面的内容的,而abstract修饰方法是抽象的没有方法体,矛盾!
接口interface:对外提供一种规范
1)接口不能是实例化(不能创建接口的对象)
2)接口中的变量 都是常量 前面都有默认修饰符 public static final 永远建议手动给出
3)接口中的方法 都是抽象的 前面都有默认修饰符 public abstract 永远建议手动给出
4)接口中没有构造方法
类与类:类继承类 只能单继承 不能多继承 可以多层继承
类与接口: 实现关系 可以多实现
接口与接口:继承关系 可以多继承 也可以多层继承
问:java中有多继承吗? 有接口与接口之间可以多继承
抽象类和接口的区别:
成员变量:抽象类有变量和常量 而接口只有常量
构造方法:抽象类有构造方法 而接口没有
成员方法:抽象类里面可以有非抽象方法 而接口里面只有抽象方法 |
|