2016-04-06 2 views
0

Вот часть программы я пишу:программы без основного метода в Java и переменные

public class Triangle { 
double a, b, c; 
private boolean t,s,r,e,i; 
String Triangle, Scalene, Right; 
public Triangle(double a, double b, double c) { 
    //I dont know what to put here... 
    System.out.print(a + " " + b + " " + c); 

} 
public boolean isTriangle() { 
    t = true; 
    System.out.print(a + " " + b + " " + c); 
    if(a + b > c) { 
     if(a + c > b) { 
      if(b + c > a) { 
       //boolean remains true 
       t = true; 
      } 
     } 
    } 
    else { 
     //boolean is false 
     t = false; 
    } 
    return t; 
} 

Проблема, которую я имею, что мои переменные данные обыкновение передавать от одного метода к другому даже хотя переменные объявлены в классе. Часть моего задания состоит в том, чтобы работать с bluej (ужасная программа, которая есть), именно так я ввожу данные. Оператор печати показывает, что введенные данные хранятся в переменных в методе: Треугольник, но не в методе: isTriangle. Компилятор также не позволит мне использовать return a; или что-то в этом роде. Что я делаю не так?

+0

Да, потому что метод треугольника использует переменные внутри конструктора треугольника, но переменная в istriangle - это глобальные переменные, определенные в верхней части. Лучше всего было бы присвоить переменные значение для ваших глобальных переменных, подобных этому. a = a; this.b = b – LearningPhase

ответ

1

изменить код конструктора, как показано ниже

public Triangle(double a, double b, double c) { 

    this.a = a; 
    this.b = b; 
    this.c = c; 

    //I dont know what to put here... 
    System.out.print(a + " " + b + " " + c); 

} 

Вы должны установить значение в переменной класса сразу получил в конструкторе.

+0

Почему? Вам нужно объяснить, что делает OP неправильно. Именно об этом он и спросил. –

+0

Могу ли я узнать причину понижения? – S4beR

+0

См. Объяснение выше. –

1

Если вы задали свои глобальные поля классов из объявленного вами конструктора, a, b, c будут использоваться каждым способом, относящимся к ним.

public class Triangle { 
double a = 0.0; 
double b = 0.0; 
double c = 0.0; 
private boolean t,s,r,e,i; 
String Triangle, Scalene, Right; 
public Triangle(double a, double b, double c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
    System.out.print(a + " " + b + " " + c); 

} 
public boolean isTriangle() { 
    t = true; 
    System.out.print(a + " " + b + " " + c); 
    if(a + b > c) { 
     if(a + c > b) { 
      if(b + c > a) { 
       //boolean remains true 
       t = true; 
      } 
     } 
    } 
    else { 
     //boolean is false 
     t = false; 
    } 
    return t; 
} 
+0

Sweet! Это сработало! Спасибо. –

+0

И еще -1, это мило: P –

+0

Я не могу голосовать иначе. –

0

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

Давайте посмотрим на код

double a, b, c; 

public Triangle(double a, double b, double c) { 
    //I dont know what to put here... 
    System.out.print(a + " " + b + " " + c); 
} 

В приведенном выше варианте, значения a, b и c в конструктор не будет передавать на a, b и c полей в конструкторе.

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

Для передачи значений между вами необходимо их назначить. Но это вызывает вторую проблему. То, как вы назвали параметры конструктора, это shadowing соответствующие имена полей. Другими словами, в конструкторе идентификатор a относится к параметру, а не к полю. Таким образом, a = a; фактически будет значением параметра a для себя. Вместо этого вам нужно использовать this, чтобы квалифицировать ссылки на поля, которые были затенены. Thuss

public Triangle(double a, double b, double c) { 
    this.a = a; 
    this.b = b; 
    this.c = c; 
} 

Печатное утверждение показывает, что данные, которые я вошел хранится в переменных в методе: треугольник, но не в методе: isTriangle.

Собственно, это не то, что он показывает. Оператор печати в конструкторе фактически печатает значения параметров a, b и c. Теневое повторение.


Компилятор также обыкновение позвольте мне использовать возвращающие; или что-то в этом роде. Что я делаю не так?

Непонятно, где (или почему) вы пытаетесь установить return a;, но это не сработает в этом классе.

  • Если вы пытаетесь поместить это утверждение в конструктор, конструктор никогда не сможет вернуть значение.

  • Если вы пытаетесь положить его в метод isTriangle, что не будет работать, потому что тип возвращаемого значения для этого метода является boolean не double.


Теперь я хочу поговорить о некоторых других ошибок в коде (как написано)

double a, b, c; 

Это плохой выбор дизайна. Если у вас нет веских оснований для этого, вы должны объявить все свои переменные как private. Если вы этого не сделаете, то ваш класс Triangle будет «негерметичной абстракцией». Это не имеет большого значения в крошечном приложении, но в большей проблеме вы можете получить другие классы, считывающие или изменяющие значения этих полей вашего Triangle.

  • Изменение полей из другого класса обязан разорвать Triangle, и в большом и сложном классе это может быть трудно отследить, где произошло повреждение.
  • Даже если какой-либо другой класс просто читает не-частные поля, это означает, что у вас есть нежелательная зависимость («связь») между классом Triangle и другим классом или классами.

Следующая:

String Triangle, Scalene, Right; 

Те же проблемы, как и выше, и еще один (на самом деле два). Имена переменных/полей должны начинаться с строчной буквы. Такие имена, как Triangle, Scalene и Right, должны использоваться только для классов. (И другая проблема заключается в том, что у вас уже есть класс с именем Triangle ... что бы сделать жизнь «интересно».)

Наконец:

private boolean t ... 

Это на самом деле очень неправильно. В вашем коде t используется в методе isTriangle для хранения рабочей переменной. Он не должен быть объявлен как поле. Он должен быть объявлен как локальная переменная в этом методе.

Почему?Две причины:

  1. Делая t полем, а не локальная переменная, объявленная в методе isTriangle, вы чего это поле будет зарезервирован для времени жизни Triangle объекта. Это (небольшая) трата пространства, поскольку переменная только (в настоящее время) требуется на время вызова isInstance.

  2. Это более важная причина. Используя поле для хранения этой локальной переменной, вы сделали метод isTriangle не реентерабельным.

    • Если код был немного другим и isTriangle называют себя (полезным способом), то вложенный вызов isTriangle топтал копию вызывающего абонента из t.

    • Если код был немного иным и isTriangle может быть вызван из нескольких потоков, то вызовы одного потока могут попирать значения t, используемые другим потоком.

    Тот факт, что эти вещи может случиться означает, что ваш простой Triangle класс внезапно становится более трудным для понимания. Вам нужно рассмотреть больше вещей, прежде чем вы сможете быть уверены, что ваше приложение правильно, и останется таким.

+0

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

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