2012-02-17 5 views
15

Есть ли причина, по которой можно изменить модификатор доступа переопределенного метода? Например,Изменить модификатор доступа переопределенного метода в Java?

abstract class Foo{ 
    void start(){...} 
} 

А затем изменить пакет-частного модификатор доступа к public,

final class Bar extends Foo{ 
    @Override 
    public void start(){...} 
} 

Я просто задаю этот вопрос из любопытства.

+1

возможно дубликата [модификаторы доступа Явы и преобладающих методов] (http://stackoverflow.com/questions/6851612/java-access-modifiers-and-overriding-methods) –

ответ

17

Java не позволяет сделать модификатор доступа более ограничительным, поскольку это нарушит правило, согласно которому экземпляр подкласса должен использоваться вместо экземпляра суперкласса. Но когда дело доходит до получения доступа меньше ограничительный ... ну, возможно, суперкласс был написан другим человеком, и они не ожидали, как вы хотите использовать свой класс.

Программы, которые люди пишут, и ситуации, возникающие при программировании, настолько разнообразны, что разработчикам языков лучше не «вторгаться» в то, что программисты могут захотеть сделать с их языком. Если нет веской причины, по которой программист должен не указать, можно сделать ограничения доступа менее ограничительными в подклассе (например), тогда лучше оставить это решение программисту. Они знают специфику своей индивидуальной ситуации, но разработчик языка этого не делает. Поэтому я думаю, что это был хороший вызов дизайнеров Java.

6

Существует только одно, вы можете захотеть, чтобы переопределение было видимым для большего количества классов, поскольку модификатор не используется по умолчанию, public расширяет его.

+0

Да, это было единственное преимущество, которое я мог видеть ... Я не знал, было ли в этом больше, чем это. – mre

1

Редактировать: Хорошо, я изменил свой ответ, чтобы исправить проблему.

Если это не удалось сделать, тогда бы были случаи, когда класс не смог бы реализовать итерацию и расширить класс, потому что они имеют один и тот же метод с различными модификаторами доступа.

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(); 
} 
+1

Все методы, определенные в интерфейсе, неявно публичны. – GriffeyDog

+1

Все методы интерфейсов должны быть общедоступными. – Puce

+0

У вас не может быть объявление не pubic-метода в общедоступном или защищенном интерфейсе (бог знает только, что означает защищенный интерфейс). http://java.sun.com/docs/books/jls/second_edition/html/interfaces.doc.html См. раздел 9.1.4 – Dunes

6

Расширение класса означает, что подкласс должен по меньшей мере предлагать те же функциональные возможности для других классов.

Если он продлит это, то это не проблема.

Расширение может быть либо добавлением новых методов, либо предлагая существующие методы для большего количества классов, например, создание общедоступного метода доступа к пакетам.

2

объяснений заключается в следующем: -

Это фундаментальный принцип объектно-ориентированного программирования: дочерний класс является полноценным экземпляром> родительского класса, и поэтому должно присутствовать по крайней мере, тот же интерфейс, как родитель класс. > Снижение видимости защищенных/общественных вещей нарушит эту идею; вы можете сделать дочерние> классы непригодными для использования в качестве экземпляров родительского класса.

class Person{ 
public void display(){ 
    //some operation 
} 
} 

class Employee extends Person{ 
private void display(){ 
    //some operation 
} 


Person p=new Employee(); 

Здесь р является ссылка на объект с типом лица (супер-класс), когда мы называем> р.Дисплей() в качестве модификатора доступа является более ограничительным объектом ссылки р не может получить доступ дочернего объекта типа Employee

 Смежные вопросы

  • Нет связанных вопросов^_^