Sì, penso che tu abbia ragione. La seconda opzione riguarda solo un caso particolare: la sottoclasse specifica si trova in un pacchetto diverso rispetto alla sua superclasse.
Per esempio,
package superpackage;
public abstract class SuperFoo {
abstract void foo();
}
package subpackage;
import superpackage.SuperFoo;
public abstract class SubFoo extends SuperFoo {}
Si prega di notare che questa classe deve essere dichiarata astratta, altrimenti abbiamo errore di compilazione.
In questo caso particolare non abbiamo "ereditarietà del metodo foo" poiché l'ereditarietà richiede che la classe SubFoo sia nello stesso pacchetto di SuperFoo. vedere la sezione 8.4.8 in JLS per ulteriori dettagli.
Tuttavia, questa classe contiene ancora il metodo "pippo" (per definizione) e quindi dovrebbe essere contrassegnato con una parola chiave astratta.
Inoltre, possiamo estendere la nostra classe SubFoo da un'altra classe concreta che appartiene al pacchetto "superpackage".
Per esempio,
package subclass;
import subpackage.SubFoo;
public class SecondSubFoo extends SubFoo {
@Override
void foo() {}
}
Nota:
1) Il fatto è che i metodi pubblici e protetti rientrano in primo elemento di definizione, come sono ereditate e non c'è bisogno secondo elemento di definizione per loro.
2) I metodi di accesso al pacchetto sono anch'essi rientrati nel primo elemento di definizione se sono nello stesso pacchetto e quindi non è necessario un secondo elemento di definizione anche per loro.
3) D'altro canto, i metodi di accesso ai pacchetti presenti nell'altro pacchetto non rientrano nel primo elemento di definizione in quanto non sono ereditati (vedere la definizione di ereditarietà dei metodi astratti nella sezione 8.4.8 di JSL) e quindi sono richiesti secondo elemento di definizione.
In pratica si sta dicendo che la classe è astratta finché non si forniscono implementazioni concrete per tutti i metodi astratti (metodi espliciti nella classe o impliciti dalle classi padre). Ricorda: "l'ambito del pacchetto" è quando tu * non * specifichi "pubblico" o "protetto" o "privato"; è visibile ovunque all'interno del pacchetto e non è visibile all'esterno del pacchetto. – paulsm4