继承中的注意事项
私有的成员不能被继承: 父类中有一些私有成员,不能在子类中直接使用。只不过在子类中,不能直接访问父类中定义的私有成员变量
父类中的构造方法不能继承
原因:父类的构造方法需要和父类的类名一致、子类的构造方法需要和子类类名一致,父 类和子类的类名不一样。因此无法继承,名称 有冲突。
父类的构造方法用于给父类的成员变量赋值,子类的构造方法用于给子类的成员变 量赋值,子类的成员变量较多,使用父类的构 造方法无法将子类中所有的成员 变量都进行赋值,因此不继承父类的构造方法。
解决:子类不继承父类的构造,但是可以【调用】父类的构造方法。(有待学习)
继承的设计:不要为了部分功能而定义继承(有待学习)
继承中成员变量的关系
- 在子父类中定义了不同名称的成员变量,在子类中,既可以访问子类的成员变量,也可以访问父类的成员变量。
- 在子父类中定义了同名的成员变量,在子类中,根据就近原则来访问
- 在子类的方法中,如果访问了某个变量名称,优先在当前方法中,寻找该变量的定义,如果找到了就使用方法中的局部变量;如果没有找到,就到子类的成员位置寻找该变量的定义,如果找到了就使用子类的成员变量;如果没有找到,就到父类的成员位置寻找该变量的定义....一直往上找,一直到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。那么这里也就验证了上面所说的,就近原则。当父类,子类,方法中有着同名的变量时。谁离的最近就用谁。先查看方法,如果找不到再去子类中去寻找,如果再找不到就去父类中去寻找。