Bir nechta konstruktor yordamida obyektlarni qanday yarataman?

Quyidagi kodni va haydovchi dasturini yozdim, lekin har ikkala konstruktordan foydalanib, bank hisob obyektlarini qanday yaratishni bilmayman. Bitta konstruktor dastlabki balansni oladi va ikkinchi konstruktor pulsiz hisobni ochadi. Bundan tashqari, hisob balansi amal qilishni tekshirishi kerakmi?

Majburiy emas, men quyidagilarni amalga oshirishi mumkin:

Bank hisob raqamini tavsiflovchi bir qism sifatida to'lovni o'z ichiga olishi mumkin. BankAccount klassini kerak bo'lganda yangilang. Foydalanuvchida har bir hisob uchun to'lov miqdorini belgilash va u usulni metodga kiritish kerak. Pullik funksiyasini ko'rsatish uchun haydovchi dasturiga kod qo'shing. (Kimdir menga bu savolni berishi mumkin)

//Bank Account class   
import java.text.NumberFormat;

public class BankAccount {

private String ownerName;
private String accountId;
private double accountBalance;

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

public String getOwnerName() {
    return ownerName;
}

public void setOwnerName(String ownerName) {
    this.ownerName = ownerName;
}

public String getAccountId() {
    return accountId;
}

public void setAccountId(String accountId) {
    this.accountId = accountId;
}

public double getAccountBalance() {
    return accountBalance;
}

public void setAccountBalance(double accountBalance) {
    if(accountBalance >= 0) { 
        this.accountBalance = accountBalance;           
    } else {
        System.out.println("Due to your negative account balace, you will be issued a fee.\n");
    }
}

public void withdraw(double amount) { 
    if(amount > 0 && amount < accountBalance) { 
        accountBalance -= amount;           
    } else {
        System.out.println("Invalid withdraw amount! Please try again.\n");
    }
}

public void deposit(double amount) { 
    if(amount > 0) { 
        accountBalance += amount;
    } else {
        System.out.println("Invalid deposit amount! Please try again.\n");
    }
}

public String toString() { 
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();
    return "Account Owner's Name: " + ownerName + "\n" + "Account ID: " + accountId + "\n" + 
           "Balance in the account: " + currencyFormatter.format(accountBalance);
}
}

//Driver Program
public class BankAccountDriver {

public static void main(String[] args) {

    BankAccount myAccount = new BankAccount("Smith", "123jahgsd", 1200);                      
    myAccount.withdraw(0.453);
    myAccount.deposit(1000.1);
    System.out.println(myAccount);
}
}
0
Faqat yozuv uchun: javobingizni tasdiqlash mavzusini biroz muhokama qilish uchun javobni yangiladim.
qo'shib qo'ydi muallif GhostCat, manba
Faqat yozuv uchun: javobingizni tasdiqlash mavzusini biroz muhokama qilish uchun javobni yangiladim.
qo'shib qo'ydi muallif GhostCat, manba
Faqat yozuv uchun: javobingizni tasdiqlash mavzusini biroz muhokama qilish uchun javobni yangiladim.
qo'shib qo'ydi muallif GhostCat, manba
Siz nima so'rayotganligingiz aniq emas, lekin BankAccount ning ikkita konstruktoriga kirish balansi kiradi. Bir savol so'rashda siz haqiqatan ham tozalashingiz kerak - bu aniq bo'lishi kerak va post uchun bitta savol.
qo'shib qo'ydi muallif Jon Skeet, manba
Siz nima so'rayotganligingiz aniq emas, lekin BankAccount ning ikkita konstruktoriga kirish balansi kiradi. Bir savol so'rashda siz haqiqatan ham tozalashingiz kerak - bu aniq bo'lishi kerak va post uchun bitta savol.
qo'shib qo'ydi muallif Jon Skeet, manba
Siz nima so'rayotganligingiz aniq emas, lekin BankAccount ning ikkita konstruktoriga kirish balansi kiradi. Bir savol so'rashda siz haqiqatan ham tozalashingiz kerak - bu aniq bo'lishi kerak va post uchun bitta savol.
qo'shib qo'ydi muallif Jon Skeet, manba
Bundan tashqari, agar hisobvaraqda ishonchliligi tekshiruvlar mavjud bo'lsa, qanday tekshiruv turi mavjud? Postive, nol yoki salbiy muvozanatlar OK
qo'shib qo'ydi muallif Scary Wombat, manba
Bundan tashqari, agar hisobvaraqda ishonchliligi tekshiruvlar mavjud bo'lsa, qanday tekshiruv turi mavjud? Postive, nol yoki salbiy muvozanatlar OK
qo'shib qo'ydi muallif Scary Wombat, manba
Bundan tashqari, agar hisobvaraqda ishonchliligi tekshiruvlar mavjud bo'lsa, qanday tekshiruv turi mavjud? Postive, nol yoki salbiy muvozanatlar OK
qo'shib qo'ydi muallif Scary Wombat, manba

