Конструктор Цепочки в Java - PullRequest
3 голосов
/ 15 ноября 2010

У меня есть небольшое сомнение относительно результатов программы конструирования, которую я показал ниже:

class Cube {

    int length;
    int breadth;
    int height;
    public int getVolume() {
        return (length * breadth * height);
    }
    Cube() {
        this(10, 10);
        System.out.println("Finished with Default Constructor of Cube");
    }
    Cube(int l, int b) {
        this(l, b, 10);
        System.out.println("Finished with Parameterized Constructor having
                                    2 params of Cube");
    }
    Cube(int l, int b, int h) {
        length = l;
        breadth = b;
        height = h;
        System.out.println("Finished with Parameterized Constructor having
                                    3 params of Cube");
    }
}

public class SpecialCube extends Cube {

    int weight;
    SpecialCube() {
        super();
        weight = 10;
    }
    SpecialCube(int l, int b) {
        this(l, b, 10);
        System.out.println("Finished with Parameterized Constructor having
                                    2 params of SpecialCube");
    }
    SpecialCube(int l, int b, int h) {
        super(l, b, h);
        weight = 20;
        System.out.println("Finished with Parameterized Constructor having
                                    3 params of SpecialCube");
    }
    public static void main(String[] args) {
        SpecialCube specialObj1 = new SpecialCube();
        SpecialCube specialObj2 = new SpecialCube(10, 20);
        System.out.println("Volume of SpecialCube1 is : "
                + specialObj1.getVolume());
        System.out.println("Weight of SpecialCube1 is : "
                + specialObj1.weight);
        System.out.println("Volume of SpecialCube2 is : "
                + specialObj2.getVolume());
        System.out.println("Weight of SpecialCube2 is : "
                + specialObj2.weight);
    }
}

ВЫВОД:

Finished with Parameterized Constructor having 3 params of SpecialCube
Finished with Parameterized Constructor having 2 params of SpecialCube
Volume of SpecialCube1 is : 1000
Weight of SpecialCube1 is : 10
Volume of SpecialCube2 is : 2000
Weight of SpecialCube2 is : 20

Сомнение относительно OutPut в том, как достигаются "1000", "10", "2000" и "20"?

В основном классе мы создали два объекта:

SpecialCube specialObj1 = new SpecialCube();
SpecialCube specialObj2 = new SpecialCube(10, 20);

Первый с «Без параметров» и Второй с «Два параметра», Первый конструктор Cube () с «Без параметров» имеет только два значения this(10,10), а тот с «Два параметра» имеет значения

Cube(int l, int b) 
    {this(l, b, 10);}

Я не понимаю, как генерируются Below OutPuts.

Volume of SpecialCube1 is : 1000
Weight of SpecialCube1 is : 10
Volume of SpecialCube2 is : 2000
Weight of SpecialCube2 is : 20

Пожалуйста, кто-нибудь может мне помочь!

Спасибо, Дэвид

Ответы [ 6 ]

7 голосов
/ 15 ноября 2010

Когда вы звоните SpecialCube(), поток выглядит так (псевдокод):

SpecialCube()
  -> Cube()
     -> Cube(10,10)
        -> Cube(10,10,10)
           l:=10, b:=10, h:=10
           print message "Finished with Parameterized Constructor having 3 params of Cube"
        print message "Finished with Parameterized Constructor having 2 params of Cube"
     print message "Finished with Default Constructor of Cube"
  weight:=10

И в конце у вас есть куб, построенный с (l,b,h) = (10,10,10)

4 голосов
/ 15 ноября 2010

Хорошо, давайте рассмотрим один случай за раз. Для первой версии цепочка конструктора выглядит так:

SpecialCube()
Cube()
Cube(10, 10)
Cube(10, 10, 10)

Таким образом, куб имеет объем 1000 и вес по умолчанию 10 (как указано в конструкторе SpecialCube без параметров).

Во втором случае цепочка конструктора выглядит так:

SpecialCube(10, 20)
SpecialCube(10, 20, 10)
Cube(10, 20, 10)

и вес задается равным 20 конструктором SpecialCube(int l, int b, int h) без параметров - таким образом, мы имеем объем 2000 и вес 20.

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

3 голосов
/ 15 ноября 2010

Я думаю, это очевидно.specialObj1 создается во время конструктора по умолчанию, который вызывает конструктор с 1 аргументом, который вызывает конструктор с 3 аргументами.Каждый вызов отправляет 10 как значение измерения куба.Итак, объем 10 * 10 * 10 = 1000;

вес не метод.Это поле, которое инициализируется по умолчанию, и конструктор с тремя аргументами.Из-за того, что конструктор первым делом вызывает это (...), не имеет значения, какое значение присваивается этой переменной в других конструкторах.Первый конструктор в цепочке фактически переопределяет все ранее установленные значения.Это причина, почему вес = 10 для первого объекта.

Второй объект создается с использованием 2-аргументного конструктора, который вызывается с параметрами 10 и 20, поэтому объем равен 10 * 20 * 10 = 2000. (второй10 устанавливается, когда конструктор 2args вызывает конструктор 3args.) В случае второго объекта вес задается конструктором 3-args, поскольку конструктор 2-args не переопределяет это значение.

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

1 голос
/ 17 марта 2014

Здесь под потоком исполнения,

шаг 1: когда «SpecialCube specialObj1 = новый SpecialCube ();» будет выполнен конструктор по умолчанию "SpecialCube ()".

Шаг 2: Теперь «Super ()» будет вызываться для вызова «Cube» суперкласса SpecialCube.

Шаг 3: Теперь будет выполнено «this (10,10)» в суперклассе «cube», который вызовет конструктор 2 параметров из того же класса «cube», т.е. «Cube (int l, int b)». «путем передачи параметров (l = 10, b = 10).

Шаг 4: Теперь "this (l, b, 10) будет выполняться с фактическим параметром, переданным на шаге № 3, это" this (10,10,10) ", который вызовет 3-параметризованный конструктор" Cube (int l "). , int b, int h) ", с передачей значений из шага # 3 это будет похоже на" Cube (int l = 10, int b = 10, int h = 10) ".

Шаг 5: переменные экземпляра, такие как длина = 10, ширина = 10, высота = 10 для объекта «specialObj1», созданного на шаге № 1.

Шаг 6: Тогда java назначит переменную «Weight» как 10 в конструкторе «SpecialCube ()». (См. Шаг № 1)

Теперь посмотрим выполнение метода для объекта "SpecialCube ()" (я просто рассматриваю только "specialObj1".

Шаг 7: System.out.println («Том SpecialCube1 is:» + specialObj1.getVolume ()); Когда этот оператор выполнится, java вызовет метод суперкласса "Cube" "getVolume ()", поскольку подкласс "SpecialCube" наследует его по ключевому слову "extends", см. ниже в вашем подклассе.

открытый класс SpecialCube расширяет Cube

шаг 8: Шаг 1 - 5, уже назначенная переменная экземпляра как «длина = 10, ширина = 10, высота = 10», ваш получаемый объем как «1000».

шаг 9: "System.out.println (" Weight of SpecialCube1 is: "+ specialObj1.weight); - этот оператор выводит значение переменной" weight "как" 10 "из-за шага № 6.

Надеюсь, это объяснит причину. Попробуйте тот же поток для объекта "specialObj2".

0 голосов
/ 04 марта 2013

здесь эти выходы генерируются, потому что

объем SpecialCube1 составляет: 1000 // когда вызывается функция getVolume в первый раз, она получает 10,10,10 в качестве аргументов соблюдайте следующий код, где значения l, b, h присваиваются длине, ширине, высоте

Cube(int l, int b, int h) {
//l=10,b=10,h=10

System.out.println(l);
System.out.println(b);
System.out.println(h);
    length = l;
    breadth = b;
    height = h;

Вес SpecialCube1 составляет: 10 // в первом строении вес присваивается 10 (т. е. 1-му объекту)

Объем SpecialCube2 составляет: 2000 // во второй раз функция getVolume получает аргументы из специального куба (3 аргумента, т.е. 10,20,10;

SpecialCube(int l, int b, int h) 
{
//l=10,b=20,h=10
    super(l, b, h);
    System.out.println(l);
System.out.println(b);
System.out.println(h);
    weight = 20;

Вес SpecialCube2 составляет: 20 // во 2-м строении вес присваивается 20 (т.е. 1-му объекту)

SpecialCube (int l, int b, int h) { // л = 10, B = 20, Н = 10

    super(l, b, h);
    System.out.println(l);
System.out.println(b);
System.out.println(h);
    weight = 20;
0 голосов
/ 15 ноября 2010

Разбить его:

SpecialCube1 - это значение по умолчанию , поэтому вызывается конструктор по умолчанию SpecialCube(), который, в свою очередь, вызывает super(), который по умолчанию создает Cube(), что объясняет первые два.

, где SpecialCube2 следует правильной цепочке конструктора SpecialCube.

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