第五章——子类与继承
不必从头再来
一、知识结构框架
字打错了,不是第三章是第五章——java子类与基础
二、知识点详解
1、子类的继承性
class 子类名 extends 父类名{}
子类的成员中有一部分是自己定义的,有一部分是从父类继承的。
若子类与父类在一个包中,则子类自然地继承父类非private的成员变量或方法。
若子类与父类不再同一个包中,父类的private和友好访问权限的变量不会被子类继承,子类只能继承父类protected和public访问权限的成员变量作为子类的成员变量。
2、子类的对象
boolean isInstanceof = 中国人 instanceof 人类;
//当instanceof左面的操作元是右面的类或者右面的子类创建的对象时,返回true
当用子类创建一个对象时,不仅子类中声明的成员变量被分配了内存,而且父类中的成员变量也都分配了内存空间。但只有被继承的那部分变量分配给了子类。
3、成员变量的隐藏和方法的重写
变量隐藏:
当子类所声明的成员变量的名字与父类成员变量的名字相同时,子类会隐藏所继承的成员变量。子类自己定义的方法操作同名成员变量,该成员变量是重新声明的变量。子类调用父类继承的方法中调用的同名成员变量是隐藏的从父类继承的成员变量。
方法重写:
规则:子类定义一个方法,该方法的类型与父类方法的类型一致,并且这个方法的名字、参数个数、参数类型和父类的方法完全相同,该方法就叫子类重写的方法。重写父类的方法时不能降低方法的访问权限(public>protected>友好的>private)。
目的:方法的重写会隐藏继承的方法,子类调用同名方法,该方法为重写的方法。若子类未重写父类的某个方法,那这个方法也可以被子类的对象调用,但是调用的是其父类的方法。
4、super关键字
用super操作被隐藏的成员变量和方法
通过super.成员变量或方法可以调用被隐藏的父类成员变量或方法。
使用super调用父类的构造方法
当用子类的构造方法创建一个子类的对象时,子类的构造方法总是先调用父类的构造方法。由于子类不继承父类的构造方法,因此子类在其构造方法中需要使用super来调用其父类的构造方法。当子类没有明显写出super调用父类的某个构造方法时,会默认在子类构造方法中加入super();所有当父类有多个构造器时,应当含有一个无参构造器,避免子类省略super();时产生调用错误。
5、final关键字
final修饰的成员变量或局部变量为常量不能被修改,如果父类的方法被final修饰,则不允许被子类重写,只能继承(如同不能坏了老祖宗传下来的规矩)。如果类被final修饰,则该类不能被继承。
6、对象的上转型对象
父类声明,子类创建的对象为上转型对象。例如People xiaoming = new Chinese(),对象的上转型对象的实体由子类创建,但是该对象会失去原对象的部分属性与功能,相当于子类对象进行了简化。即小明是人类,简化省去了小明是中国人的特征。
所以上转型对象不能操作子类新增的成员变量,即谁声明听谁的话。上转型对象可以访问子类继承或隐藏的成员变量,也可以调用子类继承的方法或子类重写的实例方法,即简化了全新的,保留了改进的。
不能给父类创建的对象赋值给子类声明的对象,即父亲不能听儿子的。可以将对象的上转型对象强制转换到一个子类对象,就恢复原来的属性和方法。如果子类重写了父类的静态方法,那子类对象的上转型对象不能调用子类重写的静态方法,只能调用父类的静态方法。
7、继承和多态
多态性:父类的某个方法被子类重写时,可以产生自己的功能和行为。
8、abstract类和abstract方法
抽象类:用abstract修饰的类
抽象方法:用abstract修饰的方法
抽象方法只能声明,不能有方法体。且不允许使用final和abstract同时修饰一个方法或类。不允许用static修饰abstract方法。
抽象类中可以有抽象方法,抽象类只能被继承不能创建对象。继承抽象类的子类必须重写父类的抽象方法(去掉abstract修饰),而final方法不能被继承,所以抽象类中的抽象方法不能被final修饰。如果抽象类继承抽象类则可以继承父类的抽象方法,也可以重写父类的abstract方法。
抽象类虽然不能创建对象(new),但可以声明对象。作为上转型对象。
9、开闭原则
对扩展开发,对修改关闭。
三、题库考查知识点整理
1、子类继承的方法只能操作子类继承和隐藏的成员变量。
2、不可以同时用final和abstract修饰同一个方法。
3、不允许使用static修饰abstract方法。
4、所谓子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己定义的任何实例方法操作。
5、如果在子类中想使用被子类隐藏的成员变量或方法就需要使用关键字super。
6、子类不继承父类的构造方法。
7、 如果在子类的构造方法中,没有显示地写出super关键字来调用父类的某个构造方法,那么编译器默认地有:super();调用父类的无参数的构造方法(如果父类没有这样的构造方法,代码将出现编译错误).
8、在子类的构造方法中显示地写出super时,super关键字形成的语句必须是子类构造方法的第1条语句。
9、如果一个类中有abstract方法,这个类必须是abstract类。
10、代码无法通过编译。(原因是,父类People已经没有了不带参数的构造方法,而子类Student构造方法默认调用People类的不带参数的构造方法)。
11、子类重写父类的方法时,不允许降低方法的访问权限,但可以提高访问权限。
12、如果子类是abstract类,允许子类将父类的非abstract方法重写为abstract方法。
13、如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的抽象方法,即给出方法体(将abstract方法重写为非abstract方法)。
14、abstract子类也要继承abstrat父类的abstract方法 。
15、类中的类方法(static方法)只能操作类变量(static变量),不可以操作实例变量。
16、编译器不提示程序使用了空对象(让一个空对象去调用实例方法),但程序在运行时会出现NullPointerException异常。
17、子类对象的上转型对象操作子类继承的方法或子类重写的实例方法,其作用等价于子类对象去调用这些方法。
18、super关键字形成的语句不一定是子类构造方法中的第1条语句。显示的写出才作为第一句。不写则无。
19、abstract类可以没有abstract方法。
20、abstract方法的abstract关键字,必须放在方法的类型的前面,不可以插在方法类型和方法名字之间。
21、子类重写或新增的方法也能直接操作被子类隐藏的成员变量。
22、如果子类可以继承父类的某个方法,那么子类就有权利重写这个方法。
23、类所声明的变量被称为对象,对象(变量)负责存放引用,以确保对象可以操作分配给该对象的变量以及调用类中的方法。分配给对象的变量被习惯地称做对象的实体。
24、写的话,super关键字形成的语句必须是子类构造方法中的第1条语句。
25、子类声明的成员的变量的名字和从父类继承来的成员变量的名字相同,子类就会隐藏掉所继承的成员变量。方法的修饰(如果有),例如public,abstract,必须放在方法的类型的前面,不可以插在方法类型和方法名字之间。
26、java.lang包中的Object类是所有其他类的祖先类。
类声明的成员的变量的名字和从父类继承来的成员变量的名字相同,子类就会隐藏掉所继承的成员变量。方法的修饰(如果有),例如public,abstract,必须放在方法的类型的前面,不可以插在方法类型和方法名字之间。
26、java.lang包中的Object类是所有其他类的祖先类。