Interfacce:
sono delle classi astratte pure, ossia definiscono un insieme di metodi senza che ne venga specificata l'implementazione. Per utilizzarle, semplicemente si aggiunge "implements NomeInterfaccia" alla classe che utilizza quella determinata interfaccia e che dovrà ridefinirne i metodi. In Java sono usate soprattutto per l'erenditarietà multipla...
Esempio:
un cane è sia un quadrupede sia un mammifero quindi puoi definire le interfacce "Quadrupede" e "Mammifero", poi crei la classe Cane che implementa le due interfacce.
Codice:
interface Quadrupede{
void muoviZampeAnteriori();
void muoviZampePosteriori();
}
interface Mammifero{
void partorisci();
}
class Cane implements Quadrupede, Mammifero{
public void muoviZampeAnteriori(){
System.out.print("oooop....");
}
public void muoviZampePosteriori(){
System.out.println("la`!");
}
public void partorisci(){
System.out.println("io partorisco, non faccio le uova");
}
}
static:
Un attributo statico viene creato una e una sola volta quando si alloca spazio per la classe cui appartiene; ne esisterà uno unico per tutti gli oggetti (istanze) di quella classe quindi. In genere sono utilizzati per mantenere il valore della variabile, che non sarà resettato al termine della funzione, o per dichiarare delle costanti. Sono in pratica delle variabili globali.
Un metodo statico viene, come per gli attributi, creato immediatamente dopo la creazione della classe, senza che ci sia bisogno di crearne prima un'istanza (oggetto). Ecco perchè il main è sempre static ad esempio. Generalmente i metodi static sono metodi che eseguono dei calcoli su alcuni parametri di input e che ritornano poi dei parametri in output... risultando quindi indipendenti dall'oggetto in sè. Dichiarare un metodo static rende più efficiente il codice. Un esempio di metodo non static ad esempio è l'equals() di un oggetto String, che dipende dall'oggetto String cui è applicato per fare il confronto col valore di un'altra stringa...