3、请简述变量隐藏和方法覆盖的区别
答案:1 悬赏:80 手机版
解决时间 2021-03-31 20:38
- 提问者网友:谁的错
- 2021-03-31 16:35
3、请简述变量隐藏和方法覆盖的区别
最佳答案
- 五星知识达人网友:不想翻身的咸鱼
- 2021-03-31 17:48
成员变量的隐藏:
如果在子类中对从父类继承来的成员变量进行重新定义,即出现了子类变量对父类变量的隐藏。所谓隐藏是指子类拥有两个相同名字的变量,一个是继承自父类,另一个是由自己定义的。当子类执行它自己定义的方法时,如果操作该变量,所操作的是它自己定义的变量,而把继承自父类的变量“隐藏”起来。当子类执行从父类继承的操作时,如果操作该变量,所操作的是继承自父类的成员变量。
举例:
class SuperClass{
int x;
……
void setX( ){
x = 0;
}
……
}
class SubClass extends SuperClass{
int x; //hide x in SuperClass
……
void setX( ){ //overload method setX( ) in SuperClass
x = 5;
}
……
}
这个例子中,SubClass是SuperClass的一个子类。其中声明了一个和父类SuperClass同名的变量x,并定义了与之相同的方法setX, 这时在子类SubClass中,父类的成员变量x被隐藏 ,父类的方法setX被重载。于是子类对象所使用的变量x为子类中定义的x,子类对象调用的方法setX( )为子类中所实现的方法。
注意,重载的方法和父类中被重载的方法要具有相同的名字,相同的参数表和相同的返回类型。
子类通过成员变量的隐藏和方法的重载可以把父类的状态和行为改变为自身的状态和行为。
方法的覆盖:
正如子类可以定义与父类同名的成员变量,实现对父类成员变量的隐藏一样,子类也可以重新定义与父类同名的方法,实现对父类方法的覆盖。当在子类中调用同名的方法时,一般情况下是调用它自己定义的方法,因而实现了对父类方法的覆盖,如果要调用父类的方法,只需在方法名前使用不同的类名或对象名即可。
举例:
import static java.lang.System. * ;
class Bat {
int wing;
private String color;
public Bat() {
wing = 2 ;
color = " red " ;
}
public void sayHi() {
System.out.println( " Hi ,Bat you have " + wing + " wings " );
}
public void sayWhat() {
System.out.println( " What will i say? " );
}
public String getColor() {
return color;
}
}
class BlackBat extends Bat {
int wing; // 遮蔽了超类中的2个变量
private String color;
public BlackBat() {
wing = 4 ;
color = " Black " ;
}
public void sayHi() {
System.out.println( " Hi ,Bat you have 4 wings " + wing);
}
public void getName() {
System.out.println( " My Name is BlackBat " );
}
// 去掉前面的注释符号 那么就改写了父类的方法 返回的是自己的颜色 即Black
// public String getColor(){
// return color;
// }
}
public class TestAB {
public static void main(String[] args) {
Bat x = new Bat();
BlackBat y = new BlackBat();
x.sayHi();
y.sayHi();
System.out.println( " I'm Bat ,my color is " + x.getColor());
System.out.println( " I'm BlackBat ,my color is " + y.getColor());
// 这里调用的依然是父类的方法,返回为red,因为子类中并未改写该方法,虽然它遮蔽了color变量
// 如果把BlackBat 中getColor() 的注释去掉 就会显示的是Black
// tiger中 实现和c语言类似的输出语句。
out.printf( " I'm BlackBat , my color is %s .%n " ,y.getColor());
System.out.println( " Yes , I am from super " + ((Bat)y).wing + x.getColor());
// 和方法不同的是:强制转换可访问父类的变量
((Bat)y).sayHi(); // 这里虽然强制转换为父类 但是还是调用的子类的。强制转换也不能访问
Bat z = new BlackBat(); // 自动转型 子类转换为超类
// z.getName(); // 子类中虽然有这个方法 但是转型为超类后 超类中并没这个方法 cannot find symbol
((BlackBat)z).getName();
// 这样就对了,强制转换为子类,这种转换通常成为窄转换,即父类向子类的转换。
z.sayHi(); // 因为超类中的方法被改写 所以调用的也是子类的方法
z.sayWhat(); // 超类中的方法未被改写 所以还是调用超类中的方法
}
}
总结:
覆盖:分为变量覆盖和方法覆盖,如果父类变量被覆盖后,可通过强制转换成父类来访问父类的变量,还可通过super.变量名来访问。而父类的方法被覆盖后,只能通过super.方法名()来访问,不能像变量那样通过强制转换来访问父类的方法。
如果在子类中对从父类继承来的成员变量进行重新定义,即出现了子类变量对父类变量的隐藏。所谓隐藏是指子类拥有两个相同名字的变量,一个是继承自父类,另一个是由自己定义的。当子类执行它自己定义的方法时,如果操作该变量,所操作的是它自己定义的变量,而把继承自父类的变量“隐藏”起来。当子类执行从父类继承的操作时,如果操作该变量,所操作的是继承自父类的成员变量。
举例:
class SuperClass{
int x;
……
void setX( ){
x = 0;
}
……
}
class SubClass extends SuperClass{
int x; //hide x in SuperClass
……
void setX( ){ //overload method setX( ) in SuperClass
x = 5;
}
……
}
这个例子中,SubClass是SuperClass的一个子类。其中声明了一个和父类SuperClass同名的变量x,并定义了与之相同的方法setX, 这时在子类SubClass中,父类的成员变量x被隐藏 ,父类的方法setX被重载。于是子类对象所使用的变量x为子类中定义的x,子类对象调用的方法setX( )为子类中所实现的方法。
注意,重载的方法和父类中被重载的方法要具有相同的名字,相同的参数表和相同的返回类型。
子类通过成员变量的隐藏和方法的重载可以把父类的状态和行为改变为自身的状态和行为。
方法的覆盖:
正如子类可以定义与父类同名的成员变量,实现对父类成员变量的隐藏一样,子类也可以重新定义与父类同名的方法,实现对父类方法的覆盖。当在子类中调用同名的方法时,一般情况下是调用它自己定义的方法,因而实现了对父类方法的覆盖,如果要调用父类的方法,只需在方法名前使用不同的类名或对象名即可。
举例:
import static java.lang.System. * ;
class Bat {
int wing;
private String color;
public Bat() {
wing = 2 ;
color = " red " ;
}
public void sayHi() {
System.out.println( " Hi ,Bat you have " + wing + " wings " );
}
public void sayWhat() {
System.out.println( " What will i say? " );
}
public String getColor() {
return color;
}
}
class BlackBat extends Bat {
int wing; // 遮蔽了超类中的2个变量
private String color;
public BlackBat() {
wing = 4 ;
color = " Black " ;
}
public void sayHi() {
System.out.println( " Hi ,Bat you have 4 wings " + wing);
}
public void getName() {
System.out.println( " My Name is BlackBat " );
}
// 去掉前面的注释符号 那么就改写了父类的方法 返回的是自己的颜色 即Black
// public String getColor(){
// return color;
// }
}
public class TestAB {
public static void main(String[] args) {
Bat x = new Bat();
BlackBat y = new BlackBat();
x.sayHi();
y.sayHi();
System.out.println( " I'm Bat ,my color is " + x.getColor());
System.out.println( " I'm BlackBat ,my color is " + y.getColor());
// 这里调用的依然是父类的方法,返回为red,因为子类中并未改写该方法,虽然它遮蔽了color变量
// 如果把BlackBat 中getColor() 的注释去掉 就会显示的是Black
// tiger中 实现和c语言类似的输出语句。
out.printf( " I'm BlackBat , my color is %s .%n " ,y.getColor());
System.out.println( " Yes , I am from super " + ((Bat)y).wing + x.getColor());
// 和方法不同的是:强制转换可访问父类的变量
((Bat)y).sayHi(); // 这里虽然强制转换为父类 但是还是调用的子类的。强制转换也不能访问
Bat z = new BlackBat(); // 自动转型 子类转换为超类
// z.getName(); // 子类中虽然有这个方法 但是转型为超类后 超类中并没这个方法 cannot find symbol
((BlackBat)z).getName();
// 这样就对了,强制转换为子类,这种转换通常成为窄转换,即父类向子类的转换。
z.sayHi(); // 因为超类中的方法被改写 所以调用的也是子类的方法
z.sayWhat(); // 超类中的方法未被改写 所以还是调用超类中的方法
}
}
总结:
覆盖:分为变量覆盖和方法覆盖,如果父类变量被覆盖后,可通过强制转换成父类来访问父类的变量,还可通过super.变量名来访问。而父类的方法被覆盖后,只能通过super.方法名()来访问,不能像变量那样通过强制转换来访问父类的方法。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