2013-12-03 2 views
1

Что такое пример защиты, предпочтительный, но не общедоступный? Может ли кто-нибудь разработать его с примерами? Я уже видел чат для публичных, частных и защищенных (see here).Почему мы защитили спецификатор доступа в java?

+0

Частный означает, что только ваш класс может его использовать. Защищенный означает, что вы и ваши дети можете его использовать. Это полезно, когда вы хотите скрыть что-то из общего использования, но нужно предоставить подклассам дополнительную информацию. – Trenin

ответ

6

Первичное использование protected - это случаи, когда подкласс отменяет метод, который предоставляет некоторые внутренние детали, которые вы не хотите показывать внешним классам. Рассмотрим класс как

class BaseAlgorithm { 
    run() { 
     commonStepOne(); 
     subclassSpecificStepTwo(); 
    } 

    protected abstract subclassSpecificStepTwo(); 
} 

Никто не должен быть вызывающим subclassSpecificStepTwo, так что не имеет смысла иметь его общедоступным.

+1

... но имейте в виду, что 'protected' также будет доступен из других классов внутри одного пакета. –

+0

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

+0

@JeffStorey спасибо ... –

3

Проще говоря, protected означает, что метод (например) будет доступен только в подклассах и в пакете, в котором он определен.

 
Modifier | Class | Package | Subclass | World 
————————————+———————+—————————+——————————+——————— 
protected | ✔ | ✔ | ✔  | ✘ 
————————————+———————+—————————+——————————+——————— 

Подробнее:

+0

Awesome ASCII table. –

0

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

Имейте см. oracle docs

0

Вопрос об использовании и использовании, поэтому у меня есть пример.

Рассмотрите класс , который потребует от него подкласса реализовать какой-либо метод, который не является частью его общедоступного API и используется только внутри этого класса или его подклассов.

Мы не можем использовать частный модификатор, мы не хотим, чтобы этот метод был общедоступным.

Итак, ключевое слово protected делает наш API понятным и предотвращает разрыв инкапсуляции.

Вам нужен пример кода?

0

Все эти private, public, protected or no-access modifiers(default) - это всего лишь концепция разработки, чтобы сделать кодирование хорошо организованной манерой.

Вы можете найти полезную информацию от here. Ответ, который вы ищете, есть.

Но нет такой защиты, скрытой информации с использованием любого из этих модификаторов в Java

Рассматривают следующий код

public class ProtectedPrivacy{ 

private String getInfo1(){ 
return "private"; 
} 

protected String getInfo2(){ 
return "protected"; 
} 

String getInfo3(){ 
return "default"; 
} 

public String getInfo4(){ 
return "public"; 
} 
} 

Любой уровень доступа вы можете нарушить следующим

public class BreakModifires{ 

public static void main(String[] args) throws Exception { 
    ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy(); 
    Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo*", null); 
    method.setAccessible(true); 
    Object result = method.invoke(protectedPrivacy); 
    System.out.println(result.toString()); 
    } 
}  
0

A public член класса делает обещание для всей вселенной от имени все возможные будущие производные и под-производные класса, что все производные этого класса будут поддерживать определенную функциональность определенным образом.

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

Причина, по которой public обещания являются обязательными для подклассов и protected из них не является, что если подклассы не были связаны публичными обещаниями своих родителей, не было бы никакого способа для кода, который имел ссылку на Animal может смело назвать MakeNoise на нем, не зная, был ли он типом, не требующим наличия члена MakeNoise. Напротив, если класс имеет защищенный член, единственный способ, которым может быть вызван этот элемент, - через super. Если Animal реализован защищенный DetectSmells элемент и Cat поддержали его, но Fish не сделал, тот факт, что Fish не поддерживает этот метод не будет влиять на способность SiameseCat «s назвать super.DetectSmells(), , так как он знает, что super является Cat и не Fish.

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