perché la classe non può prendere direttamente gli argomenti invece di usare un costruttore?

0

Ho fatto riferimento a questa pagina per la comprensione dei costruttori in Java: link

Quindi, ho praticamente capito come nelle mie stesse parole:

constructor has no return value and is used to construct an object (fill with data) while creating it with the arguments supplied

Qual è lo scopo dell'utilizzo del costruttore? Perché la classe non può occuparsi di questo compito da solo?

Quello che volevo dire era usare gli argomenti nella definizione della classe direttamente invece di un'altra definizione per il costruttore che accetta argomenti all'interno di una classe.

MODIFICA 1: Stavo pensando qualcosa del genere:

class Car(String theCountry) {
    String country;
    country = theCountry;
    String display() {
        return country;
    }
}

invece di questo:

class Car {
    String country;
    Car(String theCountry) {
        country = theCountry;
    }
    String display() {
        return country;
    }
}

e l'inizializzazione dell'oggetto potrebbe essere ancora la stessa: Car volvo = new Car("Sweden");

    
posta GP92 06.07.2016 - 14:07
fonte

6 risposte

8

Il tuo esempio

class Car(String theCountry) {
    String country;
    country = theCountry;
    String display() {
        return country;
    }
}

ha diversi difetti che i costruttori "reali" non sono.

Puoi avere solo un costruttore. Il sovraccarico del costruttore ha i suoi ottimi usi e dovrebbe essere possibile.

Ogni variabile fa parte della classe. Supponi di aver bisogno di creare una variabile temporanea nel tuo costruttore in questo modo:

class Country(String country) {
    String CountryCode;
    CountryCode = Locales.GetCode(country);
}

class Car(String theCountry) {
    String country;
    Country tmpCountry = Country(theCountry);
    country = tmpCountry.CountryCode;
    String display() {
        return country;
    }
}

Quindi la tua classe Car ha improvvisamente due campi: country e tmpCountry , che probabilmente non vuoi.

    
risposta data 06.07.2016 - 17:13
fonte
6

What is the purpose of using constructor? Why can't the class just take care of this task by itself? What I meant was use arguments in class definition directly instead of another definition for constructor that takes arguments inside a class.

Se stai chiedendo "c'è un motivo di progettazione del linguaggio fondamentale per cui questa funzione che voglio è impossibile?" la risposta è no". Scala e F # hanno qualcosa del genere, e la caratteristica che desideri è stata proposta per C # 6, anche se credo che non sia finita con la spedizione. (Esegui una ricerca web per "C # primary constructor" se desideri i dettagli.)

Tutte le funzionalità devono essere pensate, progettate, specificate, implementate, testate, documentate e spedite. Se queste cose non accadono, non ottieni la funzionalità. Per Java e C #, non tutte queste cose sono successe, quindi, nessuna funzione del genere. È una funzionalità perfettamente sensata, ci vorrà del lavoro per farlo accadere, e finora nessuno ha fatto quel lavoro.

    
risposta data 06.07.2016 - 17:28
fonte
5

Ci sono due modi per rispondere a questa domanda.

  1. Se stai davvero chiedendo "Perché devo chiamare new MyClass() ? Perché non è abbastanza MyClass() , come in Python?", questo è in gran parte una questione sintattica. Per una ragione o per l'altra gli autori della grammatica per il linguaggio Java hanno contrassegnato le chiamate del costruttore con una parola chiave. Gli autori di altre lingue hanno saltato la parola chiave. I motivi devono fare di più con tutti gli altri tipi di espressione che contiene la grammatica della lingua rispetto alla stessa chiamata del costruttore.

  2. Ma se stai chiedendo "Perché devo passare gli argomenti al momento dell'inizializzazione?", beh, non è necessario. Puoi creare un costruttore no-args se vuoi. I costruttori con argomenti sono nella lingua in modo che gli utenti possano definire le proprie classi che richiedono bit di dati obbligatori che non sono noti al momento della compilazione della classe, ma solo al tempo di istanziazione dell'oggetto.

risposta data 06.07.2016 - 14:13
fonte
2

puoi sovraccaricare un costruttore, con input fisso nella classe dovresti scrivere una classe per ognuno. In questo modo è possibile ottenere istanze diverse. Ma devi scrivere un costruttore per ognuno.

Esempio:

MyClass instance = new MyClass(param1,param2);

MyClass instance2 = new MyClass(param1,param2,param3);
    
risposta data 06.07.2016 - 14:44
fonte
1

Bene, lo scopo del costruttore in java è inizializzare l'istanza di una classe. Ma non perché abbiamo costruttori.

Ad esempio:

public class Car
{
   private int wheels;

   public Car(int wheels)
   {
      setNumber(wheels);
   }

   public void setNumber(int wheels)
   {
      this.wheels = wheels;
   }
}

Come nell'esempio sopra puoi inizializzare l'istanza di una classe esternamente, usando c.setWheels (4).

Il motivo per cui stiamo usando il costruttore è perché il costruttore lo fa, ma in un modo che è sicuro.

Puoi riferire l'esempio qui sotto -

link

link

link

    
risposta data 27.11.2017 - 09:02
fonte
-2

Il linguaggio Java impone che un costrutto debba essere usato per creare un'istanza di una classe. Qualsiasi linguaggio di programmazione ha la sua sintassi che ogni programmatore dovrebbe rispettare per compilare il suo programma. I costruttori sono utilizzati in molte lingue diverse da Java come C ++, PHP, ecc.

    
risposta data 26.08.2016 - 11:56
fonte

Leggi altre domande sui tag