更改Java中重写方法的访问修饰符?
Posted
技术标签:
【中文标题】更改Java中重写方法的访问修饰符?【英文标题】:Change the access modifier of an overridden method in Java? 【发布时间】:2012-03-08 22:56:53 【问题描述】:是否有理由可以更改重写方法的访问修饰符?例如,
abstract class Foo
void start()...
然后将包私有访问修饰符更改为public
,
final class Bar extends Foo
@Override
public void start()...
我只是出于好奇而问这个问题。
【问题讨论】:
java access modifiers and overriding methods 的可能重复项 【参考方案1】:Java 不允许您使访问修饰符更具限制性,因为这会违反子类实例应该可以用来代替超类实例的规则。但是当涉及到使访问less 限制...好吧,也许超类是由不同的人编写的,他们没有预料到您想要使用他们的类的方式。
人们编写的程序和编程时出现的情况如此多样化,语言设计者最好不要“事后猜测”程序员可能想用他们的语言做什么。如果程序员没有充分的理由不能够在子类中减少访问说明符的限制(例如),那么最好将决定权留给程序员。他们知道自己的具体情况,但语言设计者不知道。所以我认为这是 Java 设计者的一个很好的呼吁。
【讨论】:
【参考方案2】:只有一个,您可能希望覆盖对更多类可见,因为没有修饰符是默认的,public 扩大了它。
【讨论】:
是的,这是我能看到的唯一好处......我不知道是否还有其他好处。【参考方案3】:扩展一个类意味着子类至少应该为其他类提供相同的功能。
如果他扩展了它,那么这不是问题。
扩展可以是添加新方法,也可以是向更多类提供现有方法,例如公开包访问方法。
【讨论】:
【参考方案4】:解释是这样的:-
这是 OOP 中的一个基本原则:子类是父类的完整实例,因此必须至少提供与父类相同的接口。 >让受保护/公共的东西不那么显眼会违反这个想法;你可以让子>类不能用作父类的实例。
class Person
public void display()
//some operation
class Employee extends Person
private void display()
//some operation
Person p=new Employee();
这里p是Person(超类)类型的对象引用,当我们调用>p.display()作为访问修饰符时,对对象的限制更大 引用 p 无法访问 Employee 类型的子对象
【讨论】:
【参考方案5】:编辑:好的,我更改了答案以解决问题。
如果无法做到这一点,那么在某些情况下,类将无法实现 iterface 和扩展类,因为它们具有相同的方法和不同的访问修饰符。
public Interface A
public void method();
public abstract classs B
protected void method();
public class AB extends B implements A
/*
* This would't be possible if the access modifier coulnd't be changed
* to less restrictive
*/
public void method();
【讨论】:
接口中定义的所有方法都是隐式公开的。 接口的所有方法都必须是公共的。 你不能在公共或受保护的接口中声明非公共方法(只有上帝知道受保护的接口是什么意思)。 java.sun.com/docs/books/jls/second_edition/html/… 见第 9.1.4 节 没错,在实现接口和扩展类时仍然是可能的。我将编辑我的答案。以上是关于更改Java中重写方法的访问修饰符?的主要内容,如果未能解决你的问题,请参考以下文章