webForumDet fria alternativet

Statiska metoder i subklasser

4 svar · 549 visningar · startad av M@rtin

M@rtinMedlem sedan dec. 19992 085 inlägg
#1

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?

spangoMedlem sedan juni 20008 205 inlägg
#2

Hur menar du "inte går"? Anrop av statiska metoder använder inte dynamisk bindning men det är en annan sak.

M@rtinMedlem sedan dec. 19992 085 inlägg
#3

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;
		}
		
	}
	
}
LimeMedlem sedan sep. 2001961 inlägg
#4

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.

M@rtinMedlem sedan dec. 19992 085 inlägg
#5

Mycket bra och uttömmande svar! Tack så mycket :)

130 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)