Подтвердить что ты не робот

Конструкторы 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. Я никоим образом не использую работу других и не представляю ее как свою собственную работу. Я использую ответы, представленные здесь, как общую помощь в моем понимании. Я выполняю всю свою работу и не копирую работу, предоставленную людьми, отвечающими на мой вопрос.

4b9b3361

Ответ 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;  
}
}