Проблема, с которой я сталкиваюсь, заключается в том, что мои переменные данные не передаются из одного метода в другой, даже если переменные объявлены в классе.
Давайте посмотрим на код
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
для хранения рабочей переменной. Он не должен быть объявлен как поле. Он должен быть объявлен как локальная переменная в этом методе.
Почему?Две причины:
Делая t
полем, а не локальная переменная, объявленная в методе isTriangle
, вы чего это поле будет зарезервирован для времени жизни Triangle
объекта. Это (небольшая) трата пространства, поскольку переменная только (в настоящее время) требуется на время вызова isInstance
.
Это более важная причина. Используя поле для хранения этой локальной переменной, вы сделали метод isTriangle
не реентерабельным.
Если код был немного другим и isTriangle
называют себя (полезным способом), то вложенный вызов isTriangle
топтал копию вызывающего абонента из t
.
Если код был немного иным и isTriangle
может быть вызван из нескольких потоков, то вызовы одного потока могут попирать значения t
, используемые другим потоком.
Тот факт, что эти вещи может случиться означает, что ваш простой Triangle
класс внезапно становится более трудным для понимания. Вам нужно рассмотреть больше вещей, прежде чем вы сможете быть уверены, что ваше приложение правильно, и останется таким.
Да, потому что метод треугольника использует переменные внутри конструктора треугольника, но переменная в istriangle - это глобальные переменные, определенные в верхней части. Лучше всего было бы присвоить переменные значение для ваших глобальных переменных, подобных этому. a = a; this.b = b – LearningPhase