Конструкторы Java
Я пытаюсь узнать, как указать конструкторы классов в Java. Я начинаю понимать, что они определяют типы переменных экземпляра объектов, созданных из этого класса. Они также могут использоваться для установки начальных значений переменной экземпляра. Ниже приведен пример учебника Java на веб-сайте Sun:
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
Где в исходном коде ваших классов вы должны поместить конструктор (ы)?
Являются ли эти аргументы именами переменных?: (int startCadence, int startSpeed, int startGear) или являются передачей, каденцией и скоростью имена переменных?
В чем разница между (int startCadence, int startSpeed, int startGear) и передачей, каденцией и скоростью?
В маловероятном случае, когда мой преподаватель или любой администратор из Community College из Солт-Лейк-Сити сталкивается с этим вопросом, позвольте мне сделать мои намерения ясными. Этот вопрос опубликован в величайшем духе академической честности. Я задаю этот вопрос, чтобы получить общий совет и помочь в понимании правильного способа использования языка программирования Java. Я никоим образом не использую работу других и не представляю ее как свою собственную работу. Я использую ответы, представленные здесь, как общую помощь в моем понимании. Я выполняю всю свою работу и не копирую работу, предоставленную людьми, отвечающими на мой вопрос.
Ответы
Ответ 1
Конструкторы могут появляться в любом месте кода для класса. Однако, по соглашению, большинство людей ставят их перед любыми другими функциями, которые не являются конструкторами.
Что касается имен переменных, все 6 являются фактически именами переменных, но область действия отличается. Те, которые указаны как параметры для конструктора (startCadence, startSpeed, startGear), доступны только внутри конструктора. Другие 3 (передача, частота вращения, скорость), вероятно, являются переменными класса, доступными для всех методов. Однако это определение не показано в фрагменте кода. Полный класс будет выглядеть как mroe like:
class Bicycle
{
// class-level variables
private int gear;
private int cadence;
private int speed;
// constructor
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
// another method (not a constructor)
public void ShiftUp() {
gear = gear + 1; // notice the 'gear' variable is available here too.
}
}
Надеюсь, что это поможет!
Ответ 2
передача, частота и скорость - это переменные-члены класса (объявленные в другом месте), а startCadence, startSpeed и startGear - это параметры функции.
class Bicycle
{
private int gear, cadence, speed;
public Bicycle(int startCadence, int startSpeed, int startGear)
{
// set the value of member variables from passed parameters
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
}
Ответ 3
Где в исходном коде ваших классов вы должны поместить конструктор (ы)?
Я использую следующее:
package statement ....
import statements....
public class MyClass {
// instance attributes
private int i;
// class attribute
private static int MAX;
// static methods
public static int getClassCount() {
}
// Constructor!!
public MyClass() { // constructor.
}
// public methods
// protected methods
// private methods
// public static void main
}
Но они могут идти куда угодно. Я чувствую, что лучше поставить вещи в порядок видимости. Например, я предпочитаю публичные методы перед частными методами (поэтому, если я ищу конкретный публичный метод, я знаю его в верхней части файла) По той же причине я обычно помещаю конструктор в начало.
Являются ли эти аргументы именами переменных?:
Не нужно, вы можете назвать их так, как хотите. Обычно я использую одно и то же имя.
... или являются передачей, каденцией и скоростью имен переменных?...
Они являются именами экземпляров
В чем разница между (int startCadence, int startSpeed, int startGear) и передачей, каденцией и скоростью?
Первыми являются имена параметров для конструктора, а первые - имена атрибутов объекта, которые он сам.
Возьмите этот другой пример:
public class Person {
private String name; // a person has a name.
public Person( String nameParameter ) {
this.name = nameParameter;
}
public String toString() {
return "My name is : " + this.name;
}
public static void main( String [] args ) {
// creates a new "instance" and assign "Patrick" as its name.
Person one = new Person("Patrick");
System.out.println( one ); // prints "My name is: Patrick"
// each person have its own name.
Person two = new Person("Oscar");
System.out.println( two ); // prints "My name is: Oscar"
}
}
Как вы видите, когда вы передаете значение конструктору, вы используете аргумент, и когда вы видите код конструктора, вы видите имя параметра (которое получает этот аргумент), а затем оно присваивается атрибуту экземпляра.
Ответ 4
- Это полностью зависит от вас. Я обычно начинаю со всех переменных, потом с конструкторами, затем с методами, но это просто личные предпочтения.
- Имена аргументов совершенно неактуальны, если вы не называете их такими же, как переменные. В этом примере переменными являются
gear
, cadence
и speed
.
- Вы (или кто-то есть) передаете три конструктора
ints
. Имена (startCadence
, startSpeed
и startGear
называются формальными параметрами, и они могут идентифицировать аргументы. См. http://en.wikipedia.org/wiki/Parameter_(computer_science).
gear
, cadence
и speed
определены где-то еще в классе. Любой метод в классе может ссылаться на них.
Не волнуйтесь - если вы будете работать над этим, это будет совсем другое направление.
О, и могу ли я предложить, чтобы вы получили хорошую среду IDE? BlueJ должен быть хорошим для начинающих, а NetBeans и Eclipse для более опытных программистов. Выделение исходного кода может быть неоценимым.
Ответ 5
Я обычно помещаю свои конструкторы в верхнюю часть моего файла, после разделов объявления переменных пакета, импорта, Javadoc и статического/экземпляра.
Передача, частота и скорость - это переменные класса, предположительно определенные вне конструктора. startCadence, startSpeed и startGear также являются переменными, но они являются параметрами, переданными конструктору.
Вы также можете увидеть что-то вроде этого:
public Bicycle(int cadence, int speed, int gear) {
this.gear = gear;
this.cadence = cadence;
this.speed = speed;
}
который устанавливает переменные класса из параметров с тем же именем.
Ответ 6
Вам действительно нужна копия Head First Java
Ответ 7
Собственно, аргументы конструктора не должны храниться в качестве переменных-членов объекта. Вот пример:
class NumberAsString {
private String numAsStr;
public NumberAsString(double number) {
this.numAsStr = Double.toString(number);
}
}
В этом примере аргумент конструктора фактически не хранится нигде, но его значение необходимо для вычисления одного или нескольких значений переменных-членов.
Поведение, которое вы видели, где все аргументы хранятся непосредственно в качестве переменных-членов, довольно распространено. Особенно для определенных классов, которые просто предоставляют методы "getter" и "setter" для своих переменных-членов (без предоставления каких-либо функций вычисления или преобразования). В java-мире эти классы обычно называются "beans". (Который, да, очень глупое имя.)
Ответ 8
Основное различие между int startCadence и каденцией заключается не в переменных, а в их объеме. Если переменная определена внутри метода, как конструктор, она будет существовать только внутри этого метода, но не снаружи. Если переменная определена в классе, она будет существовать всюду в этом классе, такая переменная имеет глобальную область видимости.
Переменная startCadence wll существует только внутри конструктора, поэтому, если вы хотите использовать ее значение в другом месте, вы можете передать ее другой переменной с глобальной областью. Вот что происходит здесь: cadence = startCadence;
Ответ 9
Параметры (int startCadence, int startSpeed, int startGear)
являются аргументами конструктора, и они устанавливают поля Bicycle cadence
, speed
и gear
. Они доступны только внутри конструктора. gear
, cadence
и speed
- это переменные экземпляра, уникальные для каждого экземпляра Bicycle и ссылающиеся на другие методы.
Аргументы конструктора позволяют вам предоставлять параметры для инициализации объекта. В этом примере вы можете создать объект Bicycle с шестерней 1, каденцией 0 и скоростью 0, например:
Bicycle bike = new Bicycle(0, 0, 1);
Или вы можете создать движущийся велосипед, где каденция составляет 60 об/мин, а скорость составляет 10 миль/ч, на 3-й передаче, например:
Bicycle bike = new Bicycle(60, 10, 3);
Размещение конструктора не имеет значения, но обычно конструкторы помещаются в начале определения класса.
Ответ 10
1) Расположение конструктора не имеет значения ни малейшим образом. Однако, исходя из соглашения, я бы сделал это следующим образом:
public class Bicycle {
public int gear, cadence speed;
public Bicycle(int startCadence, int startSpeed, int startGear) {
gear = startGear;
cadence = startCadence;
speed = startSpeed;
}
public void otherFunction1() {}
public void otherFunction2() {}
public void otherFunction3() {}
}
2) шестерня, каденция и скорость являются переменными-членами класса; они принадлежат каждому велосипеду и являются разными переменными для каждого велосипеда. startCadence, startSpeed и startGear, однако, являются локальными переменными, которые принадлежат только этой функции. Когда я вызываю
new Bicycle(10, 15, 5);
startCadence устанавливается в 10, для параметра startSpeed установлено значение 15, а startGear - 5. Затем конструктор инициализирует переменные-члены в их "начальные" соответствующие переменные.
Ответ 11
public class Account
{
private static final Exception InsufficientFundsException = null;
private int accountNumber;
private double availableBalance;
private int pin;
public Account(int account, int pin,double amount )
{
this.accountNumber = account;
this.pin = pin;
this.availableBalance = amount;
}
public void credit(double amount)
{
this.availableBalance= this.availableBalance+amount;
}
public void debit(double amount) throws Exception
{
if(this.availableBalance>=amount)
{
this.availableBalance= this.availableBalance-amount;
}
else
{
throw new InsufficientFundsException();
}
}
public int getAccountNumber()
{
return accountNumber;
}
public double getAvailableBalance()
{
return availableBalance;
}
public String toString()
{
return "Account="+accountNumber+"pin="+pin+"balance"+availableBalance;
}
public boolean validatePIN(int pin)
{
if(this.pin==pin)
return true;
else return false;
}
}