JavaRush /Java Blog /Random-IT /Introduzione alle classi: scrivere le proprie classi, cos...

Introduzione alle classi: scrivere le proprie classi, costruttori

Pubblicato nel gruppo Random-IT
Ciao! Oggi parleremo delle lezioni in Java. Si può dire che le classi siano il nucleo della programmazione Java. Quando diventerai un programmatore, il tuo compito principale sarà scrivere le tue classi con funzionalità diverse. Introduzione alle classi: scrivere le proprie classi, costruttori - 1Scopriamo cos'è questa cosa e come funziona :) Come già sai, Java è un linguaggio di programmazione orientato agli oggetti. Tutti i programmi sono costituiti da oggetti in qualche modo collegati tra loro. Una classe è essenzialmente un modello per un oggetto. Determina come apparirà un oggetto e quali funzioni avrà. Ogni oggetto è un oggetto di qualche classe . Consideriamo l'esempio più semplice:
public class Cat {

    String name;
    int age;

}
Diciamo che stiamo scrivendo un programma e in questo programma abbiamo bisogno dei gatti per qualcosa (ad esempio, abbiamo una clinica veterinaria con la possibilità di fissare un appuntamento online). Abbiamo creato una classe Cate specificato due variabili per essa: una stringa namee un numero age. Tali variabili di classe sono chiamate campi . Essenzialmente, questo è un modello per tutti i gatti che creeremo in futuro. Ogni gatto (oggetto classe Cat) avrà due variabili: nome ed età.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
    }

}
Funziona così! Abbiamo creato un gatto, gli abbiamo dato un nome e un'età e abbiamo trasmesso il tutto alla console. Niente di complicato :) Le lezioni molto spesso descrivono oggetti e fenomeni del mondo circostante. Un gatto, un tavolo, una persona, un fulmine, una pagina di un libro, una ruota: tutto questo verrà creato nel tuo programma utilizzando classi separate. Ora diamo un'occhiata alle variabili che abbiamo creato nella classe Cat. Questi sono chiamati campi o variabili di istanza . Il nome, infatti, ne svela tutta l'essenza. Ogni istanza (oggetto) della classe avrà queste variabili Cat. Ogni gatto che creeremo avrà una propria variabile namee un proprio file age. È logico, in generale: con i gatti veri tutto è uguale :) Oltre alle variabili di istanza, ce ne sono altre: variabili di classe o statiche. Aggiungiamo al nostro esempio:
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        Cat vasia = new Cat();
        vasia.age = 5;
        vasia.name = "Vasya";
        count++;

        System.out.println("We created a cat named" + barsik.name + ", his age - " + barsik.age);
        System.out.println("We created a cat named" + vasia.name + ", his age - " + vasia.age);

        System.out.println("Total number of cats = " + count);
    }
}
Uscita console:

Мы создали кота по имени Барсик, его возраст - 3
Мы создали кота по имени Вася, его возраст - 5
Общее количество котов = 2
Ora abbiamo una nuova variabile nella nostra classe: count(quantità). È responsabile del conteggio dei gatti creati. Ogni volta che creiamo un gatto nel metodo main, incrementiamo questa variabile di 1. Questa variabile è designata dalla parola chiave statica . Ciò significa che appartiene alla classe e non a un oggetto specifico della classe. Il che, ovviamente, è logico: se ogni gatto dovesse avere il proprio nome, allora avremmo bisogno di un contatore di gatti per tutti. Questo è esattamente ciò che ti permette di ottenere la parola statico : countla stessa variabile per tutti i gatti. Nota: quando lo stampiamo sulla console, non scriviamo barsik.countvasia.count. Non appartiene né a Barsik né a Vasya: appartiene all'intera classe Cat. Pertanto, è semplice count. Puoi anche scrivere Cat.count: anche questo sarà corretto. nameQuesto non funzionerebbe con l'output di una variabile sulla console :
public class Cat {

    String name;
    int age;

    static int count = 0;

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";
        count++;

        System.out.println("We created a cat named" + name + ", his age - " + barsik.age);

        System.out.println("Total number of cats = " + count);
    }
}
Errore! nameOgni gatto ha il suo. È qui che il compilatore si confonde. "Emetti il ​​nome sulla console? Di chi è il nome? :/"

Metodi

Oltre alle variabili, ogni classe ha metodi. Ne parleremo in una lezione separata in modo più dettagliato, ma i punti generali sono abbastanza semplici. I metodi sono la funzionalità della tua classe; cosa possono fare gli oggetti di questa classe. Conosci già uno dei metodi: questo è il file main(). Ma il metodo main, come ricorderete, è statico, cioè appartiene all'intera classe (la logica è la stessa delle variabili). E i metodi ordinari e non statici possono essere chiamati solo su oggetti specifici che abbiamo creato. Se ad esempio vogliamo scrivere una classe per un gatto, dobbiamo capire quali funzioni deve avere il gatto nel nostro programma. Sulla base di ciò, scriviamo un paio di metodi per questo:
public class Cat {

