Как работает объектно-ориентированное программирование? - PullRequest
2 голосов
/ 28 марта 2010

Я не уверен в некоторых вещах в ООП.

Если у меня есть Class1, который имеет какое-то личное поле, например private Field field1, и сделать

getField1 () {
    return field1;
}

тогда у меня есть класс с конструктором

public Class2 (Field field) { 
    someMethod(field);
}

А потом я вызываю конструктор Class2 в Class3 как:

Class2 cl = new Class2(instanceOfClass1.getField1());

А теперь вопрос: я работаю с field1 из instanceOfClass1 в someMethod(field)?

Ответы [ 3 ]

5 голосов
/ 28 марта 2010

Это зависит от того, является ли field значением или ссылкой.

Типы значений копируются при передаче в качестве параметров. Ссылочные типы не являются; функция просто передает «ссылку», которая указывает на исходное значение, и любые изменения, которые она вносит, отражаются в исходном значении.

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

Edit: так как вы упомянули, что вы используете Java, вот короткая программа, которая демонстрирует типы значений и ссылок:

class ClassOne {
    public int myInt;
}

class ClassTwo {
    public int myInt;
    public ClassTwo(ClassOne c)
    {
        myInt = c.myInt;
        c.myInt = 3;
    }
}

public class main
{
    public static void main(String[] args)
    {
        ClassOne c = new ClassOne();
        c.myInt = 1;
        System.out.println("C1: " + c.myInt);

        ClassTwo c2 = new ClassTwo(c);
        System.out.println("C2: " + c2.myInt);
        System.out.println("C1: " + c.myInt);

    }
}

Запуск этой программы выдаст:

C1: 1
C2: 1
C1: 3

В этой программе ClassOne и ClassTwo содержат целочисленное поле - тип значения. ClassTwo принимает параметр ClassOne - ссылочный тип - в своем конструкторе и устанавливает свое собственное целочисленное поле на основе значения заданного им объекта ClassOne, а затем изменяет значение объекта ClassOne.

Поскольку классы являются ссылочными типами, изменение объекта ClassOne в конструкторе ClassTwo приводит к изменению исходного объекта . (В основной функции здесь это c.) Но поскольку целые числа являются типами значений, даже если c2 изменяет значение c.myInt в своем конструкторе, потому что он заранее устанавливает свое значение own , c2.myInt не затрагивается: он сохраняет исходный номер, потому что он был скопирован, а не на него есть ссылка.

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

2 голосов
/ 28 марта 2010

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

0 голосов
/ 28 марта 2010

Мне пришлось перечитать ваш вопрос два или три раза, чтобы убедиться, что я понял, о чем вы спрашиваете.

Подведем итог:

  • Существует Class1, который содержит атрибут поля (типа Field?), Который отправляется обратно его методом getField1 ().
  • Тогда существует Class2, который, очевидно, имеет конструктор, который принимает параметр объекта типа Field и содержит метод, который использует экземпляр Field для запуска локального метода в этом классе.
  • Затем вы используете третий класс для создания экземпляра Class2 и инициализации его с использованием экземпляра Field с использованием метода getField1 () из экземпляра Class1.

В случае Java, если вы выполнили необходимое создание экземпляра, это будет означать, что экземпляр Field в Class1 используется на протяжении всего процесса. Вы можете проверить это, используя System.out.println () (это даст вам символ @ с рядом странных чисел) или используя метод a.equals (b), общий для всех объектов.

Вот интересная ссылка о передаче объектов по значению: http://www.javaranch.com/campfire/StoryPassBy.jsp

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