Мне трудно понять объекты и классы Java - PullRequest
8 голосов
/ 08 октября 2010

Пример 1

/**
 *Program Name: Cis36L0411.java  
 *Discussion:   Class -- Data Members ONLY
 *                       Method Members ONLY
 */ 
class Cis36L0411 
{
  public static void main( String[] args )
  {
    DataOnly data1 = new DataOnly();        

    System.out.println( "DataOnly\tLIMIT\t\t" + data1.LIMIT );
    System.out.println( "\t\tintMem\t\t" + data1.iMem );
    System.out.println( "\t\tdoubleMem\t" + data1.dMem );

    MethodOnly method1 = new MethodOnly();  

    method1.printFunc( 5 );
    method1.printFunc( "MethodOnly object!" );

    method1.printFunc( data1.LIMIT );

    return;
 }
}

class DataOnly
{
  final int LIMIT = 100; //constant and package mode or access
  int iMem;              //package mode or access
  double dMem;           //package mode or access
}

class MethodOnly
{
  void printFunc( int iA ) //package mode or access
  {
    System.out.println( "The int value is " + iA );

    return;
  }

  public void printFunc( String str ) //public mode or access
  {
   System.out.println( "The String is printed from  " + str );

    return;
  }
}

Я зашел на этот сайт и прочитал его, но я все еще в замешательстве.

  1. DataOnly data1 = new DataOnly(); Я знаю, что эта строка создает объект.Но может ли кто-нибудь нарушить эту линию для меня?Что делает каждое слово?DataOnly это класс?тип?data1 это переменная?Я думаю new DataOnly это ссылка на местоположение.А () это переменные в локации?Я прав?

  2. Как они печатали data1.LIMIT, data1.iMem, Data1.dMem?Они напечатали это, посмотрев на местоположение DataOnly()?DataOnly() справочный класс DataOnly?

  3. Я просто полностью потерялся во всем процессе MethodOnly объекта.

Ответы [ 9 ]

5 голосов
/ 08 октября 2010

1) DataOnly data1 = new DataOnly (); я знаю, что эта линия создает объект. Но может кто-то сломать эту линию для мне? Что делает каждое слово? DataOnly это класс? тип? Данные1 это переменная? Я думаю, что новый DataOnly является ссылка на местоположение. И () переменные в месте? Я исправить?

Строка означает создание переменной с именем «data1» типа DataOnly. Затем создайте новый объект типа «DataOnly» и укажите на него переменную.

2) Как они печатали data1.LIMIT, data1.iMem, Data1.dMem? Они печатали это, посмотрев на местоположение DataOnly ()? Ссылка на DataOnly () класс DataOnly?

DataOnly - это просто шаблон для объекта (класса). Для печати значений используется объект в памяти, созданный из этого шаблона.

3) Я просто полностью потерялся на Весь процесс MethodOnly объект.

Объекты могут содержать как данные, так и выполнять функции в зависимости от шаблона (класса), из которого они были созданы. Класс MethodOnly, по-видимому, определен так, чтобы содержать только код и никаких данных. Кажется, что класс DataOnly определен, чтобы просто хранить значения и не выполнять никаких действий.

Резюме
Я думаю, что самый простой способ думать об этом - это то, что класс является планом для объекта. Объекты создаются (используя ключевое слово «new») на основе этих чертежей и сохраняются в памяти. Таким образом, вся ваша работа будет выполнена с объектами, вы просто используете классы, чтобы сказать, какой тип объекта вы хотите.

4 голосов
/ 08 октября 2010

