多态: 一种事物的多种形态
例如:
H2O
冰,雪
水,雾,雨
水蒸气
动物
鸟
鱼
兽
猫
狗
多态的前提:
1.类与类有继承关系
2.方法重写
3.父类引用指向子类对象
多态成员的运行特点
1.成员变量
编译看左边,运行看左边
2.成员方法
编译看左边,运行看右边(子类)
3.静态方法
编译看左边,运行看左边(静态方法,是跟这类走的)
4.构造方法
编译看左边,运行看左边(没有重写,涉及不到多态)
转型的问题:
向上转型:
默认,从子类-->父类
父类引用指向子类对象
向下转型
强制,从父类-->子类
格式:
子类 变量名 = (子类类型)父类 变量名;
IronMan im = (IronMan) p;
( 参考基本数据类型强转 byte b = (byte)300))
好处: 转型之前,父类 p 并不能使用子类的特有功能
转型之后,父类就可以使用子类的功能.
抽象类:你没有办法具体描述的类,比如 动物,水果 ,工具 ,蔬菜 , 情感....
修饰类和方法
格式:
类: abstract class 类名 { }
方法: public abstract void eat();
注意:抽象方法是没有方法体
抽象类中可以没有抽象方法 ,但是如果有抽象方法,那么此类必然为抽象类
eat(){
syso
}
特点:
1.抽象类中,有构造方法,但是不能直接new,所以构造方法是抽象类的子类用的
2.实例化只能实例它的子类,那么就使用到多态
3.子类的要求:
1.抽象子类才能继承 抽象类
2.子类想要继承抽象,必须重写抽象类中所有的抽象方法
成员特点:
1.成员变量: 变量 , 常量
2.构造方法: 有,但是抽象类用不到
3.成员方法: 抽象 ,非抽象
成员方法的特征:
1.抽象方法:子类必须重写
2.非抽象: 子类直接用
abstract 不能和哪些关键字共存?
private 冲突 -- 对子类隐藏,而 abstract 必须让子类重写
final 冲突 -- 不能被重写,矛盾
static 无意义-- 类名调用,没有方法体,无意义
接口: 本质就是一种规则
作用: 就是扩展类功能
格式:
interface 接口名{}
相当于定义了规则
*接口中可以写方法,但是必须是抽象的.
使用:
class 类名 implements 接口名{}
相当于给类扩展了接口的功能,需要重写接口的所有抽象方法
注意:
1.接口是不能实例化
创建实现了接口的类的对象,该对象也叫做这个接口的子类
2.类可以实现多个接口
抽象类 接口
成员变量 常量 和变量 常量(public static final)
构造方法 有 没有
成员方法 抽象 非抽象 抽象(public abstract)
类与类 :继承
单继承
多层继承
问题:为什么不能多继承,多个类中有重名方法?
A {
show(){ a}
}
B {
show(){ b}
}
类和接口:实现
单实现
多实现
问题:为什么多实现? 如果多个接口中,有重名方法怎么办?
没关系 , 接口中方法都是抽象的.
接口和接口
继承 ,而且多继承
interface A extends interface B {
}
class C implements A{
实现 A 和 B 所有抽象方法
}
C:设计理念区别
抽象类
被继承体现的是:"is a"的关系。 抽象类中定义的是该继承体系的共性功能。
接口
被实现体现的是:"like a"的关系。天马像马,小飞象像大象.
接口中定义的是该继承体系的扩展功能。 :