java为什么可以通过继承父类的公有方法访问父类的私有属性
父类引用指向子类对象,再通过子类对象的特殊结构指针找到子类的方法表,在通过方法表中的指针找到方法的实际地址。方法表是个数组,排列方法顺序是先父后子,而且没有父类的私有方法...
父类引用指向子类对象,再通过子类对象的特殊结构指针找到子类的方法表,在通过方法表中的指针找到方法的实际地址。方法表是个数组,排列方法顺序是先父后子,而且没有父类的私有方法。如果我将子类对像附给父类引用,再调用继承来的父类公有方法访问父类私有方法是可行的。但问题是子类的方法表中并没有父类的私有方法,那父类的公有方法是怎么访问到父类的私有方法的呢? 如果说是继承了但子类不可见,那如果我在父类的父类里定义相同的私有方法岂不是会被先调用,这也与现实结果不复合?求解答。
展开
3个回答
展开全部
访问权限是出于安全性
你调用父类的方法,想当于地方机构向上级机构交个申请,你不需要知道上级里有多少个部门(方法),给过多少个人(变量)。那些是你指挥不到的。
公开和友好的方法可以被重写,如果需要调用父类同名的方法,需要用super.method来指定
私有方法,只能在本类里使用,你子类并不知道父类有没有调用。
象你说的父类的父类中的私有方法,没有被定调用的话,是不会被执行的。关于这块,不是很明白你想问什么。
你看一下面的代码,有什么疑惑,指出来。
class A {
public void method1() {
}
private void method2() {
// no call
}
}
class B extends A {
public void method1() {
super.method1(); // call A class method
method2();
}
private void method2() {
}
}
class C extends B {
public void method() {
method1(); // call B class method
}
}
你调用父类的方法,想当于地方机构向上级机构交个申请,你不需要知道上级里有多少个部门(方法),给过多少个人(变量)。那些是你指挥不到的。
公开和友好的方法可以被重写,如果需要调用父类同名的方法,需要用super.method来指定
私有方法,只能在本类里使用,你子类并不知道父类有没有调用。
象你说的父类的父类中的私有方法,没有被定调用的话,是不会被执行的。关于这块,不是很明白你想问什么。
你看一下面的代码,有什么疑惑,指出来。
class A {
public void method1() {
}
private void method2() {
// no call
}
}
class B extends A {
public void method1() {
super.method1(); // call A class method
method2();
}
private void method2() {
}
}
class C extends B {
public void method() {
method1(); // call B class method
}
}
追问
或者这样说吧,为什么多态机制只覆盖方法,而不覆盖属性。
追答
不太好说.但属性覆盖的话,问题很多.
属性出现的重复的可能性很大.如果你覆盖了值,就不能保证唯一性了吧
重写方法,还可以做功能扩展.
从机制上,不会说.
但用起来会不知道这个变量的值,是不是你想要的那个.就是这样.
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主要是为了安全性和提高代码的利用率。
追问
这只能解释访问控制存在的原因,因为设计中需要多态,所以有了继承,为何继承中只存在方法覆盖不存在属性覆盖呢??
追答
我们每个类的属性前面都会写上private,再写set,get方法,这样我们就可以用这两个方法来设置属性,方法覆盖只是让后面实现更多的功能
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询