Поскольку здесь мы говорим об очень базовых объектно-ориентированных принципах, я собираюсь игнорировать выделение приведенного примера.Посмотрите на это так - у вас есть 5 основных понятий для понимания:

  • Класс - Класс в (как указано JohnFx) синей печати для чего-то.Аналогия будет синей печатью для вашего дома.Он описывает, как будет выглядеть дом, если он построен, как он будет отапливаться или охлаждаться, количество спален и т. Д.и установить его на основе определенного класса.Слово Instance часто используется в этом контексте.то есть "экземпляр класса".Это фактически означает то же самое.

    Итак, из синего шрифта дома (Класс) теперь мы можем построить дом (Объект).Вы можете иметь много объектов (экземпляров), созданных из одного чертежа (класса).Например, каждый дом на улице может быть создан из того же синего шрифта.«new MethodOnly ()» - это пример того, как вы создаете объект из класса в Java.

  • Переменная - переменная - это то, что указывает на объект и как вы его находите, когдатебе нужно что-то сделатьТо есть, если вы хотите спать в своем доме, вам нужно сначала найти свой дом.Ваш почтовый адрес (переменный) - это то, что вы ищете, чтобы найти дом.У каждого дома на улице будет свой уникальный адрес.

    Кроме того, все переменные могут указывать на один и тот же объект.т.е. если у вас есть адрес вашей улицы в вашем доме в записной книжке, вы можете написать его копию и передать кому-то еще, чтобы он мог прийти на вечеринку.Теперь есть две (переменные) ноты, каждая из которых указывает на один и тот же дом.

    Существуют два типа переменных, с которыми вы столкнетесь.Один для ссылки на объекты, как только что обсуждалось.И другой для содержания отдельных значений.Обычно номера.Они называются Примитивными переменными, потому что они не относятся к объектам, созданным из классов.

  • Методы - методы - это то, что может делать класс.Например, void printFunc( int iA ) {...} в вашем коде является примером метода.Это что-то делает.В нашей домашней аналогии вы можете нажать дверной звонок, чтобы предупредить кого-то, что вы у входной двери.Это метод: void RingDoorBell().

  • Свойство - наконец, есть свойства.Они выглядят и пахнут как переменные, и они есть.Почему они рассматриваются по-разному, потому что они объявлены как часть класса «синяя печать».Ваш класс DataOnly - это пример, который содержит 3 примитивных переменных Properties.

    Свойства - это одна из вещей, которые заставляют объектную ориентацию работать.Возвращаясь к нашим домам, каждый дом (Объект / Экземпляр) на улице мог быть из одного и того же чертежа (Класса), но все они выглядят по-разному.Разные цвета, количество спален и т. Д. Цвет и количество спален - это свойства класса «Дом».Давая им разные значения при строительстве домов (Instantiated), мы создаем вариации.

    Также возможно, как люди, перекрашивающие свой дом в другой цвет, изменять стоимость имущества.Он будет оставаться на этом значении, пока существует дом (Объект).

2 голосов
/ 08 октября 2010

Много понятий в этом примере. Возможно, стоит взглянуть на более простые. Но я постараюсь объяснить.

Первый вопрос : Давайте сначала посмотрим на это:

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.Если он не может найти достаточно хорошее совпадение, он остановится и выведет сообщение об ошибке.

1 голос
/ 08 октября 2010
1) DataOnly data1 = new DataOnly(); I know this line creates an object. 
But can someone break this line down for me? What does each word do? 

DataOnly = имя класса, переменная которого вы хотите.

DataOnly data1 = объявление переменной с именем data1 типа DataOnly

new = ключевое слово, используемое для создания экземпляров объектов типа (instantiation = creation)

new DataOnly() = создает экземпляр объекта типа DataOnly т.е. выделяет память в куче согласно определению типа DataOnly и возвращает ссылку на этот "экземпляр", на который будут указывать data1.

DataOnly() = стандартный конструктор типа DataOnly, который вызывается во время создания

2) How did they print data1.LIMIT, data1.iMem, Data1.dMem? 
Did they print it by looking at the location of DataOnly()? 
Does DataOnly() reference class DataOnly?

После построения переменная data1 указывает на место, где зарезервирована память для объекта типа DataOnly, т.е. объекта с переменными-членами LIMIT, iMem и dMem.

Итак, когда вы делаете data1.LIMIT в своем коде, думайте о data1 как о базовом адресе памяти объекта, и выполнение .LIMIT сместит его на соответствующее значение, чтобы получить место, зарезервированное для переменной LIMIT в этом объекте.

