2015-03-29 3 views
2

Я изучаю наследование на Java и книгу, которую изучаю, использует класс Employee, чтобы объяснить несколько концепций. Поскольку в одном из java-файлов с одним и тем же именем может быть только один (общедоступный) класс, и этот класс создает объекты другого класса, я должен определить класс Employee в том же файле без модификатора public. У меня создалось впечатление, что классы, определенные этим способом после того, как другое тело класса в одном и том же java-файле не видны другим классам в одном пакете. Вот пример кода Java для демонстрации:Как сделать (частный) класс в java, который не виден другим классам в одном пакете?

package book3_OOP; 

public class TestEquality3 { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     Employeee emp1 = new Employeee("John", "Doe"); 
     Employeee emp2 = new Employeee("John", "Doe"); 

     if (emp1.equals(emp2)) 
       System.out.println("These employees are the same."); 
     else 
      System.out.println("Employees are different."); 


    } 

} 

class Employeee { 
    private String firstName, lastName; 

    public Employeee(String firstName, String lastName) { 

     this.firstName = firstName; 
     this.lastName = lastName; 

    } 

    public String getFirstName() { 
     return firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public boolean equals(Object obj) { 

     //object must equal itself 
     if (this == obj) 
      return true; 

     //no object equals null 
     if (obj == null) 
      return false; 

     //test that object is of same type as this 
     if(this.getClass() != obj.getClass()) 
      return false; 

     //cast obj to employee then compare the fields 
     Employeee emp = (Employeee) obj; 
     return (this.firstName.equals (emp.getFirstName())) && (this.lastName.equals(emp.getLastName())); 

    } 
} 

Например, класс Employeee виден всем классам в пакете book3_OOP. В чем причина дополнительного «e» в Employee. На данный момент у меня есть около 6 классов сотрудников в этом пакете, таких как Employee5, Employee6 и т. Д.

Как обеспечить, чтобы второй класс, определенный таким образом в файле .java, не подвергался другим классам в одном пакете? Использование других модификаторов, таких как ошибки private или protected.

+7

Сделайте Employee частным внутренним классом. –

+0

Прочтите [this] (https://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html) для получения дополнительной информации о * внутренних классах * (например, предложенный PM 77-1). – Tom

ответ

4

Сделать Employee статический вложенный класс из TestEquality3:

public class TestEquality3 { 
    public static void main(String[] args) { 
     Employee emp = new Employee("John", "Doe"); 
    } 

    private static class Employee { 
     private String firstName; 
     private String lastName; 

     public Employee(String firstName, String lastName) { 
      this.firstName = firstName; 
      this.lastName = lastName; 
     } 
    } 
} 

Вы должны также сделать это на другие Employee классов. Если есть конфликт с другим классом, вы можете использовать имя закрывающего класса для устранения разногласий:

TestEquality3.Employee emp = new TestEquality3.Employee("John", "Doe"); 
+0

О, я вижу. Я не знаю эту конструкцию. Каким образом 'private' и' static' вносят необходимую разницу в этом случае? Я имею в виду, что вы используете 'static', когда вам нужно ссылаться на поле/метод, не создавая сначала экземпляр класса. Итак, какова теория добавления «private» и «static» в класс сотрудников здесь? –

+0

Разница в том, что его класс * внутри * другой. Твоих классов нет. – Tom

+1

@Manish Как сказал Том, основное отличие состоит в том, что 'Employee' теперь представляет собой вложенный класс' TestEquality3'. Я сделал его приватным, поэтому его нельзя получить извне в закрывающем классе, но это необязательно. Статичность означает, что вам не нужен экземпляр 'TestEquality3', чтобы использовать его. Проверьте этот [другой ответ] (http://stackoverflow.com/questions/29260297/constructor-inside-inner-static-class-in-java/29260653#29260653) для более подробной информации. –

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

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