Конструкторы Java - PullRequest
       18

Конструкторы Java

28 голосов
/ 24 февраля 2009

Я пытаюсь научиться задавать конструкторы классов в Java. Я начинаю понимать, что они указывают типы переменных экземпляра объектов, созданных из этого класса. Они также могут быть использованы для установки начальных значений переменных экземпляра. Следующий пример взят из учебника по Java на веб-сайте Sun:

public Bicycle(int startCadence, int startSpeed, int startGear) {
    gear = startGear;
    cadence = startCadence;
    speed = startSpeed;
}

Где в исходном коде ваших классов вы должны поместить конструктор (ы)?

Являются ли эти аргументы именами переменных ?: (int startCadence, int startSpeed, int startGear) или являются именами переменных, cadence и speed?

В чем разница между (int startCadence, int startSpeed, int startGear) и передачей, каденцией и скоростью?

В том маловероятном случае, когда мой преподаватель или какой-либо администратор из Общественного колледжа Солт-Лейк-Сити когда-либо сталкивался с этим вопросом, позвольте мне ясно изложить свои намерения. Этот вопрос размещен в величайшем духе академической честности. Я задаю этот вопрос, чтобы обратиться за общими советами и помощью в понимании правильного использования языка программирования Java. Я никоим образом не использую работу других и представляю ее как свою собственную работу. Я использую ответы, представленные здесь, в качестве общей помощи в моем понимании. Я делаю всю свою работу и не копирую работы, предоставленные людьми, отвечающими на мой вопрос.

Ответы [ 11 ]

35 голосов
/ 24 февраля 2009

Конструкторы могут появляться в любом месте кода для класса. Однако, по соглашению, большинство людей ставят их перед любыми другими функциями, которые не являются конструкторами.

Что касается имен переменных, то все 6 на самом деле являются именами переменных, но область действия отличается от сети. Те, которые указаны в качестве параметров для конструктора (startCadence, startSpeed, startGear), доступны только внутри конструктора. Другие 3 (снаряжение, частота вращения педалей, скорость), вероятно, являются общеклассовыми переменными, доступными для всех методов. Однако определение не отображается в вашем фрагменте кода. Полный класс будет выглядеть так:

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.
    }
}

Надеюсь, это поможет!

6 голосов
/ 24 февраля 2009

gear, cadence и speed - переменные-члены класса (объявленные в другом месте), а 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;

    }
}
5 голосов
/ 24 февраля 2009

Где в исходном коде ваших классов вы должны поместить конструктор (ы)?

Я использую следующее:

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"         


     } 
 }

Как вы видите, когда вы передаете значение конструктору, вы используете аргумент, и когда вы видите код конструктора, вы видите имя параметра (который получает этот аргумент), а затем оно присваивается атрибуту экземпляра.

3 голосов
/ 24 февраля 2009

Обычно я помещаю свои конструкторы в верхнюю часть моего файла после секций объявления переменных package, import, Javadoc и static / instance.

gear, cadence и speed - переменные класса, предположительно определенные где-то вне конструктора. startCadence, startSpeed ​​и startGear также являются переменными, но они являются параметрами, передаваемыми в конструктор.

Вы также можете увидеть что-то вроде этого:

public Bicycle(int cadence, int speed, int gear) {
    this.gear = gear;
    this.cadence = cadence;
    this.speed = speed;
}

, который устанавливает переменные класса из параметров с тем же именем.

3 голосов
/ 24 февраля 2009
  1. Это полностью зависит от вас. Я обычно начинаю со всех переменных, затем конструкторов, затем методов, но это всего лишь личные предпочтения.
  2. Имена аргументов совершенно не имеют значения, если вы не называете их так же, как ваши переменные. В этом примере gear, cadence и speed являются переменными.
  3. Вы (или кто-то другой) передаете три ints конструктору. Имена (startCadence, startSpeed и startGear называются формальными параметрами , и именно так вы можете идентифицировать аргументы. См. http://en.wikipedia.org/wiki/Parameter_(computer_science).
    gear, cadence и speed определены где-то еще в классе. Любой метод в классе может ссылаться на них.

Не волнуйтесь - если вы поработаете над этим, такие вещи скоро станут второй натурой.

О, и могу ли я предложить вам хорошую IDE? BlueJ предназначен для начинающих, а NetBeans и Eclipse для более опытных программистов. Подсветка исходного кода может быть неоценимой.

1 голос
/ 24 февраля 2009

Вам действительно нужна копия Head First Java

0 голосов
/ 03 ноября 2014
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;  
}
}
0 голосов
/ 24 февраля 2009

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. Затем конструктор инициализирует переменные-члены для их «начальных» соответствующих переменных.

0 голосов
/ 24 февраля 2009

Параметры (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);

Размещение конструктора не имеет значения, но обычно конструкторы помещаются в начале определения класса.

0 голосов
/ 24 февраля 2009

Основное различие между int startCadence и cadence заключается не в переменных, а в их объеме. Если переменная определена внутри метода, как конструктор, она будет существовать только внутри этого метода, но не снаружи. Если переменная определена в классе, она будет существовать везде в этом классе, такая переменная имеет глобальную область видимости. Переменная startCadence будет существовать только внутри конструктора, поэтому, если вы хотите использовать ее значение в другом месте, вы можете передать ее другой переменной с глобальной областью действия. Вот что здесь происходит: cadence = startCadence;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...