Varför kan man inte ha statiska metoder i subklasser i java? Jag vet att det inte går men jag förstår inte riktigt varför de infört den begränsningen. Nån som har någon bra teori?
Statiska metoder i subklasser
4 svar · 549 visningar · startad av M@rtin
Hur menar du "inte går"? Anrop av statiska metoder använder inte dynamisk bindning men det är en annan sak.
Inre klasser kanske är ordet, inte subklasser, men jag antar att det är samma sak.
Jag menar att följande är helt ok:
class Statictest {
public static void main(String args[]){
System.out.println(Klassen.test());
}
}
class Klassen {
public Klassen(){
}
public static int test(){
return 3;
}
}
Men att detta inte går:
class Statictest {
public static void main(String args[]){
System.out.println(Klassen.test());
}
class Klassen {
public Klassen(){
}
public static int test(){
return 3;
}
}
}
Det hela hänger ihop med att en inre klass behandlas som i princip vilket attribut som helst. Alltså finns inte den inre klassen innan det finns ett objekt av den yttre.
Man är frestad att göra såhär:
class Statictest {
public Statictest() {
}
public static void main(String args[]){
Statictest.Klassen k1 = new Statictest.Klassen();
}
class Klassen {
public Klassen(){
}
public int test(){
return 3;
}
}
}
men det går inte. Däremot är det här tillåtet:
lass Statictest {
public Statictest() {
}
public static void main(String args[]){
Statictest st = new Statictest();
Statictest.Klassen k1 = st.new Klassen();
System.out.println(k1.test());
}
class Klassen {
public Klassen(){
}
public int test(){
return 3;
}
}
}
Sedan går det givetvis att göra den intre klassen till statiks också och då kan man anropa den direkt, eftersom det går utmärkt att ropa från ett statiskt scope till ett annat, såhär:
class Statictest {
public Statictest() {
}
public static void main(String args[]){
System.out.println(Statictest.Klassen.test());
}
static class Klassen {
public Klassen(){
}
static public int test(){
return 3;
}
}
}
Jag gör ibland private eller protected inner classes när jag har metoder som jag inte vet om hör hemma i klassen eller inte, eller vid refaktureringar.
Sått sånt här:
class Statictest {
public Statictest() {
System.out.println(StaticUtil.test());
}
// Private inner class
private static class StaticUtil {
static public int test() {
return 3;
}
}
}
public class StatSub extends Statictest {
public StatSub() {
super();
System.out.println("Statictest.StaticUtil är inte tillgänglig här nere...");
}
public static void main(String[] args) {
new StatSub();
}
}
Blir konceptet klarare??
Static kan bara anropa static.
private bara i klassen själv, inte ens i sub-klasser.
Inre klasser beteer sig lite som ett attribut.
Mycket bra och uttömmande svar! Tack så mycket :)