私有的成员不能被继承: 父类中有一些私有成员,不能在子类中直接使用。只不过在子类中,不能直接访问父类中定义的私有成员变量
父类中的构造方法不能继承
原因:父类的构造方法需要和父类的类名一致、子类的构造方法需要和子类类名一致,父 类和子类的类名不一样。因此无法继承,名称 有冲突。
父类的构造方法用于给父类的成员变量赋值,子类的构造方法用于给子类的成员变 量赋值,子类的成员变量较多,使用父类的构 造方法无法将子类中所有的成员 变量都进行赋值,因此不继承父类的构造方法。
解决:子类不继承父类的构造,但是可以【调用】父类的构造方法。(有待学习)
继承的设计:不要为了部分功能而定义继承(有待学习)
在子父类中定义了不同名称的成员变量,在子类中,既可以访问子类的成员变量,也可以访问父类的成员变量。在子父类中定义了同名的成员变量,在子类中,根据就近原则来访问 在子类的方法中,如果访问了某个变量名称,优先在当前方法中,寻找该变量的定义,如果找到了就使用方法中的局部变量;如果没有找到,就到子类的成员位置寻找该变量的定义,如果找到了就使用子类的成员变量;如果没有找到,就到父类的成员位置寻找该变量的定义....一直往上找,一直到Object类中,如果还没有找到,就编译报错。
下面代码示例:
public class 继承中成员变量的关系 { public static void main(String[] args) { Z z = new Z(); z.show1(); } } class F{ int f1 = 3; int f2; } class Z extends F{ int f1 = 10; int z1; int z2; public void show1() { int f1 = 4; System.out.println("f1="+f1); } }猜一猜输出结果会是什么。
。。。
。。。
。。。
。。。
。。。
。。。
。。。
。。。
。。。
。。。
结果:
f1=4我们发现,这个4就是这个方法里定义的f1=4;(用eclipse的小伙伴可以鼠标放在最后输出语句上的那个f1,然后按Ctrl键可以点击变量,然后他的原始定义的位置可以高亮)
(就像这样)
然后我们把这个注释掉看看。
public class 继承中成员变量的关系 { public static void main(String[] args) { Z z = new Z(); z.show1(); } } class F{ int f1 = 3; int f2; } class Z extends F{ int f1 = 10; int z1; int z2; public void show1() { //int f1 = 4;//这里注释掉了 System.out.println("f1="+f1); } }输出结果:
f1=10我们可以发现,方法里面的没有了,然后就会调用子类中我们定义的值为10的f1.
我们把子类中的f1也注释掉试试看:
public class 继承中成员变量的关系 { public static void main(String[] args) { Z z = new Z(); z.show1(); } } class F{ int f1 = 3; int f2; } class Z extends F{ //int f1 = 10;//这里也注释掉了 int z1; int z2; public void show1() { //int f1 = 4;//这里注释掉了 System.out.println("f1="+f1); } }输出结果:
f1=3我们发现这里又调用了父类中等于3的f1。那么这里也就验证了上面所说的,就近原则。当父类,子类,方法中有着同名的变量时。谁离的最近就用谁。先查看方法,如果找不到再去子类中去寻找,如果再找不到就去父类中去寻找。
