2015-10-02 3 views
1

Я новичок в программировании, это одна из наших первых объектно-ориентированных программ, которые мы делаем в классе. Я чувствую, что использовал «это». больше, чем мне нужно, но моя программа работает правильно, и я получаю правильный вывод. Могу ли я вернуть переменную без использования этого? Я думаю, мой вопрос: this.variablename ссылается на переменную параметра или поле данных, объявленное в начале моего класса?Я правильно использовал это ключевое слово в своем классе?

import java.util.Date; 

public class Account{ 

    private int id = 0; 
    private double balance = 0; 
    private static double annualInterestRate = 0.00; 
    private Date dateCreated; 

    public Account(){} 

    public Account(int id, double balance){ 
     this.id = id; 
     this.balance = balance; 
    } 

    public int getId(){ 
     return this.id; 
    } 

    public void setId(int id){ 
     this.id = id; 
    } 

    public double getBalance(){ 
     return this.balance; 
    } 

    public void setBalance(double balance){ 
     this.balance = balance; 
    } 

    public double getAnnualInterestRate(){ 
     return this.annualInterestRate; 
    } 

    public void setAnnualInterestRate(double annualInterestRate){ 
     this.annualInterestRate = annualInterestRate; 
    } 

    public Date getDateCreated(){ 
     return this.dateCreated = new Date(); 
    } 

    public double getMonthlyInterestRate(){ 
     return (this.annualInterestRate/12); 
    } 

    public double getMonthlyInterest(){ 
     return ((this.annualInterestRate/100)/12) * this.balance; 
    } 

    public void withdraw(double amount){ 
     this.balance -= amount; 
    } 

    public void deposit(double amount){ 
     this.balance += amount; 
    } 

} 

Вот мой основной метод и тест класс:

public class AccountTest{ 

    public static void main(String[] args){ 

     Account myObject = new Account(112233, 20000.00); 
     myObject.setAnnualInterestRate(4.5); 
     myObject.withdraw(2500.00); 
     myObject.deposit(3000.00); 

     System.out.printf("The account balance is $%,.2f.", myObject.getBalance()); 
     System.out.printf("\nThe monthly interest is $%,.2f.", myObject.getMonthlyInterest()); 
     System.out.print("\nThe account was created at " + myObject.getDateCreated()); 
    } 
} 
+1

Что произошло, когда вы попробовали? То, что, по вашему мнению, может быть ошибочным в использовании вами этого? –

+0

this.somevariable относится к члену экземпляра класса. – bhspencer

+1

'private static double annualInterestRate = 0.00;' <- static там не так, FWIW. Он будет «работать» (как в, компилировать), но вызывать причудливое поведение, когда для разных экземпляров задается другая процентная ставка. См. Http://stackoverflow.com/questions/11579953/static-fields-on-a-null-reference-in-java за то, почему это разрешено, хотя и запутанно. – user2864740

ответ

4

Я правильно использовал это ключевое слово в своем классе?

Да. Неправильно использовать this, когда это абсолютно не нужно. Некоторые люди утверждают, что это делает цель более ясной. В любом случае это стилистическое решение.

В моих геттерах я могу вернуть переменную без использования этого?

Да.

Я думаю, что мой вопрос в том, что это.variablename ссылается на переменную параметра или поле данных, объявленное в начале моего класса?

this.name относится к полю НЕ параметр.

nameможет относится к параметру или полю. Если есть параметр (в области видимости) и поле с тем же именем, оно будет ссылаться на параметр. Поэтому, если Вы писали:

public void setId(int id){ 
    id = id; 
} 

вы бы просто присваивая значение параметра id себе. «Исправить» для моего разбитого метода setId - либо использовать this, либо изменить имя параметра; например сделайте это newId.

+0

Спасибо Стивен. Меня просто смущало то, относится ли оно к полю параметров или данных. Я просто удалил его со всех моих геттеров, и программа по-прежнему работает правильно. – JakeFromStateFarm

0

(это) может быть использован внутри метода или конструктора класса. (this) работает как ссылка на текущий объект, метод которого или конструктор вызывается. это ключевое слово можно использовать для ссылки на любого члена текущего объекта из «метода экземпляра» или «конструктора».

+0

Спасибо Aven, поэтому он относится к полю данных текущего объекта. – JakeFromStateFarm

+0

=) Думаю, вы сейчас это понимаете. – Aven

0

Аналог, который я использую, заключается в том, что код, который вы пишете, будет сценарием, подобным этому для игры, который раздаётся всем участникам (объектам). Актеры все играют разные роли (например, классы), и поэтому они будут способны делать разные вещи по воле режиссера. Поэтому, когда выполняется код, это обычно происходит в контексте некоторого экземпляра. Вы можете прямо сказать актеру обратиться к себе с ключевым словом this (например, this.id).

В большинстве случаев вам не нужно использовать ключевое слово this, потому что код не будет двусмысленным (мы все узнаем, о чем говорит актер, если она просто говорит ID). НО у вас есть пример того, что это необходимо; когда у вас есть локальные переменные/параметры метода с тем же именем, что и поле, эта переменная называется теневым полем. Это отлично! Вам просто нужно это использовать.переменная для ссылки на поле и переменная для ссылки на локальную в этом контексте.

Другое использование для этого, которое вы не затронули при его использовании, чтобы вызвать собственный конструктор объектов; «явный вызов конструктора». Например, ваш пустой метод Account() вместо этого может содержать оператор this(100, 0);, чтобы вызвать другой метод-конструктор с двумя параметрами.

Источник: here.

+0

Спасибо за аналогию с Люком! Это хороший способ подумать об этом. Теперь я понимаю, что, поскольку я использую те же самые имена переменных, которые я должен различать, я просто не был уверен, что он ссылается на передаваемый класс или параметр. Спасибо, сэр. – JakeFromStateFarm

0

В ваших геттерах вы можете опустить с помощью this, он все равно будет работать, потому что нет локальных переменных с тем же именем.

Вы не должны использовать this для доступа к статической переменной. Правильный способ доступа к annualInterestRate - сначала указать класс. например: return ((Account.annualInterestRate/100)/12) * this.balance;

0

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

import java.util.Date; 

public class Account { 

    private int id = 0; 
    private double balance = 0; 
    private static double annualInterestRate = 0.00; 
    private Date dateCreated; 

    public Account() { 
    } 

    public Account(int id, double balance) { 
     this.id = id; 
     this.balance = balance; 
    } 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public double getBalance() { 
     return balance; 
    } 

    public void setBalance(double balance) { 
     this.balance = balance; 
    } 

    public double getAnnualInterestRate() { 
     return annualInterestRate; 
    } 

    public void setAnnualInterestRate(double annualInterestRate) { 
     this.annualInterestRate = annualInterestRate; 
    } 

    public Date getDateCreated() { 
     return dateCreated = new Date(); 
    } 

    public double getMonthlyInterestRate() { 
     return (annualInterestRate/12); 
    } 

    public double getMonthlyInterest() { 
     return ((annualInterestRate/100)/12) * balance; 
    } 

    public void withdraw(double amount) { 
     balance -= amount; 
    } 

    public void deposit(double amount) { 
     balance += amount; 
    } 

} 

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

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