黑马程序员技术交流社区

标题: 一个重写的小疑问 [打印本页]

作者: 陈山    时间: 2012-11-22 16:17
标题: 一个重写的小疑问
本帖最后由 陈山 于 2012-11-23 22:32 编辑

class A {
        private void fun(){
               
        }
}

class B extends A{
        public void fun(){
               
        }
}
问题:A类中的fun()是否重写了父类中的fun()?
注意:父类中fun()访问权限为private。
作者: 金鑫    时间: 2012-11-22 16:20
本帖最后由 金鑫 于 2012-11-22 16:22 编辑

private关键字所修饰的成员被封装之后,只在本来中被访问,目的是不希望被外界所访问。如果能被子类继承后访问的话,就打破了封装性了,所以是不能被直接访问的。
如果想访问父类中私有的成员变量,就在父类中定义一个方法,在方法中将父类中北封装的对象返回,让外界访问
public int getInt()
{
     return x;
}
public String  getString()
{
     return y;
}

当父类中的成员函数用private来修饰时,子类无法重写。如果子类中有一个方法与父类方法名相同,参数列表以及返回值都相同,依然不是重写,只是在子类中重新定义了一个方法,可以加static关键字。
比如你的例子中,在子类也定义了一个方法public void fun(){},他与父类无关,只是在子类中定义了一个与父类一样的方法而已,但是不是重写,更不是从父类继承过来的



作者: 卞潇洋    时间: 2012-11-22 16:25
不是,private 是不能被重写的,这是两个不同的方法,当你A a = new B()时,调用fun方法都不能调的,因为是private,除非在类内部调用
作者: 韩俊杰    时间: 2012-11-22 17:29
1.首先要明白什么是重写,重写就是派生类(子类)继承基类(父类)的方法,所以我觉得你提的问题稍微有一点问题,应该是B类中的fun()是否重写了父类中的fun()
2.其次要知道如何实现重写,我总结了一下,应该是这样的
  (1)、必须是在继承里,

  (2)、方法名、返回值类型、参数个数和参数类型 都必须相同

  (3)、派生类(子类)重写的方法的访问权限不能低于基类(父类)的权限

所以得出结论,应该是B类中的fun()重写了父类中的fun()

这只是我个人而言,希望我的解释能使你有一个小小的满足





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2