2013-11-29 3 views
1

Являются ли поля или методы класса с default доступными в подклассы, если они оба существуют в одном пакете, или они должны быть объявлены как protected?Наследование по умолчанию для наследования

Пример:

package mypackage; 

class A{ 
    int x = 3; 
}  

class B extends A{ 
} 

Имеет B класс также поле x?

+4

вы можете сделать простые практические упражнения и найти ответ. – Jayasagar

+0

* Каждое поле * наследуется, даже 'private'. Тот факт, что подкласс не может получить к нему доступ, не означает, что его нет. Тем не менее, каждый экземпляр подкласса будет иметь все поля из его базового класса, то есть зарезервированной памяти для него, и если подкласс не сможет получить к ним доступ, он все равно может вызывать унаследованные доступные методы, которые могут их использовать. – Holger

+0

Кстати, как может такой вопрос быть «срочным» для кого-то, у кого нет компилятора? – Holger

ответ

3

См Описание:

enter image description here

Надеется, что это будет разберитесь

[EDIT]

Из таблицы для модификатора по умолчанию, как в вашем случае:

Доступ только из w в пакете в ведьме они объявлены.

средства, если класс A и B пребывание под одной и той же упаковке, вы можете, например, распечатать x:

class B extends A{ 

    public static void main(String[] args) {   
     new B().init();  
    } 

    private void init() { 
     System.out.println(x); 
    } 
} 

Однако, если мы ставим класс B в другой пакет, будет выброшено ошибка : The type mypackage.A is not visible. Поэтому здесь вы должны установить модификатор public.

+0

Хорошо, я прочитал это, но он не уточняет, по умолчанию ли поля по умолчанию находятся в подклассах одного и того же пакета. – arjacsoh

+0

@arjacsoh see my edit i posted –

1

С default доступ к свойствам доступен только для классов в одной упаковке.

Но с доступом protected они доступны для всех классов в одном пакете и подклассах (независимо от пакета). Выберите то, что актуально в вашем контексте.

Имеет ли класс B также поле x?

Да B наследует свойство x от A

+0

Защищенный доступ делает поля видимыми для классов того же пакета, независимо от того, являются ли они подклассами или нет. – arjacsoh

+0

@arjacsoh Спасибо, что исправил это, я перевернулся в своем уме. –

0

Да, вы можете получить доступ к public, default (Если классы находятся в одном пакете) и protected элементы данных, используя наследование:

public class A { 
    int a; 
} 

public class B extends A { 

    B() { 
     a = 5; 
    } 
+0

Это верно, только если подкласс находится в одном пакете. – Thomas

0

В случай подкласса по умолчанию [если в том же пакете] имеет привилегию использовать методы/элементы данных.

class B extends Class A{ 
    System.out.println(new B().x); //will surely work in your case(Example shown). 
} 
0

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

package original; 
public class A{ 
    int x = 1; 
} 

package original; 
public class B extends A{ 
    void test(){ 
     x = 2;// works because B inherited `x` and it is visible here 
    } 
} 

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

package other; 
class Outsider extends original.A{ 
    void test(){ 
     x = 2;// compilation error, x is not visible here 
    } 
} 

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

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