Много понятий в этом примере. Возможно, стоит взглянуть на более простые. Но я постараюсь объяснить.
Первый вопрос :
Давайте сначала посмотрим на это:
class DataOnly
{
final int LIMIT = 100; //constant and package mode or access
int iMem; //package mode or access
double dMem; //package mode or access
}
Это класс. Думайте об этом как о проекте, который можно использовать для создания объектов. (Точнее, чертежи должны называться типами). Важно понимать, что сам класс не является объектом. Мы можем создать несколько объектов одного типа.
DataOnly data1 = new DataOnly();
Вы правы, эта строка создает объект. DataOnly
является типом, а data1
является ссылкой (подробнее об этом позже). DataOnly data1
означает, что data1
будет ссылкой на объект, созданный для соответствия типу DataOnly
. new DataOnly
означает, что мы создаем объект, используя тот «план», который мы определили. Где будет находиться объект? Он будет храниться где-то в памяти, и наша ссылка data1
будет хранить это место в памяти (адрес памяти) для нас. Всякий раз, когда мы хотим что-то сделать с нашим объектом, мы используем эту ссылку, чтобы достичь этого в памяти. Мы могли бы создать объект data2, который был бы помещен в другое место в памяти, и изменить его члены. Они никак не повлияют на data1, потому что класс - это «проект», объект - это то, что мы создали с помощью этого проекта.
() означает, что мы вызываем конструктор без параметров.
На ваш второй вопрос : если вы понимаете мое предыдущее объяснение, тогда с этим не должно возникнуть никаких проблем. Мы хотим что-то сделать с объектом - напечатать его члены. Хорошо, у нас есть ссылка. .
(точка) используется для доступа к частям объекта. data1.LIMIT
в конечном итоге будет означать, что мы берем объект, на который ссылается data1, и смотрим на его элемент LIMIT.
Третий вопрос : Объекты могут не только хранить информацию, но и делать вещи. Например, вы, наверное, раньше использовали проигрыватель компакт-дисков. Если вы посмотрите на него, вы увидите, сколько треков на текущем CD. Но не только это, вы можете нажать кнопку воспроизведения, и он будет играть песню для вас. Давайте посмотрим, как это будет выглядеть в Java.
class CDPLayer
{
public int numberOfTracks = 12;
public void play()
{
System.out.println("I'm playing! Yay!");
}
}
Это простой проигрыватель компакт-дисков, и в нем нет возможности заменить компакт-диск:)
То, что объект имеет , является его членами, вещи, которые он может делать , являются его методами. Наш очень простой CD-плеер имеет несколько треков и может играть. Методы и члены в равной степени являются частями объекта, поэтому мы можем использовать оба с точкой .
, чтобы добраться до них. (помните, объект не совпадает с классом)
В этот момент вы, вероятно, поймете следующий код:
CDPlayer player = new CDPlayer();
System.out.println("The number of tracks is " + player.numberOfTracks);
player.play();
Мы создаем CDPlayer и затем печатаем количество дорожек в нем. Затем мы используем его метод play
.
В вашем примере класс MethodOnly объявляет два метода с одинаковым именем. Это, вероятно, сбивает с толку, но компилятор не определяет, какой метод использовать по имени, но по сигнатуре. Сигнатура метода включает в себя тип возвращаемого значения, его имя и все его параметры. Что происходит, когда вы звоните printFunc
? Компилятор проверяет тип переданных вами аргументов и сделает все возможное, чтобы найти метод, соответствующий этому.
Первый раз, когда он вызывается с аргументом 5
, который является целым числом или для краткости int. Компилятор выбирает printFunc с параметром int
Во второй раз он вызывается со строковым литералом, поэтому компилятор выбирает printFunc с параметром String
В третий раз он вызывается с переменной.Какая это переменная?Это член LIMIT data1.Идем и проверяем план, чтобы увидеть его тип: final int
.final
хитро и может означать разные вещи в разных контекстах.На этот раз это означает, что переменная может быть установлена только один раз во время программы и не может быть изменена позже.Что теперь?Какой printFunc выбирает компилятор?Нет версии final int
.Как я уже говорил, компилятор пытается найти лучший, и в этом случае достаточно простого параметра int.Если он не может найти достаточно хорошее совпадение, он остановится и выведет сообщение об ошибке.