То же самое относится к iMem и dMem.

Логика для смещения и достижения правильного места в памяти для получения значения и т. Д. Невидима для программиста

3) I'm just completely lost on the whole process of the MethodOnly object

MethodOnly на самом деле является классом, а не объектом

MethodOnly method1 = new MethodOnly();

После вышеприведенного утверждения method1 является объектом типа MethodOnly.

MethodOnly класс больше похож на класс Utility, так как у него нет собственных данных. Единственная цель состоит в том, чтобы получить входные данные через два метода типа int / string и распечатать их.

1 голос
/ 08 октября 2010

1) DataOnly data1 = new DataOnly ();
DataOnly похож на тип переменной.Думайте как String data1, но вместо этого это класс, который вы создали.data1 - это объект типа DataOnly.new используется для создания нового экземпляра этого класса.DataOnly () является конструктором.То есть, он говорит компьютеру сделать объект.

2) LIMIT, iMem, & dMem - переменные внутри data1.Вы могли бы так же легко сказать data1.LIMIT = 9000;Это просто доступ к переменным внутри объекта data1.

3) Метод только является объектом, который использует методы.Метод - это просто другое имя функции, но он находится внутри объекта.Стандартная практика заключается в доступе и изменении переменных объекта с помощью методов вместо прямого доступа к переменной:

public class Methods {
  public int getVariable() {
    return variable;
  }

  public void setVariable(int i) {
    variable = i;
  }

  private int variable;
}

Если вы не знали, private используется для того, чтобы сделать переменную видимой для методов в объекте., но ничего вне объекта.В этом случае вы не могли бы вызвать System.out.println(data1.variable); Вы должны будете использовать метод getVariable.

Надеюсь, это прояснит ситуацию.

1 голос
/ 08 октября 2010

Это действительно неестественный пример. Цель класса - предоставить шаблон для создания объектов. Объект - это набор данных, упакованных вместе с методами, которые работают с этими данными.

Да, data1 - это переменная. new DataOnly() выделяет память для объекта (выделяя пространство для перечисленных переменных), используя DataOnly в качестве шаблона для него. data1 является ссылкой на место, где хранится объект, поэтому data1.iMem ссылается на поле iMem, которое является частью объекта, на который ссылается data1.

Что касается метода MethodOnly, то это пример объекта, у которого есть методы. В этом примере методы - это просто функции, которые вы можете вызывать, но поскольку они определены как методы экземпляра, вам нужно создать экземпляр объекта типа MethodOnly, прежде чем вы сможете вызвать метод. В этом случае было бы больше смысла, если бы для класса были объявлены переменные экземпляра - идея метода экземпляра заключается в том, что ссылка на экземпляр неявно передается в метод, чтобы ваш метод мог получить доступ к переменным экземпляра для этого объекта поэтому здесь может показаться странной техническая необходимость создания объекта для вызова метода, и неудивительно, что вы запутались.

По сути, ключевое слово new, за которым следуют имя типа и parens, выделяет память, а затем устанавливает переменную слева для указателя на эту ячейку памяти.

1 голос
/ 08 октября 2010

DataOnly - это тип объекта.

Данные1 - это объект.

new Data () вызывает конструктор объекта, который в основном выделяет новую область в памяти для объекта, а также запускает любой код в конструкторе.

1 голос
/ 08 октября 2010

в этом коде:

DataOnly data1 = new DataOnly();

Первый DataOnly - это тип, data1 - это специфичное для объекта имя. new DataOnly() означает, что вы устанавливаете data1 для нового экземпляра класса DataOnly. «()» обозначает аргументы, в данном случае ни одного, для отправки в функцию конструктора для изменения конкретного экземпляра data1 DataOnly.

Я не совсем понимаю ваш второй вопрос.

Надеюсь, это поможет.

0 голосов
/ 08 октября 2010

Возможно, вы захотите просмотреть Java Trails . В частности, Изучение языка Java начинается с подробного обзора объектов и классов, используемых в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...