Когда загружаются переменные класса? - PullRequest
0 голосов
/ 22 апреля 2009

См. Два способа определения класса:

//definition: 1
public class MyClass{

    private MyObject obj = new MyObject();
    private String   str = "hello world";

    // constructor
    public MyClass(){

    }
}

// definition: 2
public class MyClass{

    private MyObject obj = null;
    private String   str = null;

    // constructor
    public MyClass(){
        obj = new MyClass();
        str = "HelloWorld";
    }    
}

Мой вопрос: когда загружаются переменные класса. Как они загружаются?

Как происходит их инициализация? Если их инициализация может произойти, как в определении 1, какова цель конструктора?

Какой способ определения класса является предпочтительным и почему? Одинаково ли поведение в C ++ / C # / Java или в разных?

Любые разъяснения по поводу вышесказанного приветствуются.

Ответы [ 3 ]

1 голос
/ 22 апреля 2009

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

Также, как всегда, порядок важен, если у вас есть поля, которые зависят от других полей для их инициализации. В некоторых языках, таких как ActionScript, это означает, что порядок объявлений определяет порядок инициализации:

Работает:

public class Foo
{
    private var bar:Array = [1, 2, 3];
    private var baz:Array = bar.concat([4, 5, 6]);
}

Не работает:

public class Foo
{
    private var baz:Array = bar.concat([4, 5, 6]);
    private var bar:Array = [1, 2, 3];
}
0 голосов
/ 22 апреля 2009

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

Вы, конечно, можете инициализировать их в явном коде конструктора (хотя сохраните для себя значение null, если вы собираетесь установить их в другое значение).

Вы спросили, для чего нужен конструктор - вы не можете делать все в инициализаторе. Что, если вам нужно зациклить или что-то?

0 голосов
/ 22 апреля 2009

Конструктор - это первая функция, которая запускается, когда экземпляр класса создается в объекте.

Переменные класса инициализируются во время создания экземпляра, затем сразу запускается конструктор.

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