-5

Я сделал небольшой поиск в Интернете и узнал, что модификатор доступа по умолчанию конструктора такой же, как и уровень доступа класса, но посмотрите.Модификатор доступа по умолчанию для конструктора в Inheritance

Вот один класс

package package2; 
public class TestClass1 { 
    TestClass1() 
    { 
     System.out.println("In parent's contructor"); 
    } 
} 

и вот другой, который наследует от предыдущего

package package2; 

public class TestClass2 extends TestClass1 { 

     TestClass2() 
    { 
     System.out.println("In TestClass2's contructor"); 
    } 

} 

Но когда я пытаюсь создать объект TestClass2

import package2.*; 

class MainClass { 


    public static void main(String[] args) 
    { 
     TestClass2 t2 = new TestClass2(); //Says the constructor TestClass2() is not visible. 

    } 
} 

I не понимаю, оба класса TestClass1 и TestClass2 имеют p публичный доступ, поэтому их конструкторы также должны быть неявно публичными. Какую концепцию мне не хватает? оо

+2

Где вы читали спецификатор доступа по умолчанию конструктора является то же самое, что и у его класса? – Codebender

+0

'Конструктор по умолчанию! = Спецификатор доступа по умолчанию для конструктора. JLS говорит о неявном конструкторе (тот, который создается автоматически, если вы не определяете его в своем классе). – Codebender

+0

@Salim - Вы тоже хотели бы поддержать ответ! –

ответ

2

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

Существует разница между конструктором по умолчанию, и тот, который вы» объявлен. Конструктор по умолчанию - это тот, который вы не объявляете внутри класса.

Текущий код в коде не является конструктором по умолчанию. И у него есть ограничение по умолчанию (пакет-частный --- нет явного модификатора), поскольку вы не указали ему какой-либо модификатор доступа.

Какую концепцию мне не хватает?

Таким образом, ваш класс из другого пакета не может его найти из-за ограничения доступа по умолчанию.

+0

'default' - это ключевое слово в операторах switch, а не модификатор доступа, и в Java нет такой спецификации, как спецификатор доступа. – EJP

+0

@EJP - Извините, эта путаница между спецификатором доступа и access-modifer сводит меня с ума! Спасибо за редактирование. И, по умолчанию, я ссылался на package-private. –

1

О, они общедоступны, но только для пакета (мы называем его модификатором по умолчанию)!

Модификаторы доступа не имеют никакого значения между конструкторами и методами и полями.

Перемещение MainClass в том же пакете, как это:

package package2; // <-- ! 
import package2.*; 

class MainClass { 


    public static void main(String[] args) 
    { 
     TestClass2 t2 = new TestClass2(); //OK! 
    } 
} 

или сделать Конструкторы реальной общественной

public TestClass2() 
... 
0

неявный конструктор является конструктором, когда вы не пишете какой-либо конструктор. В вашем коде вы явно указали конструктор, поэтому они не являются неявными. Неявный конструктор предоставляется Java внутренне и не отображается. Пример:

package package2; 
public class TestClass1 { 
} 

В вышеуказанном классе мы не создали никакого конструктора.

package main; 
class MainClass { 
     public static void main(String[] args) 
     { 
      TestClass1 t2 = new TestClass1(); //Although we have not written any constructor for TestClass1, but we are able to create object for it. This object creation is done by calling TestClass1's costructor, which is an implicit, invisible constructor provided by java when we explicitly do not write any constructor. 
     } 
} 

Выше, хотя мы еще не написали ни конструктор для TestClass1, но мы можем создать объект для него.Это создание объекта выполняется путем вызова конструктора затрат TestClass1, который является неявным, невидимым конструктором, предоставляемым java, когда мы явно не записываем никакого конструктора.

В вашем примере вы явно указали конструктор и сделали его по умолчанию (по умолчанию это означает, что он не является общедоступным или закрытым), что означает, что он будет доступен только в одном пакете. Если вы пытаетесь вызвать этот конструктор из любого класса, который находится за пределами пакета, вы получите сообщение об ошибке, что конструктор не виден, как в вашем случае:

import package2.*; 

    class MainClass { 
     public static void main(String[] args) 
     { 
      TestClass2 t2 = new TestClass2(); //Says the constructor TestClass2() is not visible. 
     } 
    } 
Смежные вопросы