目录
1).成员变量的重写
2).成员函数的重写
3).子类方法中对父类和子类同名成员的访问
4). 如何理解覆盖
1).成员变量的重写
变量仅仅是一个标识符来命名,子类和父类出现同名成员变量的时候,就是子类对父类成员变量的重写。
2).成员函数的重写
相比变量,一个函数并不仅仅是由函数名来标识的,而是访问修饰符、函数名、参数列表、返回值类型、异常声明共同标识的。子类中某一个函数的上述标识和父类某一个函数一致,则是成员函数的重写。
3).子类方法中对父类和子类同名成员的访问
[1]. 如果子类某个成员 (变量/函数) 不是重写父类的,子类中函数通过this、super和直接访问都是一样的,访问的都是子类中的这个成员 (变量/函数);
[2]. 如果子类某个成员 (变量/函数)是重写父类的:
子类中函数通过this和直接访问是访问子类的同名成员(变量/函数);
子类中函数通过super访问到的是父类对应的同名的成员(变量/函数)。
4). 如何理解覆盖
覆盖的含义:
指的面相接口编程 (多态) 的时候,将子类实例传递给父类/接口的引用之后,通过父类引用访问同名的方法和变量的时候,到底访问的是子类的成员还是父类的成员的问题。
{1}. 程序中出现 “父类引用.同名成员变量”时,访问的是父类的同名成员变量;
也就是:子类的同名成员变量并没有覆盖父类中的同名成员变量。
{2}.程序中出现 “父类引用.同名成员函数”时,访问的是子类的同名成员函数;
也就是:子类的同名成员变量一定覆盖父类中的同名成员函数。
【结论】同名变量找引用的类;同名函数找实例对象的类。
示例:
package com;
class Fu {
int num = 4;
void show() {
System.out.println("show Fu");
}
}
class Zi extends Fu {
int num = 5;
void show() {
System.out.println("show Zi");
}
}
class T {
public static void main(String[] args) {
Fu f = new Zi();
Zi z = new Zi();
System.out.println(f.num);
System.out.println(z.num);
f.show();
z.show();
}
}
输出:
分析:
Fu f =new Zi();这句是多态,子类替换父类;
System.out.println(f.num); 同名变量看引用的类型 => 打印4
f.show(); 同名方法被子类同名方法覆盖,实际调的是子类的同名方法 => 打印show Zi