Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Una classe che... stampa troppo

    Salve.
    Sto cercando di entrare nella logica di Java ma qualche volta non riesco a svincolarmi dalla mia...

    Mi ritrovo per esempio queste due classi nello stesso package...
    codice:
    package pag382;
    
    
    public class TC {
    	public TC() {
    		System.out.println("TC created");
    	}
    }
    codice:
    package pag382;
    
    
    public class TestClass extends TC {
    	public TestClass() {
    		System.out.println("TestClass created");
    	}
    	public static void main(String[] args) { 
    		new TestClass(); 
    	}
    }
    Compilate ed eseguite, provocano la stampa di entrambi i println, mentre io mi aspettavo soltanto "TestClass created"...
    Perché viene invocato anche il costruttore della superclasse? Cosa mi sfugge?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Perché viene invocato anche il costruttore della superclasse? Cosa mi sfugge?
    Quando una classe viene istanziata, un suo costruttore viene invocato. Ma deve essere eseguito anche un costruttore della super-classe poi ancora della super-super-classe ecc... fino a java.lang.Object (il cui costruttore non fa nulla). E quindi ritorna indietro.
    Questo perché ciascuna classe potrebbe avere campi da inizializzare o cose da eseguire alla inizializzazione.

    La prima istruzione di un costruttore deve essere una invocazione this( ...eventuali arg... ) oppure super( ...eventuali arg... ). Con this() viene semplicemente passata la palla ad un altro costruttore di quella classe. Ma prima o poi ci deve essere una invocazione super().

    Se il programmatore non mette esplicitamente una di queste due invocazioni, il compilatore mette un super() senza argomenti.

    Nella tua classe TestClass, il costruttore diventa realmente:

    codice:
        public TestClass() {
            super();
            System.out.println("TestClass created");
        }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Ok... Col super() esplicitato è evidente che stampi due println...

    Quindi se volessi stampare soltanto "TestClass created", dovrei dare alla superclasse un costruttore (senza parametri in questo caso) senza alcun ordine di stampare, oppure non preoccuparmene e fare creare a Java il costruttore di default, giusto?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    dovrei dare alla superclasse un costruttore (senza parametri in questo caso) senza alcun ordine di stampare, oppure non preoccuparmene e fare creare a Java il costruttore di default, giusto?[/COLOR]
    Sì. Se TC avesse:
    - un costruttore esplicito con super() esplicito --> ok
    - un costruttore esplicito ma vuoto --> ok
    - nessun costruttore esplicito --> ok (il compilatore inserisce quello di default):

    Ma la costruzione, ricorda, deve SEMPRE arrivare fino a java.lang.Object. Se TC avesse 1 costruttore ma private, TC compila ma TestClass NON ti compila più, in quanto non può "vedere" alcun costruttore accessibile.



    P.S. prova questo:

    codice:
    public class Main {
        public static void main(String[] args) {
            new B();
        }
    }
    
    class A {
        private int a = val();
    
        public A() {
            System.out.println("A()");
        }
    
        private int val() {
            System.out.println("A val()");
            return 123;
        }
    }
    
    class B extends A {
        private int b = val();
    
        public B() {
            System.out.println("B()");
        }
    
        private int val() {
            System.out.println("B val()");
            return 123;
        }
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5
    Li scrivi tu i quiz a trabocchetto per gli esami di certificazione?

    Cioè, alla luce di quanto spiegato prima, il codice che mi hai passato adesso è chiarissimo, ma trovarselo così tra capo e collo è una bestia insidiosa.

    Col costruttore di superclasse private avevo già verificato prima di aprire la discussione che non funziona: il modifier private non rende come inesistente il costruttore ma inaccessibile!

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Li scrivi tu i quiz a trabocchetto per gli esami di certificazione?
    Magari ....

    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Cioè, alla luce di quanto spiegato prima, il codice che mi hai passato adesso è chiarissimo, ma trovarselo così tra capo e collo è una bestia insidiosa.
    Una cosa non l'ho detta ma forse l'hai intuita: gli inizializzatori delle variabili di istanza e i blocchi di inizializzazione di istanza, vengono eseguiti poco dopo la terminazione del super-costruttore ma poco prima del resto del costruttore.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Tag per questa discussione

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.