1.多态
多态:在继承/实现下的一种体现 ,表现为对象多态、行为多态。(对象的向上转型)
多态的前提:有继承/实现关系;存在父类引用子类;存在方法重写
多态的弊端:无法使用子类型独有的方法,仅仅可以使用重写了的父类方法
解决方法:如果想要使用子类的独有功能,需要强转,为了避免报错用instanceof关键字来得到当前类型的真实类型
存在继承/实现关系可以在编译阶段进行强制类型转换,编译阶段不会报错,运行时会报错
2.final
类: 不能被继承的类
方法:不能被子类重写的方法
变量: 只能被赋值一次的变量
static final 变量:也被称为常量
3.抽象
abstract: 一种修饰符,用于修饰类和方法 ,这里不谈修饰成员变量
抽象类:
抽象类是一种结构完全的类(和接口区分开来,接口只有常量和抽象最终方法)
抽象类中有 成员变量,成员方法,构造器,代码块。
抽象类不能创建对象
抽象方法:抽象方法只有方法声明(修饰符 返回值),没有方法体({...})
使用抽象类的好处以及注意点
抽象类是一种天生的父类。是用于被子类继承的。
子类如果继承了父类是抽象类,抽象类中的抽象方法必须重写,否则该子类也是抽象类
有抽象方法的一定是抽象类,但抽象类不一定有抽象方法
设计模式-模板方法
解决的问题:解决方法中存在重复代码的问题
怎么写:定义一个抽象类,在里面定义两个方法
1.一个是模板方法,将代码重复的地方放入。(通常会设计为final方法,不允许子类修改)
2.一个是抽象方法,将代码不同的地方 也就是子类需要实现的地方放入。
4.接口
关键字:interface
特点:和抽象类类似,不能创建对象;接口时用来被实现的,实现接口的类成为实现类;接口没有构造方法
接口的构成:
jdk8以前,只能由常量+抽象方法构成(并且其中常量与方法默认有修饰符修饰 public static final 变量 ,public abstract 返回值类型 方法名)
jdk8以后 接口内可以有三种方法:默认方法,静态方法,私有方法
注意:一个类可以实现多个接口,当实现类多个接口。必须重写完全部接口的全部抽象方法,否则就称该类为抽象类并且接口可以多继承 ,接口可以继承多个接口
接口的好处
弥补了类单继承的不足,一个类同时可以实现多个接口 。
接口的注意点
接口可以多继承:可以将多个功能整合在一个接口中,便于类去实现
如果一个类同时继承一个父类,实现一个接口,继承要写在实现的前面。
接口与继承
当一个类实现多接口时,其中同名的方法实现类必须重写。
当一个类又继承父类,又实现接口时,其中同名的方法调用时,调用的是父类的方法。
1.多态的细节:
1)运行时多态和编译时多态的区别
运行时多态:动态绑定 - 方法重写 ,在运行时才能确定调用方法
编译时多态:静态绑定 - 方法重载 ,在编译之前就可以确定调用的方法
2)重载与重写
重载与重写都是多态的体现,重载发生在一个类中,重写发生在子类中,但是对于每个语言来说又是不同的,没有严格的定义。
多态:
方法重载实现的是编译时的多态性(前绑定)
方法重写实现的是运行时的多态性(后绑定)。运行时的多态时面向对象的精髓
实现多态:
方法重写(子类继承父类并重写父类中已有的或抽象方法)
对象造型(用父类型引用指向子类型对象,这样同样的引用调用同样的方法就会根据指向的对象不同 表现出不同的行为)
重载:
发生在同一个类中的多个同名方法中
参数的数据类型或参数的个数、顺序不同
访问修饰符、返回值、抛异常不会影响重载
目的:节省类中的命名资源,提高代码的可读性
重写:
发生在有继承关系的父类和子类中
重写方法的声明要和父类保持一致,访问权限不能小于父类,抛出异常的范围不能大于父类
一般是父类的该方法不满足子类的需求,子类对父类的方法进行重写。
2.接口与抽象类:
实现接口的子类 不能调用super()方法? -- 因为接口没有构造方法
继承抽象类的子了 可以调用super() 方法 -- 因为抽象类是一种特殊的类,有构造方法