当前位置:
文档之家› Java实用教程第9讲继承和多态
Java实用教程第9讲继承和多态
System.out.println("Tree height:" + height); } void printName(String name){
System.out.println("Tree name:" + name); } } class Pine extends Tree { double height = 20.3; void printHeight(){
// PortableComputer.java class ElectricalEquipment{
ElectricalEquipment(){ System.out.println("ElectricalEquipment()");
} } class Computer extendtem.out.println("pMethod1 in FinalMethodDemo"); } private final void pMethod2(){
System.out.println("pMethod1 in FinalMethodDemo"); } public static void main(String[] args) {
如果在声明final的变量时没有给其赋值,则称为空 白final,这个变量只有一次赋值机会,那就是在构造方 法中。
9.3.2 空白final
下面程序展示了空白final的赋值:
// BlankFinal.java public class BlankFinal {
private final int a;//空白final void setA(int a){
(3)父类既定义了无参构造方法,也定义了有参构造方法 ,在创建子类的对象时,可以使用super调用父类的有参构 造方法,也可以不使用super,这时系统会自动调用父类的 无参构造方法。
9.2.3 再论方法重载
在一个类中可以定义多个同名的方法,这些方法通过参 数的不同(参数的个数不同或类型不同)来区分,称为方法 的重载。在父类中定义了某个方法,而在子类中也定义了名 字相同的方法,但两个方法的参数不同,这是也构成了重载 。下面程序代码展示了这种情况:
Computer(){ System.out.println("Computer()");
} }
9.2.2 父类的初始化
public class PortableComputer extends Computer { PortableComputer(){ System.out.println("PortableComputer()"); } public static void main(String[] args) { PortableComputer myPc = new PortableComputer(); }
System.out.print(f.c[i] + " "); } } }
9.3.2 空白final
在Java中,如果在声明变量时不给其赋值,系统可 以对其进行自动初始化,基本类型变量自动初始化为0, 其余类型变量自动初始化为空。但是final类型的变量必 须显示初始化,且初始化只能在两个地方进行:一是在 定义处,二是在构造方法中。且不能同时即在定时时赋 值,又在构造方法中赋值。
子类中也可以定义与父类中名字相同的成员变量,因为 名字相同,在子类中,从父类继承过来的这个变量被隐藏。 下面的程序代码展示了方法的重写和变量的隐藏:
9.2.4 变量的隐藏和方法的重写
// Overriding.java class Tree {
double height = 10.2; void printHeight(){
System.out.println("show(" + c + ")"); } } public class OverloadInExtend { public static void main(String[] args) {
University u = new University(); u.show(1); u.show(2,3); u.show('a'); } 在University类中有三个show方法:show(char c)、show(int i)和show(int j),三个 方 法构成重载方法,其中后两个show方法是从父类School中继承过来的。 }
9.2.4 变量的隐藏和方法的重写
因为子类可继承父类中的方法,所以子类不需要重新编 写相同的方法。但有时子类并不想原封不动地继承父类的方 法,而是想作一定的修改,这就需要采用方法的重写。方法 重写又称方法覆盖。 若子类中的方法与父类中的某一方法 具有相同的方法名、返回类型和参数表,则新方法将覆盖原 有的方法。
System.out.println("Pine tree height:" + height); } void printName(String name){
System.out.println("Pine tree name:" + name); } } public class Overriding { public static void main(String[] args) {
9.1 组合
9.2.1 继承的语法
•表明“继承”时,使用关键字extends,如: class Person{ } class Student extends Person{ }
•上面程序中类Student继承于Person类,Person类称为父类或基类, Student类称为子类或派生类。而在定义Person类时,并没有为其指定父 类,它默认的继承Object类,只不过“extends Object”可以省略:
FinalData f = new FinalData(); /* f.a = 10;//编译错误 FinalData.B = 20;//编译错误 f.c = new int[10];//编译错误 */ f.c[0] = 10; for (int i = 0;i < f.c.length;i++){
wclass Person extends Object{} •子类继承父类时,将得到父类中的所有成员,只是有的成员能够直接使用 ,有的成员只能间接使用。
9.2.2 父类的初始化
当创建一个子类的对象时,该对象中包含了一个父类的 对象。这个存在于子类对象中的父类对象同单独使用父类创 建的对象一模一样。而且父类对象要先被初始化,这个初始 化的动作是由构造方法来完成的。下面程序代码证明了这一 点:
第9讲 继承和多态
• 9.1 • 9.2 • 9.3 • 9.4 • 9.5
组合 继承 final关键字 多态 本讲小结
Java通过两种方式来实现代码的复用,即组 合和继承。组合是指创建新类时,新类中的成员 是由现有类的对象组成,这种方式比较直观。而 继承是指在现有类的基础上添加新的代码。这两 种方式都不会破坏原有代码。
9.3 final关键字
被关键字final修饰的东西是不能被修 改的,final可以修饰变量、方法和类。
9.3.1 final修饰的变量
声明final字段有助于优化器作出更好的优化决定, 因为如果编译器知道字段的值不会更改,那么它能安全 地在寄存器中高速缓存该值。final字段还通过让编译器 强制该字段为只读来提供额外的安全级别。
// FinalMethodDemo.java class FinalMethod{
final void show(){ System.out.println("show() in FinalMethod");
} private void pMethod1(){
System.out.println("pMethod1 in FinlaMethod"); } private final void pMethod2(){
9.2.3 再论方法重载
// OverloadInExtend.java class School {
void show(int i){ System.out.println("show(" + i + ")");
} void show(int i,int j){
System.out.println("show(" + i + "," + j + ")"); } } class University extends School { void show(char c){
final修饰的变量一旦被初始化便不可改变,这里不 可改变的意思对基本类型来说是其值不可变,而对于复 合数据类型来说其引用不可再变。
关键字final修饰的变量也可以定义为static的,称 为静态常量,在内存中占据一段不能改变的存储区域, 表示静态常量的名字全部用大写字母。
9.3.1 final修饰的变量
下面程序展示了final的用法:
// FinalData.java public class FinalData {
final int a = 1; static final int B = 2; final int[] c = {1,2,3,4,5}; public static void main(String[] args) {
Pine p = new Pine(); p.printName("MyTree"); p.printHeight(); } }
9.2.5 super关键字