A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王光保 黑马帝   /  2011-7-17 19:36  /  3399 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

大家都知道方法的重写!如果在重写是改变了方法的访问权限,比如父类private->子类defalut这时候还是是方法的重写吗?
[ 本帖最后由 wangguangbao 于 2011-07-17  20:28 编辑 ]

10 个回复

倒序浏览
黑马网友  发表于 2011-7-17 20:03:50
沙发

回复 楼主 的帖子

不知道你这个private->defalut是改变的父类还是子类,不过anyway
父类的方法要想被重写,就不能是private,因为子类是不能继承父类的私有成员的,不能继承谈何重写
子类重写父类方法时,访问权限也不能比父类更弱。
也就是说父类的方法想被继承就不能时private的
比如父类方法是protected,子类重写的时候可以是protected,也可以是public,无论是protected还是public的,只要方法名一样,是继承关系,则就是方法的重写

评分

参与人数 1技术分 +2 收起 理由
admin + 2 回答得还不错!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-17 22:05:08
藤椅
重写方法不能使用比被重写方法更严格的访问权限。
回复 使用道具 举报
黑马网友  发表于 2011-7-18 00:57:31
板凳
子类不能降低父类方法的访问权限,只能大于等于父类中多态方法的访问权限,这是一个规定。

评分

参与人数 1技术分 +1 收起 理由
admin + 1 1点了还在学习,精神可嘉

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 09:31:26
报纸
在张老师就业宝典中有这样的总结:重写Override表示子类中的方法可以与父类中的某个方法的名称和参数完全相同,通过子类创建的实例对象调用这个方法时,将调用子类中的定义方法,这相当于把父类中定义的那个完全相同的方法给覆盖了,这也是面向对象编程的[color=Red]多态性[/color]的一种表现。子类覆盖父类的方法时,只能比父类抛出更少的异常,或者是抛出父类抛出的异常的子异常,因为子类可以解决父类的一些问题,不能比父类有更多的问题。子类方法的访问权限只能比父类的更大,不能更小。如果父类的方法是private类型,那么,子类则不存在覆盖的限制,相当于子类中增加了一个全新的方法。

评分

参与人数 1技术分 +2 收起 理由
admin + 2 借鉴张孝祥老师的,证明你还是去学习了!

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 09:38:43
地板
只有在参数改变的时候才构成重写。当然如果父类是private或者final的时候,就算参数一样也是重写...
但愿没有记错

评分

参与人数 1技术分 +1 收起 理由
admin + 1 新人报到,加分

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 10:36:05
7#
父类如果是private的话,子类是可以继承的,但是“只能看不能用”,父类的访问权限必须高于子类,子类才能调用父类的方法。
回复 使用道具 举报
黑马网友  发表于 2011-7-18 10:41:01
8#
[color=Red]如果一个方法在父类中试被private修饰的,这个方法就是对其子类隐藏的,既然子类都得不到这个方法那么如何谈重写?[/color]
如果你在子类中定义一个于父类方法名相同的,那么着不是重写,只是在子类中重写定义一个新的方法

:@

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 18:18:06
9#
当然是了,首先应理解什么是方法的重写,方法重写遵循的的条件,要知道如果父类方法具有的是private访问权限,该方法对其子类是隐藏的,子类无法访问该方法,也就无法重写。而defalut访问权限则可以被其子类访问,就可以实现方法的重写。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-18 19:58:14
10#
大家继续讨论,为什么子类覆写父类方法时,访问权限不能比父类更严格?????
回复 使用道具 举报
黑马网友  发表于 2011-7-18 22:18:06
11#

回复 10 # 的帖子

[code]while(true)
{
    Socket s = ss.accept();
    new Thread(new Servicer(s)).start();
}
ss.close();[/code]记得张老师 写过一段这样的一段代码时候 程序可能会报错,因为可能进入死循环,而不能执行下面代码。

如果这样写[code]boolean bRunning = true;
                        while(bRunning)
                        {
                                Socket s = ss.accept();
                                new Thread(new Servicer(s)).start();
                        }
                        ss.close();[/code]程序就不会认为是死循环了。

懂点了吗?
为什么子类覆写父类方法时,访问权限不能比父类更严格?????

Java是建立在建立在反射基础上的
只有程序运行到某句代码时,才能知道这句代码是否可行。
如果不限制子类的访问权限,方法的重写将毫无意义。

我给你举个例子
一个水杯 ,有一个茶杯,水杯的水可以倒入茶杯。茶杯继承水杯的属性和方法,添加了新方法可以泡茶水了。
如果这时改变了茶杯的访问权限,变为私有了。
水杯不能往茶杯倒水了。

会不会出错。 怎么泡茶水。。。


所以说 重写方法不能使用比被重写方法更严格的访问权限。
这就是一个规则,就是一个规定!!!!!!

评分

参与人数 1技术分 +3 收起 理由
admin + 3 回答得很好,很详细,你很认真。

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马