    String name;
    int age;

    public void sayMeow() {
        System.out.println("Meow!");
    }

    public void jump() {
        System.out.println("Jumping gallop!");
    }

    public static void main(String[] args) {
        Cat barsik = new Cat();
        barsik.age = 3;
        barsik.name = "Barsik";

        barsik.sayMeow();
        barsik.jump();

    }
}
Bene, ora la nostra lezione è molto più simile alla descrizione di un vero gatto! Ora non abbiamo solo un gatto chiamato Barsik con un nome ed un’età. Può anche miagolare e saltare! Che razza di gatto esiste senza tale "funzionalità" :) Prendiamo un oggetto specifico - barsike chiamiamo i suoi metodi sayMeow()e jump(). Guardiamo la console:

Мяу!
Прыг-скок!
Un vero gatto! :)

Creare le tue classi. Astrazione

In futuro dovrai scrivere le tue lezioni. A cosa dovresti prestare attenzione quando li scrivi? Se parliamo di variabili, devi usare qualcosa chiamato astrazione . L'astrazione è uno dei quattro principi fondamentali della programmazione orientata agli oggetti. Si tratta di evidenziare le caratteristiche principali e più significative di un oggetto e, viceversa, scartare quelle secondarie e insignificanti. Ad esempio, stiamo creando un file di dipendenti dell'azienda. Per creare oggetti dipendente, abbiamo scritto una classe Employee. Quali caratteristiche sono importanti per descrivere un dipendente in una scheda aziendale? Nome completo, data di nascita, codice fiscale, codice fiscale. Ma è improbabile che abbiamo bisogno della sua altezza, del colore degli occhi e dei capelli nella tessera di un dipendente dell’azienda. L’azienda non ha bisogno di queste informazioni. Pertanto, per la classe Employeeimposteremo le variabili String name, int age, int socialInsuranceNumbere int taxNumber, e abbandoneremo le informazioni che non ci sono necessarie (come il colore degli occhi) e le astraremo . Ma se creiamo un file di fotomodelle per un'agenzia di modelle, la situazione cambia radicalmente. Per descrivere una modella, per noi sono molto importanti l'altezza, il colore degli occhi e il colore dei capelli, ma per noi il numero TIN non è assolutamente importante. Pertanto, nella classe Modeldobbiamo creare variabili int height, String hair, String eyes. Ecco come funziona l'astrazione, è semplice! :)

Costruttori

Torniamo all'esempio del nostro gatto.
public class Cat {

    String name;
    int age;

    public static void main(String[] args) {
        Cat barsik = new Cat();

        System.out.println("Something has been happening in the program for 2 hours...");

        barsik.age = 3;
        barsik.name = "Barsik";

    }
}
Guarda questo codice e prova a indovinare cosa c'è che non va nel nostro programma. Per due ore nel nostro programma c'era un gatto senza nome né età! Naturalmente questo è completamente sbagliato. Nel database della clinica veterinaria non dovrebbero esserci gatti senza informazioni su di loro. Ora lo lasciamo al programmatore. Se non dimentica di indicare il suo nome e la sua età, andrà tutto bene. Se si dimentica, ci sarà un errore nel database, gatti sconosciuti. come possiamo risolvere questo problema? È necessario in qualche modo vietare la creazione di gatti senza nome ed età. È qui che le funzioni di costruzione vengono in nostro aiuto . Ecco un esempio:
public class Cat {

    String name;
    int age;

    //constructor for class Cat
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
    }
}
Un costruttore è essenzialmente un modello per oggetti di classe. In questo caso specifichiamo che per ogni oggetto catdevono essere specificati due argomenti: una stringa e un numero. Se ora proviamo a creare un gatto senza nome, non ci riusciremo.
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
Ora che una classe ha un costruttore, il compilatore Java sa come dovrebbero apparire gli oggetti e non consentirà la creazione di oggetti senza gli argomenti specificati in esso. Ora diamo un'occhiata alla parola chiave thische vedi all'interno del costruttore. Anche con lui tutto è semplice. "questo" in inglese significa "questo, questo". Cioè, questa parola indica un oggetto specifico. Codice nel costruttore
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}
può essere tradotto quasi letteralmente: " nome per questo gatto (che stiamo creando) = l' argomento nome specificato nel costruttore. età per questo gatto (che stiamo creando) = l' argomento età specificato nel costruttore." Dopo l'avvio del costruttore, puoi verificare che al nostro gatto siano stati assegnati tutti i valori necessari:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        System.out.println(barsik.name);
        System.out.println(barsik.age);
    }
}
Uscita console:

