https://blog.csdn.net/twilight_karl/article/details/53494296
本人在查看上面的文章的时候,发现,并不理解上面的输出情况。所以重新写了一篇文章进行解释。
代码如下。
package Temp;
class A {
int x = 6;
private int y = 2;
public A(int a) {
x = a;
}
int getz() {
int z;
z = x / y;
return z;
}
void show() {
System.out.println("x=" + x);
System.out.println("y=" + y);
System.out.println("z=" + getz());
}
}
class B extends A {
int x = 3, y = 5, z;
public B(int a) {
super(a);
}
int getz() {
z = x + y;
return z;
}
}
public class Temp {
public static void main(String[] args) {
A num1 = new A(10);
B num2 = new B(9);
num1.show();
num2.show();
}
}
输出结果如下
x=10
y=2
z=5
x=9
y=2
z=8
首先第一组的输出情况是非常好理解的。因为他生成A类一个对象num,因此该对象使用show函数的时候,就会产生如上的情况。
下面我们来解释一下为什么第二组的输出结果是这样?
如果看不懂下面我的解释的同学,可以把B类中的,x,y,z全部替换成a,b,c。其实一下你就可以明白怎么回事。如果你懂了也就不需要往下看了。
解释下x:
B num2 = new B(9);
该语句产生一个B的对象,然后初始的数据是9,就会调用他的构造函数。
其中,super()函数的作用就是调用他的父类的构造函数。下面我们来看一下。他父类的构造函数是什么?
该函数的作用是给,父类A中的变量x进行赋值。一定要注意你改变的是父类A中的x,并不是你在B类中定义的那样。
你B类中的x还是他初始化的3,改变的是A类中,也就是继承自A的x的值。
解释下y:
有人可能会认为,y的值应该是5,因为B类在继承的时候,私有的成员 不可以被继承,那么y就应该是B类中,定义的那个数字5.
首先,是的,private是不会被继承,也就是说,B从A继承的member其实只有x一个,没有y。也就是说,在num2中,所有的member一共有4个,继承A 的x=9,本身定义的x=3,y=5,z=5。
如果你使用num2.y就会发现,他的数字是5,不是我们现在看到的数字2.
现在我们明确了,B中的member都是什么之后,我们看下输出结果。
首先show函数,在B中是没有的,也就是要继承的。也就是使用下面这个代码。
但是要注意,继承,你可也理解为把这个代码相当于放在你的函数中,只要是public等修饰的时候,你可以随意使用。
但是其中的x,y和函数getz()你要理解好含义。
就像上面我所提到的,如果你把B中的xyz,替换成abc。你就会发现。这个函数它其实输出的是x和y,并不是B中的ab。这也就解释了为什么它的结果不是3和5。
同时,因为getZ()函数已经被重写,如果使用B的对象num2去调用函数show(),系统会自动调用子类,也就是 被重写后的函数,也就是代码
但是一定要注意,调用这个函数后,其中的x,y。是B类中的x,y。也就是a,b。为什么呢?
首先,当你把字母变成ab后,你会很清楚的看到,这个函数中用的是B类定义的xy(ab),而不是继承的A类的。
那么你把字母就算换成一样的,先不说什么同名隐藏的问题。你定义的函数中使用的变量,会现在你定义的类中找,如果找不到才会去父类中找。也就是这样原因,就算他写z = x + y,使用的也是int x = 3, y = 5, z;中的数据,所以值是8.而不是其他数字
另外我在说下,x的数值,在输出的时候,他输出的是A中定义的x,而不是B中定义的x。是因为,show函数是父类的,该函数中在A定义的时候,里面的x,y指的就是A类中的x,y。因为那个时候也还没有B呢。就算被B继承了,他指的还是A类的x,y。
但是如果你把下面的代码,加到B中,不使用继承的方法使用该函数,那么你得到的结果就是x = 3,y = 5,z = 8;
下面我再说下隐藏的问题,
如果子类,继承自父类,但是members中,有同名的变量,那么父类中的 变量会被隐藏,注意不是覆盖,因此系统还是会为父类中的实例变量进行开辟空间,只是在B中也就是子类中,使用同名变量xyz的时候,使用的是子类B中的,其实和函数重写后,函数会覆盖父类的函数,含义差不多。这也是为什么,如果把上面的代码加到B类中,输出结果为什么是x = 3,y = 5,z = 8;的原因
还有一个需要注意的是:
每个继承了这个变量的子类,相当于拷贝了一份变量,对变量的修改影响也仅限于自身,不会影响到父类的变量值,更不会影响到其他子类对应的变量值。