今天听java课程感觉难度突然增加,因此注意上课记录关键笔记,提醒自己回顾。
JAVA 子类与继承
子类与父类
问题:哪些父类的变量与方法可被子类继承?与访问权限有关
前提知识:java中一个子类只可以继承一个父类。
-
private变量/方法:子类不可继承
-
友好型(默认的)变量/方法:同package里的子类可以继承
-
protected/public:子类均可继承
以包的角度来看:
-
子类、父类在同一个包中:子类可以继承除了private以外的所有成员变量/方法。(如果子类中定义的实例方法访问不了父类变量/方法,则说明没继承过来)
-
子类、父类不在同一个包中:子类可以继承父类public、protected的变量、方法。友好和private都不行。
对protected的说明:一个类A的protected成员变量和方法都可被子类和孙类C继承。但是访问呢?对于孙类C在自己方法内创建的对象,可以访问变量和方法。但是对于另外一个类other里创建的该孙类对象,想过通过孙类C访问C的protected变量和方法,则必须和C在同一个包;要是other类的对象创建孙对象C,想访问A的变量和方法,则必须要求其和A在同一个包里!
instanceof运算符
instanceof是双目运算符”是实例吗?“,左操作数是对象,右操作数是类。如果左边的对象是右边的类或该类的子类创建的对象,返回true。
子类对象特点
当创建子类对象时,子类的成员变量都会被分配内存,同时其父类的所有成员变量也都被分配内存空间,但是只有被继承的那一部分被分配给子类对象作为其变量。没有被继承的父类变量在内存中仍然有空间,这包括父类中的private、不与子类在一个包里的父类的protected变量。
那么这些没有被继承的变量,怎么被子类访问呢?通过调用继承过来的父类的特定方法去操作这些变量。
成员变量的隐藏与方法重写
变量隐藏:
如果子类声明了和继承来的变量同名的对象(类型可以不同),则子类就会隐藏掉被继承的这个父类变量,以后通过.操作该变量,都是在操作自己声明的子类同名变量。不过,仍然可以通过调用父类的特定方法去操作这些变量。
方法重写:
子类若从父类继承了一个方法,则子类可以使用相同的方法名、参数列表、返回值,来重写这个方法,此时原来父类继承来的方法被隐藏了。
注意:
- JDK1.5之后,重写方法时参数可以不一样,而可以是原来方法参数的子类。
- 重写方法时,不可以缩小权限。如可以把protected重写成public,但不可以写private/友好
重写的目的:子类如果不想沿用父类的行为,就可定义自己的。
多态
当父类的某个实例方法被多个子类各自重写时,可以各自产生自己独特的行为。
super关键字
被子类隐藏的父类变量、重写的父类方法,都不再归属于子类实例化的对象,而是归属于super.
因此,子类可以通过super.访问被隐藏/重写的变量和方法:
super与子类构造方法
子类的构造必须调用父类的构造方法:
- 使用super()调用父类构造方法
- 使用this()调用本类中另外的构造方法,其中包含父类构造
- 若没有做到,系统自动调用无参构造
final关键字
- final类:不允许被继承的类。例如JAVA的String类对于编译器和解释器很重要,因此用final修饰。
- final方法:这是最终版本的方法,不允许子类重写该方法。
- final常量:被修饰的量是常量,不允许被修改。
对象的上转型对象
若A是B的父类,我们声明了一个父类对象a,用子类的构造方法实例化该对象a,用子类的构造方法再实例化一个子类对象b,则a是b的上转型对象。具有如下特点:
- a不可操作b新增的成员变量和方法。
- a可以操作、调用b继承的变量和方法,以及b隐藏变量和重写的方法。也就是说,若子类重写了父类某个实例方法,则a调用的是子类重写的方法,而不是父类的原方法,这也是上转型对象与父类对象的区别