面向对象编程(oop)都有三大基本特征:封装,继承,多态。
封装是为了保证代码的隐蔽性,比如private的权限是私有的,只有在类的内部才能看到其构成。而继承和多态则起到不同的作用。
继承:
继承是为了提高代码的复用性。一般我们这么用extens来定义:子类 extens 父类。
继承:当类和类之间是is-a关系的时候,两者之间就存在继承关系。
子类继承父类中的所有属性和方法,有显示继承和隐继承,其中private权限的成员属性和成员方法,但是不能直接使用其方法和访问其成员属性。因为父类的属性是私有的,需要通过特定的方法进行使用和访问,这就是隐继承。而显示继承是父类的属性和方法可以随意使用,没有限制。
我们使用super关键字来访问父类的属性和方法,super关键字代表了父类对象的引用。
如果要产生子类的对象,我们默认先要产生父类,比如我们new一个子类对象,调用了子类的构造方法,那我们必须先调用父类的构造方法,先要产生父类,才能产生子类。如果父类不存在无参构造,则子类构造方法首行必须使用super(有参)这种形式来定义一个构造方法。
多态:
让一种引用产生不同的行为/特性。我们把这种称为多态性。
多态有两种表现形式,向上转型和向下转型。
向上转型:一般发生在有继承关系的类之间,不一定是直接子类,也可以是间接子类。
我们一般这么定义:父类名称 父类引用=new 子类实例。
向上转型的意义在于可以让参数统一化,降低操作者的使用难度。
既然存在继承关系,那子类就继承父类的方法,那如果子类也有跟父类相同方法名,参数列表和返回值相同的方法,这时候我们就需要进行方法重写。
什么是方法重写,方法重写发生在继承中,子类和父类存在相同的方法,这个相同表示,除了权限不相同,方法名,返回值,参数列表完全相同的一组方法。
我们使用向上转型的时候,我们调用子类实例的方法,如果子类进行了方法重写,那么这时候我们会调用的是子类的方法,而不是调用继承的父类方法。但是如果子类中没有跟父类一样的方法,那我们调用这个方法时,则调用的是父类的方法。
但是我们的向上转型也有一个缺点,那就是子类拥有一个父类没有的方法,这时候我们进行向上转型之后,实例化的对象不可以调用其子类独有的方法。这时候如果你想调用这个子类独有的方法,你需要进行向下转型。
我们一般这么定义向下转型:子类引用=(子类名称)父类引用。
这时候我们需要对父类引用进行强制转换,我们之前了解过Java基本类型转换,这也类似,小类型变成大类型自动提升,大类型转化成小类型就需要强转。
这样子我们就通过向下转型调用其子类独有的方法。