Барсик
5
Quando il costruttore ha completato:
Cat barsik = new Cat("Barsik", 5);
All'interno è effettivamente accaduto quanto segue:
this.name = "Barsik";
this.age = 5;
E all'oggetto barsik(lo è this) sono stati assegnati valori dagli argomenti del costruttore. Infatti, se non specifichi i costruttori nella classe, verrà comunque attivato il costruttore ! Ma come è possibile? O_O Il fatto è che in Java tutte le classi hanno un cosiddetto costruttore predefinito . Non ha argomenti, ma si attiva ogni volta che viene creato un oggetto di qualsiasi classe.
public class Cat {

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
A prima vista questo non è evidente. Bene, abbiamo creato un oggetto e lo abbiamo creato, dov’è finito il lavoro del designer? Per vederlo, scriviamo Catcon le nostre mani un costruttore vuoto per la classe e al suo interno invieremo alcune frasi alla console. Se viene visualizzato, il costruttore ha funzionato.
public class Cat {

    public Cat() {
        System.out.println("Created a cat!");
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //this is where the default constructor worked
    }
}
Uscita console:

Создали кота!
Ecco la conferma. Il costruttore predefinito è sempre presente in modo invisibile nelle tue classi. Ma devi conoscerne un'altra caratteristica. Il costruttore predefinito scompare dalla classe quando crei un costruttore con argomenti. La prova di ciò, in effetti, l'abbiamo già vista sopra. Qui in questo codice:
public class Cat {

    String name;
    int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat(); //error!
    }
}
Non potremmo creare un gatto senza nome ed età perché abbiamo definito un costruttore per Cat: stringa + numero. Il costruttore predefinito è scomparso dalla classe subito dopo. Pertanto, assicurati di ricordare: se hai bisogno di più costruttori nella tua classe, incluso uno vuoto, devi crearlo separatamente . Ad esempio, la nostra clinica veterinaria vuole fare buone azioni e aiutare i gatti senza casa, di cui non conosciamo i nomi e l'età. Quindi il nostro codice dovrebbe assomigliare a questo:
public class Cat {

    String name;
    int age;

    //for domestic cats
    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    //for street cats
    public Cat() {
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 5);
        Cat streetCat = new Cat();
    }
}
Ora che abbiamo specificato esplicitamente un costruttore predefinito, possiamo creare entrambi i tipi di gatti. Nel costruttore è possibile assegnare valori in modo esplicito e non semplicemente prenderli dagli argomenti. Ad esempio, possiamo registrare tutti i gatti di strada in un database con il nome "Numero del gatto di strada...":
public class Cat {

    String name;
    int age;

    static int count = 0;

    public Cat() {
        count++;
        this.name = "Street cat number" + count;
    }

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat streetCat1 = new Cat();
        Cat streetCat2 = new Cat();
        System.out.println(streetCat1.name);
        System.out.println(streetCat2.name);
    }
}
Abbiamo una variabile countche è un contatore di gatti di strada. Ogni volta che eseguiamo il costruttore predefinito, lo incrementiamo di 1 e assegniamo quel numero come nome del gatto. Per un costruttore, l'ordine degli argomenti è molto importante. Scambiamo gli argomenti nome ed età nel nostro costruttore.
public class Cat {

    String name;
    int age;

    public Cat(int age, String name) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {

        Cat barsik = new Cat("Barsik", 10); //error!
    }
}
Errore! Il costruttore descrive chiaramente: quando si crea un oggetto, Catè necessario passare un numero e una stringa, in quest'ordine . Ecco perché il nostro codice non funziona. Assicurati di ricordarlo e di tenerlo a mente quando crei le tue classi:
public Cat(String name, int age) {
    this.name = name;
    this.age = age;
}

public Cat(int age, String name) {
    this.age = age;
    this.name = name;
}
Questi sono due designer completamente diversi! Ora risolvi alcuni problemi per consolidare il materiale :)
  • Museo delle Antichità.
Il tuo compito è progettare la classe Artifact. I reperti conservati nel museo sono di tre tipologie. Il primo riguarda il quale non si sa nulla se non il numero di serie assegnato dal museo (ad esempio: 212121). La seconda riguarda la conoscenza del numero di serie e della cultura da cui è stato creato (ad esempio: 212121, “Aztechi”). Il terzo tipo riguarda il numero di serie noto, la cultura da cui è stato creato e l'età esatta della sua creazione (ad esempio: 212121, "Aztechi", 12). Crea una classe Artifactche descriva le antichità conservate nel museo e scrivi il numero richiesto di costruttori per essa. Nel metodo main(), crea un artefatto di ciascun tipo.
public class Artifact {

    public static void main(String[] args) {
    }
}
  • Sito web dell'incontro
Stai creando un database utenti per un sito di incontri. Ma il problema è che hai dimenticato in quale ordine devono essere specificati e non hai le specifiche tecniche a portata di mano. Progetta una classe Userche avrà campi: nome ( String), età ( short) e altezza ( int). Crea il numero richiesto di costruttori in modo che il nome, l'età e l'altezza possano essere specificati in qualsiasi ordine.
public class User {

    String name;
    short age;
    int height;

    public static void main(String[] args) {

    }
}
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION