2015-01-02 3 views
0

Учитывая этот классСтатический метод против метода экземпляра применяется к примеру

public class Worker 
private String name; 
private static int WorkerCount = 0; // number of workers 

public Worker(<*parameter list* >) 
{ 
<*initialization of private instances variables* > 
Worker++; //increment count of all worker 
} 

} 

Если бы я добавить метод ...

public static int getWorkerCount() 
{ 
return WorkerCount;} 

Как метод, который я только что добавили статические вместо экземпляра ? Я думаю, что это может быть метод экземпляра, как он работает на отдельного объекта из «WorkerCount», который первоначально равен 0.

+0

Если он нестационарен и единственное место, где значение обновляется, находится в конструкторе, как показано в вашем коде, тогда значение employeeCount всегда будет 1, что, вероятно, не является тем, что вы после. – sn00k4h

+1

Это статичный, поскольку он не связан с конкретным экземпляром «Сотрудник». – August

+0

'employeeCount', являющийся« отдельным объектом », не является такой же суммой, как и все экземпляры класса как поля самого класса или поля, отличного от каждого экземпляра класса. – J0e3gan

ответ

0

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

С переменной employeeCount переменная является статической, тело метода уже настроено для этой функции. Вероятно, вы захотите этого, так как он подсчитывает общее количество объектов Employee, инициализированных этим конструктором.

Также примечательно, что employeeCount является примитивным значением (int) и не должен упоминаться как объект.

+0

- это последовательность, которую программисты стремятся поддерживать? –

+0

@CrazyRaisans, отредактированный для ясности, выделяет доступность на уровне класса как лучшую причину, чем согласованность с частной статической переменной. –

+0

Может ли быть методы экземпляра void? –

2

Это больше вопрос который должен иметь возможность вызвать метод, а не сколько объектов он получает доступ и т.д.

static поля и метод принадлежит к класса вместо конкретного например. Таким образом, независимо от того, сколько раз вы создаете экземпляр Employee, будет ровно один int employeeCount. Ссылка каждого сотрудника на поле employeeCount возвращается в то же место. Пользуясь полем employeeCount, вы уже получаете это, это просто вопрос применения той же логики к методам.

Поставив getEmployeeCount() статический, вы говорите, что не только любой сотрудник может его назвать, сам класс Employee может вызвать метод; вам не нужен экземпляр для вызова метода.

Employee.getEmployeeCount(); //Valid, because getEmployeeCount() is static 
Employee.name; //Invalid (non-static reference from static context) because *which* employee's name? 

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

Employee a = new Employee(); 
Employee b = new Employee(); 

System.out.println(a.getEmployeeCount()); //2 
System.out.println(b.getEmployeeCount()); //2 
System.out.println(Employee.getEmployeeCount()); //2 

Employee c = new Employee(); 

System.out.println(a.getEmployeeCount()); //3 
System.out.println(b.getEmployeeCount()); //3 
System.out.println(c.getEmployeeCount()); //3 
System.out.println(Employee.getEmployeeCount()); //3 

Там ничто не мешает вам делать getEmployeeCount() нестатическая. Однако, поскольку вообще не имеет значения, к какому экземпляру вы вызываете метод (и на самом деле вам даже не нужен экземпляр), удобство и хорошая практика делают метод static.

+0

«Создавая getEmployeeCount() static, вы говорите, что не только любой сотрудник может его назвать, сам класс Employee может вызывать метод, вам не нужен экземпляр, чтобы вызвать метод« (Mshnik) ». Вы имеете в виду, что static делает метод общедоступным, а не частным? –

+0

«Поскольку это только доступ к статическим полям, это имеет смысл. Независимо от того, какой экземпляр вы должны были бы назвать, он возвращал бы то же значение» (Mshnik). Вы имеете в виду, что есть способы вызвать экземпляр так, чтобы он возвращал разные значения? Если employeeCount увеличивается, не было бы необходимым и правильным ожидать увеличения значения для метода доступа getEmployeeCount? –

+0

Что вы подразумеваете под «вообще не имеет значения, на какой экземпляр вы вызываете метод (и на самом деле вам даже не нужен экземпляр), удобство и хорошая практика делают метод статическим».? –