2015-03-30 2 views
0

Я только начинаю изучать java, и наш учитель дал нам код для анализа и объяснения ему на следующей лекции. Я понимаю большую часть этого, однако у меня проблема с 1 строкой кода.java - попытка понять простой код

public class Test { 
public static void main(String[] args) { 
    PascalTriangle WTP; 
    try { 
     WTP = new PascalTriangle(Integer.parseInt(args[0])); 
    } catch (NegativeArraySizeException ex) { 
     System.out.println(args[0] + "\t- incorrect data"); 
     return; 
    } catch (NumberFormatException ex) { 
     System.out.println(args[0] + "\t- incorrect data"); 
     return; 
    } 

     for (int i = 1; i < args.length; i++) { 
     try { 
      System.out.println(args[i] + "\t-> " + WTP.wspolczynnik(Integer.parseInt(args[i]))); 
     } catch (ArrayIndexOutOfBoundsException ex) { 
        System.out.println(args[i] + "\t- incorrect number"); 
     } catch (NumberFormatException ex) { 
       System.out.println(args[i] + "\t- incorrect data"); 
     } 
     } 
}  

}

Остальная часть кода не важно, на мой вопрос, так что я пропустил его (это программа о треугольнике Паскаля). Я не понимаю эту строку:

PascalTriangle WTP; 

PascalTriangle это имя другого класса, отвечает за все операции в этой программе. Не могли бы вы объяснить мне, что происходит в этой строке кода? Это какой-то «ярлык», поэтому мы можем просто писать WTP, а не печатать PascalTriangle каждый раз? Прошу прощения, если мой вопрос выглядит глупым, но я не мог найти ответ самостоятельно, спасибо за помощь.

+1

Он объявляет переменную с именем WTP, которая потенциально может содержать ссылку на экземпляр класса PascalTriangle. – bmargulies

+2

Это (локальное) объявление переменной, в виде '[object type] [имя переменной]'. – MadProgrammer

ответ

2

Обратите внимание, где вы сообщаете int i = 1. На самом деле это сокращение для двух разных вещей: объявления переменных и инициализации. Кроме того, можно написать, что в двух частях:

int i; // declaration 
i = 1; // initialisation 

Декларация часть сообщает компилятору, что вы собираетесь для i представлять целочисленную переменную. Выражение инициализации устанавливает его значение в 1.

Таким же образом, у вас есть обе части по отношению к переменным WTP:

PascalTriangle WTP; // declaration 
WTP = new PascalTriangle(Integer.parseInt(args[0])); // initialisation 

Первый из этих двух линий говорит, что вы собираетесь иметь переменную WTP в этой функции, и что его типа будет PascalTriangle. Затем вы создаете новый PascalTriangle и назначаете его переменной.

WTP не является ярлыком для PascalTriangle. PascalTriangle - тип Class; WTP имеет тип PascalTriangle. Или, просто, PascalTriangle - это класс, а WTP - это экземпляр этого класса. Подумайте о различии между «собакой» и «моей собакой Фидо». «Моя собака Фидо» может иметь четыре ноги. «У собак» нет ног; или если бы мы посчитали, у нас были бы миллионы и миллионы. Но «моя собака Фидо» - прекрасный пример «собачья», если это имеет смысл. Точно так же вещь, которую мы назначаем WTP, является примером («экземпляр») PascalTriangle; вы могли бы иметь другие PascalTriangle, так же как я мог бы иметь другую собаку. Когда вы пишете WTP.wspolczynnik, это относится к методу экземпляра; если вы написали PascalTriangle.wspolczynnik, это будет работать только в том случае, если метод был объявлен как метод класса (с использованием ключевого слова static), например, «собака», имеющая популяцию, но «собака» имеет ноги.

0

Это какой-то «ярлык», поэтому мы можем просто писать WTP вместо того, чтобы печатать PascalTriangle каждый раз?

Сортировка:? Но на самом деле это не так, как вы должны думать об этом. Вместо этого рассмотрите разницу между class и object. PascalTriangle - это класс, WTP - это объект. Объект - это момент класса. В этом случае эта строка кода объявляет переменную WTP типа PascalTriangle.

Как аналогия, подумайте о классе как о чертежах для дома. Подумайте об объекте как о фактическом доме. Акт построения дома из чертежей подобен вызову конструктора класса. Возможно, он имеет несколько вариантов и создает экземпляр дома, основанный на чертежах.

В этом случае конструктор фактически не вызывался. Это будет выглядеть следующим образом:

PascalTriangle WTP = new PascalTriangle(); 

Таким образом, чтобы продолжить аналогию, в вашей строке кода дом не на самом деле был построен еще. Но были выбраны конкретные чертежи (тип класса) и зарезервирован лот (адрес памяти). В более поздней строке:

WTP = new PascalTriangle(Integer.parseInt(args[0])); 

Дом построен на этом участке.

Смежные вопросы