2.1 继承
语法 修饰符 SubClass extends SuperClass { //类定义部分 } |
继承(inheritance)通过extends关键字来实现,其中的SubClass称为子类,SuperClass称为父类,基类或超类。修饰符如果是public,则该类在整个项目中课件,若无public修饰符,则该类只在当前包课件,不可以使用private和protected修饰类。
继承是面向对象的三大特性之一,是Java中试下代码重用的重要手段之一。Java中只支持单继承,即每个类只能有一个直接父类。继承表示是is a的关系,或者说是一种特殊和一般的关系,如Dog is a Pet。同样,可以让学生继承人,让苹果继承水果,,让三角形继承几何图形。
在Java中,所有的Java类都直接或间接地继承了Java.lang.Object类。Object类是所有Java类的祖先。在定义一个类时,如果没有使用exteds关键字,name这个类直接继承Object类。
(1) 继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里。
(2) 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里。
(3) 无法继承private修饰的属性和方法。
(4) 无法修饰父类的构造方法。
访问修饰符
访问修饰符 |
本类 |
同包 |
子类 |
其他 |
Private |
√ |
|
|
|
默认 |
√ |
√ |
|
|
Protected |
√ |
√ |
√ |
|
Public |
√ |
√ |
√ |
√ |
2.2 重写和继承关系中的构造方法
2.2.1 子类重写父类方法
在子类中可以根据需求对从父类继承的方法进行重新编写,称为方法的重写或方法的覆盖(overriding)。方法重写必须满足如下条件
(1) 重写方法和被重写方法必须具有相同的方法名。
(2) 重写方法和被重写方法必须具有相同的参数列表。
(3) 重写方法的返回值类型必须和被重写方法的返回值类型相同或是其子类
(4) 重写方法不能缩小被重写的访问权限。
重载(overloading)和重写(overriding)有什么区别?
重载涉及同一个勒种的同名方,要求方法名相同,参数列表不同,与返回值类型、访问修饰符无关。
重写涉及的是子类和父类之间的同名方法,奥球方法名相同、参数列表相同、返回值类型相同(或是其子类)、访问修饰符不能严于父类。
Super代表当前对象的直接父类对象的默认引用。在子类中可以通过super关键字访问父类的成员。
(1) super必须出现子类(子类的方法和构造方法)中,而不是其他位置。
(2) 可以访问父类的成员,如父类的属性、方法、构造方法。
(3) 注意访问权限的限制,如无法通过super访问private成员。
(4) Super.name; //访问直接父类的name属性
(5) Super.print(); //访问直接父类的print()方法
(6) Super(name); //访问直接父类对应的构造方法,只能出现现在构造方法中
2.2.2 继承关系中的构造方法
(1)在构造方法中如果有this语句或super语句出现,则只能是第一条语句。
(2)在一个构造方法中不允许同事出现使用this和super语句用构造方法(否则就有两条第一条语句)。
(3)在类方法中不允许出现this或super关键字。
(4)在实例方法中,this和super语句不要求是第一条语句,可以共存。
2.3 抽象类
2.3.1 抽象类和抽象方法
抽象类和抽象方法的特点如下:
(1) 抽象类和抽闲该方法都通过abstract关键字来修饰。
(2) 抽象类不能实例化。抽象类中可以没有、有一个或多个抽象方法,甚至全部方法都可以是抽象方法。
(3) 抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。子类必须重写所有的抽象方法才能实例化,否则子类还是一个抽象类。
注意:(1)“public void print( ) {}”不是抽象方法,而是现实但实现为空的普通方法。
“public abstract voidprint( );”是抽象方法,别忘记最后的分号。
(2)abstract可以用来修饰类和方法,但不能用来修饰属性和构造方法。
2.4 final修饰符
2.4.1 final的应用
注意:
(1) final和abstract是功能相反的两个关键字,可以对比记忆。
(2) abstract可以用来修饰类和方法,不能用来修饰属性和构造方法。Final可以用来修饰类、方法和属性,不能修饰构造方法。
(3) Java提供的很多类都是final类,如String类、Math类,,他们不能再有子类。Object类中一些方法,如getClass()、nothfy()、wait()都是final方法,只能被子类继承而不能被重写,但是hashCode()、tostring()、equals(Object obj)不是final方法,可以被重写。