Может показаться, что у вас возникают проблемы с пониманием основных концепций объектов и объектно-ориентированного программирования.Объяснение примером;Этот класс представляет тип вещи, а именно автомобиль:
public class Car{
// Licence plate number. This is private, so it can
// not be accessed directly from outside the class.
private String hiddenRegNr = "";
private static String description = "This is a car".
// The constructor, which sets the value of hiddenRegNr
public Car(String regNr){
hiddenRegNr = regNr;
}
// Method for reading hiddenRegNr, the only
// way to access it after instantiation.
public String getRegNr(){
return hiddenRegNr;
}
// A static method. Can be used withouth instantiation.
public static String getDesc(){
return description;
}
}
Из какого-то другого класса вы можете вызвать этот класс и создать его экземпляры;актуальные представления разных автомобилей.Они представляют разные автомобили, но основаны на одной и той же «модели», т. Е. Классе автомобилей.
Car myFirstCar = new Car("SR12345");
Car myOtherCar = new Car("XZ54321");
Теперь у вас есть две разные машины с двумя разными регистрационными номерами.Это независимые экземпляры типа car .Они существуют в памяти и могут содержать разные значения (в этом случае разные регистрационные номера).
myFirstCar.getRegNr(); // Will return SR12345
mySecondCar.getRegNr(); // will return xz54321
Первое, что здесь следует отметить, это то, что вы можете указать регистрационный номер только один раз для каждого автомобиля, а именно при создании.В этом смысл конструктора: он устанавливает значения и выполняет другие действия, которые необходимо выполнить при создании объектов (экземпляров).
Теперь обратите внимание на разницу между getRegNr () и getDesc (): ключевое слово «Static» означает, что второй метод связан непосредственно с классом, а не с каждым экземпляром.Это означает, что:
Вызовы getDesc () выполняется для класса, а не для экземпляра:
Car.getDesc ();
Вызов getDesc () вернет одинаковое значение для всех экземпляров класса car
Переменная описание (которая также является статической) будет одинаковой для всех экземпляров Car
Статический метод getDesc () НЕ МОЖЕТ получить доступ к переменной hiddenRegNr , так как эта переменная связана с конкретным экземпляром.Попытка обратиться к переменной в экземпляре из статического контекста (такого как getDesc () ) вызовет исключение.Можно сказать, что hiddenRegNr не будет установлен при вызове
Car.getDesc ();
, поскольку конструктор никогда не вызывался,поэтому ему никогда не давали никакого значения.