学习Java已经很久了,记录一些继承中模糊不清的问题。
一、方法重写问题
重写一个方法,只能改写方法的方法体,所以不会形成方法的重载,而是会直接覆盖掉从父类中继承而来的方法(这个方法已经存在于子类中)。
二、类型转换问题
- 当用父类创建子类对象的时候就已经用到了类的转换,这时是将Cat类和Dog类的对象赋给父类Animal,这时是向上转型,向上转型会自动完成
- 由于an1、an2这样的对象只能调用子类中重写父类的方法,不能调用子类中特有的方法,所以要对这两个对象进行转换。这时的转换是将父类的对象转换成子类的,这时称为向下转型,需要强制转换。
- instanceof关键字:用instanceof关键字可以判断一个对象是否属于某一个类或接口,语法如下:对象名 instanceof 类名(接口名) 如果属于,那么这整个的表达式为真,如果不属于,那么这整个的表达式为假。
三、private问题
继承会复制父类除构造方法的所有成员,包括private修饰的成员。
以private修饰的属性为例,方法也是一样。
子类从父类中继承了private修饰的一个属性,这个属性是存在于子类中的,但是如果在子类中编写一个方法去访问这个继承而来的变量就会编译出错。
这段代码站在程序的角度来说是没有问题的,这不过是编译器不允许这样做而已。
我们可以通过子类对象调用从父类继承而来的方法(show方法)来访问这个变量。show方法与这个变量均存在于子类中。
四、构造方法问题
- 首先构造方法不能被继承。
- 在创建子类的对象的过程中必须调用父类的构造方法,在子类的构造方法中即使不写也会默认存在一个super()。
- 调用父类的构造方法
※ 如果没有显示的调用基类的哪一个构造方法,则默认调用父类无参的构造方法(默认存super())。
※ 可以在子类构造方法的第一行用super关键字指明调用父类的哪一个构造方法。
※ 如果没有用super指明调用哪一个构造方法父类又没有无参的构造方法则编译出错。