14 javoblar

Barcha yaxshi javoblar, lekin ular aslida "haqiqiy" masalani "sog'inmaydilar"; va siz: mumkin , chunki siz konstruktorlarni yo'q qilmang.

Siz talablarni bajarish uchun zarur bo'lgan kodni yaratasiz. Boshqacha aytganda: siz orqaga qadam qo'yasiz; bank hisobingiz sinfingiz uchun mo'ljallangan dizayn "mo'ljallangan foydalanish hollari" ni o'ylab ko'ring siz.

Va u erda e'tiborga olinadigan narsalar: bunday turli yo'llari yordamida yaratilishi mumkin bo'lgan qochish sinflarni.

Misol: bo'sh id/egasi maydonlariga ruxsat berish juda xavflidir. Ushbu maydonlar null qiymatlari bilan qoldiriladi; va shuning uchun siz bu erda va u yerda juda ko'p tekshirishga muhtojsiz; va agar bu erda yoki u erda unutgan bo'lsangiz; ertami-kechmi (tez orada) NullPointerExceptions-da ishlaysiz.

Va shuni yodda tutingki, sizning narsalaringiz vakili (model!) "Haqiqat" degan ma'noni anglatadi. Aslida, bank hisobvarag'i egasi bo'lmasa; yoki id.

Shu ma'noda sizning sinfingizdagi aqlli amalga oshirish juda ham ko'p ko'rinadi:

public class BankAccount {
  private final String owner;
  private final String id;
  private double currentBalance;

  public BankAccount(String owner, String id) {
    this(ownwer, id, 0);
  }

