Мне трудно понять объекты и классы Java

Пример 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( "DataOnlytLIMITtt" + data1.LIMIT );
    System.out.println( "ttintMemtt" + data1.iMem );
    System.out.println( "ttdoubleMemt" + 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. Я просто полностью потерялся во всем процессе

9 ответов


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

строка означает создание переменной с именем "data1" типа DataOnly. Затем создайте новый объект типа "DataOnly" и сделайте переменная точка к нему.

2) как они печатали data1.ПРЕДЕЛ, данных1.iMem, Data1.мдси? Они печати смотрите на расположение DataOnly()? Does DataOnly() reference класс DataOnly?

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

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

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

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


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

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

  • Object-объект-это то, что вы получаете, когда вы выделяете некоторое пространство памяти и устанавливаете его на основе определенного класса. В этом контексте часто используется слово Instance. т. е. "экземпляр класса". Фактически это означает одно и то же.

    Итак, из дома blue print (Class) теперь мы можем построить дом (Object). Вы можете иметь много объектов (экземпляров), созданных из одной синей печати (класса). Например, каждый дом на улице может быть создан из тот же синий шрифт. "new MethodOnly ()" - это пример того, как вы создаете объект из класса в java.

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

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

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

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

  • свойство-наконец, есть свойства. Они выглядят и пахнут, как переменные и их. Почему они иначе расценивается потому, что они объявлены как часть класса "blue print". Класс DataOnly пример, который содержит 3 примитивных переменных свойств.

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

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


много концепций в этом примере. Было бы разумно взглянуть на более простые. Но я попытаюсь объяснить.

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

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, потому что класс-это "чертеж", объект-это то, что мы создали с помощью этого чертежа.

the () означает, что мы вызываем конструктор без параметров.

для вашего второго вопроса: если вы поймите мое предыдущее объяснение, тогда это не должно быть проблемой. Мы хотим что - то сделать с объектом-распечатать его члены. Хорошо, у нас есть рекомендация. The . (точка) используется для доступа к частям объекта. data1.LIMIT в конечном итоге будет означать, что мы берем объект, на который ссылается data1, и смотрим на его предельный член.

третий вопрос:: объекты могут не только хранить информацию, но и делать вещи. Например, вы, вероятно, использовали CD-плеер раньше. Если вы смотрите на него, вы можете увидеть, сколько треков имеет текущий компакт-диск. Но не только это, вы можете нажать кнопку воспроизведения, и он будет играть песню для вас. Посмотрим, как это будет выглядеть на Java.

class CDPLayer
{
    public int numberOfTracks = 12;

    public void play()
    {
        System.out.println("I'm playing! Yay!");
    }
}

это простой CD-плеер, и нет никакого способа изменить компакт-диск в нем:)

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

в третий раз он вызывается с переменной. Какая это переменная? Это предельный член data1. Мы идем и проверяем чертеж, чтобы увидеть его тип:final int. final это сложно и может означать разные вещи в разных контекстах. На этот раз это означает, что переменная может быть установлена только один раз во время программы и не может быть изменить позже. И что теперь? Какой printFunc выбирает компилятор? Нет final int версия. Как я уже говорил, компилятор пытается найти лучший, и в этом случае достаточно простой параметр int. Если он не может найти достаточно хорошее совпадение, он остановится и напечатает сообщение об ошибке.


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

Data1-это объект.

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


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

2) LIMIT, iMem, & dMem являются переменными внутри data1. Вы можете так же легко сказать данных1.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.

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


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

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

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

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


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 i.e выделяет память в куче согласно 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 i.e объект с переменными-членами 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 класс больше похож на служебный класс так как у него нет собственных данных. Единственная цель состоит в том, чтобы взять входы через свои 2 метода типа int / string и распечатать их.


в этом коде:

DataOnly data1 = new DataOnly();

первый DataOnly тип, data1 - это имя объекта. new DataOnly() просто означает, что ты ставишь data1 к новому экземпляру DataOnly класса. В "() " назначить аргументы, в данном случае none, для отправки в функцию конструктора для изменения конкретного экземпляра,data1, of DataOnly.

Я не совсем понял ваш второй вопрос.

надеюсь, что это помогает.


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