快捷搜索: 王者荣耀 脱发

【面向对象-09】子类、父类方法重写和覆盖

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

经验分享 程序员 微信小程序 职场和发展