  public BankAccount(String owner, String id, double currentBalance) {
    this.owner = owner;
    ...

Eslatmalar:

  • Siz egasini/kimligini o'zgartirmoqchimisiz, shuning uchun ularni yakuniy qilishingiz kerak; va shuning uchun ushbu maydonlar uchun setter usullari yo'q
  • Haqiqiy dunyo yechimida siz ismlar yoki identifikatorlarni ifodalash uchun satrlarni ishlatmaysiz, lekin aniq sinflar
  • Siz hech qachon valyuta </​​strong> ni ko'rsatish uchun double dan foydalanasiz. Bu superbasic narsa: pul suzuvchi nuqta raqamlari yordamida ifodalanmasligi kerak! (Siz BigDecimal sinfiga qaraysiz yoki ikki marta o'rniga int dan foydalanishingiz mumkin (va 1,75 $ ni 175 tsent)
  • Haqiqiy real dunyoga bir qarash: bugungi kunda bank hisob raqamini "joriy muvozanat" ga ega bo'lmaysiz. Buning o'rniga, bank hisobi hodisalarning tarixiga (depozitlarni va to'lovlarni amalga oshiruvchi operatsiyalarni bildiruvchi) bog'liq bo'lishi mumkin.

Yakuniy nuqta: Sizning joriy mashqingiz uchun "pulni qaytarish"/"depozit" uchun "tasdiq" bu "yaxshi"; "haqiqiy dunyoda" tekshirishda ko'plab boshqa joylarda ham bo'lishi mumkin. (mening dastlabki bayonotimga qaytib kelaman: barchasi sizning modelingizdan kelib chiqadi, sodda model, bank hisobining o'zi "narsalarni tasdiqlash" deb aytish mumkin, lekin yanada aniqroq yechim sizning "qoidalar", " qonunlar "va" tasdiqlash "ga oid barcha mavzular).

4
qo'shib qo'ydi
Albatta, albatta. Oxir-oqibat bu "mashq" kodidir. Biroq, hisob qaydnomangizning tashqarisida kabi mantiqiy fikrlarni qo'yishingiz mumkin. BankAccount ob'ektini olgan va ba'zi bir so'rovni olib tashlaydigan "WithdrawlValidator" classini yaratishingiz mumkin. Keyin bu tekshiruvchining klassi pul mablag'lari qonuniyligini aniqlash uchun qoidalar/ma'lumotni o'z ichiga oladi; va u sizga "haq" ni qaytarishi mumkin. Shunday qilib, sizning kodingiz tekshiruvchidan so'raydi: "X uchun hisobni X ga tenglashtira olaman"; va tasdiqlovchi sizni "ha/yo'q" deb aytadi; shuningdek, tegishli to'lov haqida ma'lumot beradi.
qo'shib qo'ydi muallif GhostCat, manba
@ScaryWombat Xo'sh, egasi "modeli qanday" modeliga kiradi. Aslida siz "egasining nomi" dan foydalanolmaysiz, ammo u yerda ba'zi "egasi id" va, albatta, yakuniy bo'lishi kerak ;-)
qo'shib qo'ydi muallif GhostCat, manba
@AndyTurner Menimcha, bu uzoq davom etishi mumkin. Men uchun muhim nuqta: siz bir nechta </​​b> quruvchi bo'lsangiz, siz teleskop qilishdan ko'ra. Mustaqil narsalarni qiladigan konstruktorlarga ega bo'lish sizning sinfingiz, ehtimol, bu ikki qismga bo'linishi kerakligini ko'rsatadi.
qo'shib qo'ydi muallif GhostCat, manba
@ScaryWombat Bu mashq uchun bu yerda bo'lishi mumkin; lekin yaxshi; haqiqiy dunyoda bank hisoblari egalarini o'zgartirmaydilar. Siz pulni bir hisobdan ikkinchisiga ko'chirsangiz bo'ladi, lekin butun hisob.
qo'shib qo'ydi muallif GhostCat, manba
Ko'pincha kelishib olindi; lekin men "teleskop" dan ko'ra toza dizaynerlarga aytmoqchimanki, konstruktorlar faqat bitta konstruktorga ega bo'lib, ism va identifikatorni oladilar. Keyin balansni o'rnatish uchun depozit usulidan foydalaning.
qo'shib qo'ydi muallif Andy Turner, manba
nuqta tanlangan ;-)
qo'shib qo'ydi muallif Scary Wombat, manba
Ha, xotinim ham shunga o'xshash hisobi bor edi va u turmushga chiqqanida ismini o'zgartira olmadi.
qo'shib qo'ydi muallif Scary Wombat, manba
juda yaxshi fikrlar bo'lsa-da, balki egasi bo'lishi mumkin
qo'shib qo'ydi muallif Scary Wombat, manba
Sizga katta rahmat! Lekin overdraft haqini to'ldirishni istasam, hisobvaraqni hisobga olishni tasdiqlash uchun salbiy hisoblanmaysizmi? Men sizning kodimni tekshirishni amalga oshirish ustida ishladim, ammo bu ko'rsatmaning ma'nosini tushuntirib berasizmi: "Bank hisob raqamini tavsiflaydigan bir qismni o'z ichiga olishi kerak. Foydalanuvchining har bir hisob uchun to'lov miqdorini belgilashi va usuli. "
qo'shib qo'ydi muallif coderrr, manba
Tushungan! Bu shovqinni aniqlaganingiz uchun tashakkur :)
qo'shib qo'ydi muallif coderrr, manba

Barcha yaxshi javoblar, lekin ular aslida "haqiqiy" masalani "sog'inmaydilar"; va siz: mumkin , chunki siz konstruktorlarni yo'q qilmang.

Siz talablarni bajarish uchun zarur bo'lgan kodni yaratasiz. Boshqacha aytganda: siz orqaga qadam qo'yasiz; bank hisobingiz sinfingiz uchun mo'ljallangan dizayn "mo'ljallangan foydalanish hollari" ni o'ylab ko'ring siz.

Va u erda e'tiborga olinadigan narsalar: bunday turli yo'llari yordamida yaratilishi mumkin bo'lgan qochish sinflarni.

Misol: bo'sh id/egasi maydonlariga ruxsat berish juda xavflidir. Ushbu maydonlar null qiymatlari bilan qoldiriladi; va shuning uchun siz bu erda va u yerda juda ko'p tekshirishga muhtojsiz; va agar bu erda yoki u erda unutgan bo'lsangiz; ertami-kechmi (tez orada) NullPointerExceptions-da ishlaysiz.

Va shuni yodda tutingki, sizning narsalaringiz vakili (model!) "Haqiqat" degan ma'noni anglatadi. Aslida, bank hisobvarag'i egasi bo'lmasa; yoki id.

Shu ma'noda sizning sinfingizdagi aqlli amalga oshirish juda ham ko'p ko'rinadi:

public class BankAccount {
  private final String owner;
  private final String id;
  private double currentBalance;

  public BankAccount(String owner, String id) {
    this(ownwer, id, 0);
  }

  public BankAccount(String owner, String id, double currentBalance) {
    this.owner = owner;
    ...

Eslatmalar:

  • Siz egasini/kimligini o'zgartirmoqchimisiz, shuning uchun ularni yakuniy qilishingiz kerak; va shuning uchun ushbu maydonlar uchun setter usullari yo'q
  • Haqiqiy dunyo yechimida siz ismlar yoki identifikatorlarni ifodalash uchun satrlarni ishlatmaysiz, lekin aniq sinflar
  • Siz hech qachon valyuta </​​strong> ni ko'rsatish uchun double dan foydalanasiz. Bu superbasic narsa: pul suzuvchi nuqta raqamlari yordamida ifodalanmasligi kerak! (Siz BigDecimal sinfiga qaraysiz yoki ikki marta o'rniga int dan foydalanishingiz mumkin (va 1,75 $ ni 175 tsent)
  • Haqiqiy real dunyoga bir qarash: bugungi kunda bank hisob raqamini "joriy muvozanat" ga ega bo'lmaysiz. Buning o'rniga, bank hisobi hodisalarning tarixiga (depozitlarni va to'lovlarni amalga oshiruvchi operatsiyalarni bildiruvchi) bog'liq bo'lishi mumkin.

Yakuniy nuqta: Sizning joriy mashqingiz uchun "pulni qaytarish"/"depozit" uchun "tasdiq" bu "yaxshi"; "haqiqiy dunyoda" tekshirishda ko'plab boshqa joylarda ham bo'lishi mumkin. (mening dastlabki bayonotimga qaytib kelaman: barchasi sizning modelingizdan kelib chiqadi, sodda model, bank hisobining o'zi "narsalarni tasdiqlash" deb aytish mumkin, lekin yanada aniqroq yechim sizning "qoidalar", " qonunlar "va" tasdiqlash "ga oid barcha mavzular).

4
qo'shib qo'ydi
Albatta, albatta. Oxir-oqibat bu "mashq" kodidir. Biroq, hisob qaydnomangizning tashqarisida kabi mantiqiy fikrlarni qo'yishingiz mumkin. BankAccount ob'ektini olgan va ba'zi bir so'rovni olib tashlaydigan "WithdrawlValidator" classini yaratishingiz mumkin. Keyin bu tekshiruvchining klassi pul mablag'lari qonuniyligini aniqlash uchun qoidalar/ma'lumotni o'z ichiga oladi; va u sizga "haq" ni qaytarishi mumkin. Shunday qilib, sizning kodingiz tekshiruvchidan so'raydi: "X uchun hisobni X ga tenglashtira olaman"; va tasdiqlovchi sizni "ha/yo'q" deb aytadi; shuningdek, tegishli to'lov haqida ma'lumot beradi.
qo'shib qo'ydi muallif GhostCat, manba
@ScaryWombat Xo'sh, egasi "modeli qanday" modeliga kiradi. Aslida siz "egasining nomi" dan foydalanolmaysiz, ammo u yerda ba'zi "egasi id" va, albatta, yakuniy bo'lishi kerak ;-)
qo'shib qo'ydi muallif GhostCat, manba
@AndyTurner Menimcha, bu uzoq davom etishi mumkin. Men uchun muhim nuqta: siz bir nechta </​​b> quruvchi bo'lsangiz, siz teleskop qilishdan ko'ra. Mustaqil narsalarni qiladigan konstruktorlarga ega bo'lish sizning sinfingiz, ehtimol, bu ikki qismga bo'linishi kerakligini ko'rsatadi.
qo'shib qo'ydi muallif GhostCat, manba
@ScaryWombat Bu mashq uchun bu yerda bo'lishi mumkin; lekin yaxshi; haqiqiy dunyoda bank hisoblari egalarini o'zgartirmaydilar. Siz pulni bir hisobdan ikkinchisiga ko'chirsangiz bo'ladi, lekin butun hisob.
qo'shib qo'ydi muallif GhostCat, manba
Ko'pincha kelishib olindi; lekin men "teleskop" dan ko'ra toza dizaynerlarga aytmoqchimanki, konstruktorlar faqat bitta konstruktorga ega bo'lib, ism va identifikatorni oladilar. Keyin balansni o'rnatish uchun depozit usulidan foydalaning.
qo'shib qo'ydi muallif Andy Turner, manba
nuqta tanlangan ;-)
qo'shib qo'ydi muallif Scary Wombat, manba
Ha, xotinim ham shunga o'xshash hisobi bor edi va u turmushga chiqqanida ismini o'zgartira olmadi.
qo'shib qo'ydi muallif Scary Wombat, manba
juda yaxshi fikrlar bo'lsa-da, balki egasi bo'lishi mumkin
qo'shib qo'ydi muallif Scary Wombat, manba
Tushungan! Bu shovqinni aniqlaganingiz uchun tashakkur :)
qo'shib qo'ydi muallif coderrr, manba
Sizga katta rahmat! Lekin overdraft haqini to'ldirishni istasam, hisobvaraqni hisobga olishni tasdiqlash uchun salbiy hisoblanmaysizmi? Men sizning kodimni tekshirishni amalga oshirish ustida ishladim, ammo bu ko'rsatmaning ma'nosini tushuntirib berasizmi: "Bank hisob raqamini tavsiflaydigan bir qismni o'z ichiga olishi kerak. Foydalanuvchining har bir hisob uchun to'lov miqdorini belgilashi va usuli. "
qo'shib qo'ydi muallif coderrr, manba

Siz qaysi konstruktordan foydalanmoqchi bo`lsangiz moslamalarni yaratasiz. Masalan, birinchi konstruktordan foydalanish uchun siz kabi uchta parametr kerak,

BankAccount first = new BankAccount("Bob", "ID45", 400.50);

va siz ikkinchi parametrni talab qiladigan ikkinchi konstruktordan foydalanish uchun muvozanat shunga o'xshash,

BankAccount second = new BankAccount(400.50);

Ikkovi ham BankAccount misollarini yaratadi, bundan farqli o'laroq, birinchi bank hisobida ownerName va accountId bo'lishi kerak Ikkinchi bank hisobi String qiymatlarini bo'shatish uchun belgilangan maydonlarga ega bo'ladi. Biroq, ikkinchi ob'ekt 400 ob'ektning dastlabki balansidan farqli o'laroq 0 balansiga ega bo'ladi

EDIT: Like user ScaryWombat suggested, there is a flaw in your second constructor because if you want to define an object with a balance of 0 then there's no point in adding a balance parameter. Also, in this case it would be advisable to give default values to your other fields as well,

public BankAccount() {
    ownerName = "unknown";
    accountId = "unknown";
    accountBalance = 0;
}

Shunday qilib, bu tuzuvchi bilan BankAccount misolini yaratganingizda, u asl qiymati, "noma'lum", "noma'lum" va 0 bo'ladi.

BankAccount third = new BankAccount();

Bundan tashqari, ish haqi qismi uchun faqatgina to'lovi deb atalgan BankAccount sinfida boshqa maydon yaratibgina qolmay, foydalanuvchining uning haqini belgilashga ruxsat berish usuli,

private double fee;
.
.
.
public void setFee (double fee) {
   this.fee = fee;
}

Asosiy usulda esa, foydalanuvchi quyidagi imkoniyatlardan foydalanishi mumkin:

BankAccount account = new BankAccount("Fred", "ID145", 400);
account.setFee(15); //this will set the fee to 15
1
qo'shib qo'ydi
@ScaryWombat yaxshi nuqtasi Buni eslatish uchun javobimni tahrir qildim. Taklif uchun rahmat!
qo'shib qo'ydi muallif Chris Gong, manba
@ RSon1234 rost javobni tahrir qilish uchun javob berdi.
qo'shib qo'ydi muallif Chris Gong, manba
Bu BankAccount second = yangi BankAccount (400.50); ​​ va accountBalance
qo'shib qo'ydi muallif Scary Wombat, manba
@ScaryWombat rost, lekin OP bu konstruktorni aniqlaydi, Chris emas
qo'shib qo'ydi muallif Sentry, manba
To'g'ri, bu to'g'ri. Biroq, siz ikkinchi konstruktorlar parametringizning ma'nosiz ekanligini qo'shishingiz mumkin. Siz hisob balansini 0 ga o'zgartirasiz. Nima uchun parametr qo'yish kerak?
qo'shib qo'ydi muallif RSon1234, manba

Siz qaysi konstruktordan foydalanmoqchi bo`lsangiz moslamalarni yaratasiz. Masalan, birinchi konstruktordan foydalanish uchun siz kabi uchta parametr kerak,

BankAccount first = new BankAccount("Bob", "ID45", 400.50);

va siz ikkinchi parametrni talab qiladigan ikkinchi konstruktordan foydalanish uchun muvozanat shunga o'xshash,

BankAccount second = new BankAccount(400.50);

Ikkovi ham BankAccount misollarini yaratadi, bundan farqli o'laroq, birinchi bank hisobida ownerName va accountId bo'lishi kerak Ikkinchi bank hisobi String qiymatlarini bo'shatish uchun belgilangan maydonlarga ega bo'ladi. Biroq, ikkinchi ob'ekt 400 ob'ektning dastlabki balansidan farqli o'laroq 0 balansiga ega bo'ladi

EDIT: Like user ScaryWombat suggested, there is a flaw in your second constructor because if you want to define an object with a balance of 0 then there's no point in adding a balance parameter. Also, in this case it would be advisable to give default values to your other fields as well,

public BankAccount() {
    ownerName = "unknown";
    accountId = "unknown";
    accountBalance = 0;
}

Shunday qilib, bu tuzuvchi bilan BankAccount misolini yaratganingizda, u asl qiymati, "noma'lum", "noma'lum" va 0 bo'ladi.

BankAccount third = new BankAccount();

Bundan tashqari, ish haqi qismi uchun faqatgina to'lovi deb atalgan BankAccount sinfida boshqa maydon yaratibgina qolmay, foydalanuvchining uning haqini belgilashga ruxsat berish usuli,

private double fee;
.
.
.
public void setFee (double fee) {
   this.fee = fee;
}

Asosiy usulda esa, foydalanuvchi quyidagi imkoniyatlardan foydalanishi mumkin:

BankAccount account = new BankAccount("Fred", "ID145", 400);
account.setFee(15); //this will set the fee to 15
1
qo'shib qo'ydi
@ScaryWombat yaxshi nuqtasi Buni eslatish uchun javobimni tahrir qildim. Taklif uchun rahmat!
qo'shib qo'ydi muallif Chris Gong, manba
@ RSon1234 rost javobni tahrir qilish uchun javob berdi.
qo'shib qo'ydi muallif Chris Gong, manba
Bu BankAccount second = yangi BankAccount (400.50); ​​ va accountBalance
qo'shib qo'ydi muallif Scary Wombat, manba
@ScaryWombat rost, lekin OP bu konstruktorni aniqlaydi, Chris emas
qo'shib qo'ydi muallif Sentry, manba
To'g'ri, bu to'g'ri. Biroq, siz ikkinchi konstruktorlar parametringizning ma'nosiz ekanligini qo'shishingiz mumkin. Siz hisob balansini 0 ga o'zgartirasiz. Nima uchun parametr qo'yish kerak?
qo'shib qo'ydi muallif RSon1234, manba

Siz qaysi konstruktordan foydalanmoqchi bo`lsangiz moslamalarni yaratasiz. Masalan, birinchi konstruktordan foydalanish uchun siz kabi uchta parametr kerak,

BankAccount first = new BankAccount("Bob", "ID45", 400.50);

va siz ikkinchi parametrni talab qiladigan ikkinchi konstruktordan foydalanish uchun muvozanat shunga o'xshash,

BankAccount second = new BankAccount(400.50);

Ikkovi ham BankAccount misollarini yaratadi, bundan farqli o'laroq, birinchi bank hisobida ownerName va accountId bo'lishi kerak Ikkinchi bank hisobi String qiymatlarini bo'shatish uchun belgilangan maydonlarga ega bo'ladi. Biroq, ikkinchi ob'ekt 400 ob'ektning dastlabki balansidan farqli o'laroq 0 balansiga ega bo'ladi

EDIT: Like user ScaryWombat suggested, there is a flaw in your second constructor because if you want to define an object with a balance of 0 then there's no point in adding a balance parameter. Also, in this case it would be advisable to give default values to your other fields as well,

public BankAccount() {
    ownerName = "unknown";
    accountId = "unknown";
    accountBalance = 0;
}

Shunday qilib, bu tuzuvchi bilan BankAccount misolini yaratganingizda, u asl qiymati, "noma'lum", "noma'lum" va 0 bo'ladi.

BankAccount third = new BankAccount();

Bundan tashqari, ish haqi qismi uchun faqatgina to'lovi deb atalgan BankAccount sinfida boshqa maydon yaratibgina qolmay, foydalanuvchining uning haqini belgilashga ruxsat berish usuli,

private double fee;
.
.
.
public void setFee (double fee) {
   this.fee = fee;
}

Asosiy usulda esa, foydalanuvchi quyidagi imkoniyatlardan foydalanishi mumkin:

BankAccount account = new BankAccount("Fred", "ID145", 400);
account.setFee(15); //this will set the fee to 15
1
qo'shib qo'ydi
@ RSon1234 rost javobni tahrir qilish uchun javob berdi.
qo'shib qo'ydi muallif Chris Gong, manba
@ScaryWombat yaxshi nuqtasi Buni eslatish uchun javobimni tahrir qildim. Taklif uchun rahmat!
qo'shib qo'ydi muallif Chris Gong, manba
Bu BankAccount second = yangi BankAccount (400.50); ​​ va accountBalance
qo'shib qo'ydi muallif Scary Wombat, manba
@ScaryWombat rost, lekin OP bu konstruktorni aniqlaydi, Chris emas
qo'shib qo'ydi muallif Sentry, manba
To'g'ri, bu to'g'ri. Biroq, siz ikkinchi konstruktorlar parametringizning ma'nosiz ekanligini qo'shishingiz mumkin. Siz hisob balansini 0 ga o'zgartirasiz. Nima uchun parametr qo'yish kerak?
qo'shib qo'ydi muallif RSon1234, manba

har ikkala quruvchi yordamida bir bank hisob obyektini yaratishingiz mumkin emas. Siz yangi ob'ektni yaratish uchun faqat ikkita konstruktordan birini chaqirasiz. Shunday qilib, siz:

BankAccount account = new BankAccount("Sweeper", "ABCDEF", 10000);

yoki:

BankAccount account = new BankAccount(100000);

Sizning ikkinchi konstruktoringiz parametrining ma'nosiz ekanligini unutmang, chunki parametr nima bo'lishidan qat'i nazar, balansni ishga tushirasiz:

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

Menimcha, bu mantiqiyroq:

public BankAccount() {
    this.accountBalance = 0;
}

Ikkinchi savolingizga kelsak, men sizlarga bir necha maslahatlar beraman.

Sinfga fee deb nomlangan yangi maydonni kiritishingiz kerak. Buning uchun olib qo'yuvchilar va sozlovchilarni qo'shing.

1
qo'shib qo'ydi
Aslida, men sizni noto'g'ri tushunganman. Javob berildi.
qo'shib qo'ydi muallif Sweeper, manba
bir nechta konstruktordan yordamida moslamalarni qanday yaratish kerak?
qo'shib qo'ydi muallif AxelH, manba
O'ylaymanki, quyidagi talablar haqida shubhalanardim: Bir konstruktor dastlabki balansni oladi va ikkinchi konstruktor pul yo'q hisobni ochadi. Men muvozanatni nolga o'rnatishim kerak deb o'yladim.
qo'shib qo'ydi muallif coderrr, manba

har ikkala quruvchi yordamida bir bank hisob obyektini yaratishingiz mumkin emas. Siz yangi ob'ektni yaratish uchun faqat ikkita konstruktordan birini chaqirasiz. Shunday qilib, siz:

BankAccount account = new BankAccount("Sweeper", "ABCDEF", 10000);

yoki:

BankAccount account = new BankAccount(100000);

Sizning ikkinchi konstruktoringiz parametrining ma'nosiz ekanligini unutmang, chunki parametr nima bo'lishidan qat'i nazar, balansni ishga tushirasiz:

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

Menimcha, bu mantiqiyroq:

public BankAccount() {
    this.accountBalance = 0;
}

Ikkinchi savolingizga kelsak, men sizlarga bir necha maslahatlar beraman.

Sinfga fee deb nomlangan yangi maydonni kiritishingiz kerak. Buning uchun olib qo'yuvchilar va sozlovchilarni qo'shing.

1
qo'shib qo'ydi
Aslida, men sizni noto'g'ri tushunganman. Javob berildi.
qo'shib qo'ydi muallif Sweeper, manba
bir nechta konstruktordan yordamida moslamalarni qanday yaratish kerak?
qo'shib qo'ydi muallif AxelH, manba
O'ylaymanki, quyidagi talablar haqida shubhalanardim: Bir konstruktor dastlabki balansni oladi va ikkinchi konstruktor pul yo'q hisobni ochadi. Men muvozanatni nolga o'rnatishim kerak deb o'yladim.
qo'shib qo'ydi muallif coderrr, manba

har ikkala quruvchi yordamida bir bank hisob obyektini yaratishingiz mumkin emas. Siz yangi ob'ektni yaratish uchun faqat ikkita konstruktordan birini chaqirasiz. Shunday qilib, siz:

BankAccount account = new BankAccount("Sweeper", "ABCDEF", 10000);

yoki:

BankAccount account = new BankAccount(100000);

Sizning ikkinchi konstruktoringiz parametrining ma'nosiz ekanligini unutmang, chunki parametr nima bo'lishidan qat'i nazar, balansni ishga tushirasiz:

public BankAccount(double accountBalance) {
    accountBalance = 0;
}

Menimcha, bu mantiqiyroq:

public BankAccount() {
    this.accountBalance = 0;
}

Ikkinchi savolingizga kelsak, men sizlarga bir necha maslahatlar beraman.

Sinfga fee deb nomlangan yangi maydonni kiritishingiz kerak. Buning uchun olib qo'yuvchilar va sozlovchilarni qo'shing.

1
qo'shib qo'ydi
Aslida, men sizni noto'g'ri tushunganman. Javob berildi.
qo'shib qo'ydi muallif Sweeper, manba
bir nechta konstruktordan yordamida moslamalarni qanday yaratish kerak?
qo'shib qo'ydi muallif AxelH, manba
O'ylaymanki, quyidagi talablar haqida shubhalanardim: Bir konstruktor dastlabki balansni oladi va ikkinchi konstruktor pul yo'q hisobni ochadi. Men muvozanatni nolga o'rnatishim kerak deb o'yladim.
qo'shib qo'ydi muallif coderrr, manba

Agar siz Bank hisob raqamini nol balans bilan yaratmoqchi bo'lsangiz

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    this.accountBalance = accountBalance;
}

public BankAccount() {
    this.accountBalance = 0;
}

Ularni shunday qilib belgilashingiz mumkin

BankAccount mine = new BankAccount("Scary", "123", 1000000.00);
BankAccount empty = new BankAccount();

tahrirlash

Ikkinchi usuli bilan uskuna yaratish usulini tanlasangiz, id va egasi ham null bo'lishi mumkin va ehtimol foydali emas

1
qo'shib qo'ydi
"nol balansi bilan" ha, lekin u ham null id va egasining nomi bilan hosil qiladi.
qo'shib qo'ydi muallif Andy Turner, manba
@AndyTurner Qabul qilish juda foydali emas. Buni aks ettirish uchun mening javobimni yangiladim.
qo'shib qo'ydi muallif Scary Wombat, manba

Agar siz Bank hisob raqamini nol balans bilan yaratmoqchi bo'lsangiz

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    this.accountBalance = accountBalance;
}

public BankAccount() {
    this.accountBalance = 0;
}

Ularni shunday qilib belgilashingiz mumkin

BankAccount mine = new BankAccount("Scary", "123", 1000000.00);
BankAccount empty = new BankAccount();

tahrirlash

Ikkinchi usuli bilan uskuna yaratish usulini tanlasangiz, id va egasi ham null bo'lishi mumkin va ehtimol foydali emas

1
qo'shib qo'ydi
"nol balansi bilan" ha, lekin u ham null id va egasining nomi bilan hosil qiladi.
qo'shib qo'ydi muallif Andy Turner, manba
@AndyTurner Qabul qilish juda foydali emas. Buni aks ettirish uchun mening javobimni yangiladim.
qo'shib qo'ydi muallif Scary Wombat, manba

Agar siz Bank hisob raqamini nol balans bilan yaratmoqchi bo'lsangiz

public BankAccount(String ownerName, String accountId, double accountBalance) {
    this.ownerName = ownerName;
    this.accountId = accountId;
    this.accountBalance = accountBalance;
}

public BankAccount() {
    this.accountBalance = 0;
}

Ularni shunday qilib belgilashingiz mumkin

BankAccount mine = new BankAccount("Scary", "123", 1000000.00);
BankAccount empty = new BankAccount();

tahrirlash

Ikkinchi usuli bilan uskuna yaratish usulini tanlasangiz, id va egasi ham null bo'lishi mumkin va ehtimol foydali emas

1
qo'shib qo'ydi
"nol balansi bilan" ha, lekin u ham null id va egasining nomi bilan hosil qiladi.
qo'shib qo'ydi muallif Andy Turner, manba
@AndyTurner Qabul qilish juda foydali emas. Buni aks ettirish uchun mening javobimni yangiladim.
qo'shib qo'ydi muallif Scary Wombat, manba

Siz shunday qilishingiz mumkin:

   public BankAccount(String ownerName, String accountId, double accountBalance) {
       this.ownerName = ownerName;
       this.accountId = accountId;
       this.accountBalance = accountBalance;
   }

   public BankAccount() {
       this("some default name", "some default id", 0.0);
   }
1
qo'shib qo'ydi

Siz shunday qilishingiz mumkin:

   public BankAccount(String ownerName, String accountId, double accountBalance) {
       this.ownerName = ownerName;
       this.accountId = accountId;
       this.accountBalance = accountBalance;
   }

   public BankAccount() {
       this("some default name", "some default id", 0.0);
   }
1
qo'shib qo'ydi

Siz shunday qilishingiz mumkin:

   public BankAccount(String ownerName, String accountId, double accountBalance) {
       this.ownerName = ownerName;
       this.accountId = accountId;
       this.accountBalance = accountBalance;
   }

   public BankAccount() {
       this("some default name", "some default id", 0.0);
   }
1
qo'shib qo'ydi