Aus wieviel Klassen darf in Java eine (Programm)besitzen?

Status
Nicht offen für weitere Antworten.

math.iso@live.de

Aktives Mitglied
Ich würde gern wissen auswieviele Klassen darf in Java ein Programm besitzen..

Darf in Java ein Programm nur eine Klasse haben ???eine primäre Klasse haben..?
 
Also der Standard-Classloader kann 2^31 Klassen verwalten. Man kann sich natürlich eigene schreiben, die mehr können. Oder man nimmt einfach ganz viele Classloader...
 
Also man darf ungefähr 2^31 klassen ,cool 😀

aber es kommt dann bestimmt zu einem problem beim compiler ,er weiß doch dann nicht wo er anfangen soll ,oder..?

denn ich hab ein programm mit 2 klassen geschrieben ,die eine klasse konnte lesen und bei der anderen klasse hat er bicht verstanden der compiler bzw stecken geblieben

ich hoffe ihr könnt mir gute ratschläge geben 🙂
 
denn ich hab ein programm mit 2 klassen geschrieben ,die eine klasse konnte lesen und bei der anderen klasse hat er bicht verstanden der compiler bzw stecken geblieben
Grundsätzlich gibt es mindestens 2 Möglichkeiten:
1. es liegt am Compiler
2. es liegt an dir

Wenn du dann bereit bist den Fehler doch bei dir zu suchen, könntest du ja ein bisschen Code posten, so dass wir helfen können.
 
maki hat gesagt.:
denn ich hab ein programm mit 2 klassen geschrieben ,die eine klasse konnte lesen und bei der anderen klasse hat er bicht verstanden der compiler bzw stecken geblieben
Grundsätzlich gibt es mindestens 2 Möglichkeiten:
1. es liegt am Compiler
2. es liegt an dir

Wenn du dann bereit bist den Fehler doch bei dir zu suchen, könntest du ja ein bisschen Code posten, so dass wir helfen können.

Gute Tipps von Maki. Noch besser: mach dich ein wenig schlau im Umgang mit der IDE bzw. dem Compiler. Wenn dann Probleme auftreten, kannst du diese sicher sinnvoll formulieren. Dann erst mal Google, die Forensuche und die FAQs bemühen. Wenn das immer noch nicht hilfe (und damit kommt man schon weit!), dann bist du hier in guten Händen.

http://de.youtube.com/watch?v=B9q2jNjOPdk
 
ist mir grad langweilig ;-)

Code:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class Test {
	
	private static final String CURRENT_PATH = System.getProperty("user.dir");

	private static final String CLAZZ_NAME = "A";

	//same type!!
	private static long classCounter = 0;
	//max =  Long.MAX - 1 : we need a final class to close the App!!!
	private static final long MAX_CLASSES = 150000-1;
	
	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		File dir = new File(CURRENT_PATH +"/src/");
		dir.mkdir();
		
		for(double d = 0 ; d < MAX_CLASSES; d++) {
			String content = createClass();
			File file = createFile();
			writeFile(file, content);
			classCounter++;
		}
		String content = createFinalClass();
		File file = createFile();
		writeFile(file, content);
		System.out.println(classCounter + " Classes created");
	}
	
	static File createFile() {
		return new File(CURRENT_PATH +"/src/"+CLAZZ_NAME + classCounter + ".java");
	}

	static String createClass() {
		String clazzName = CLAZZ_NAME + classCounter;
		return
		"public class " + clazzName +"{\n" +
			"\tprivate Object object;" +
			"\n"+
			"\tpublic " + clazzName + "() { \n" +
				"\t\tthis.object = new " + CLAZZ_NAME + (classCounter+1) + "();\n" +
				"\t\tSystem.out.println(this.object);\n" +
			"\t}" +
			"\n"+
			"\tpublic String toString() {" +
			"\n\t\treturn \"" + clazzName + "\";\n\t }\n"+
			
			"\tpublic static void main(String[] args) {\n" +
				"\t\t" +clazzName + " inst = new " + clazzName + "();\n\t}\n"+
		"}";
	}

	static String createFinalClass() {
		String clazzName = CLAZZ_NAME + classCounter;
		return
		"public class " + clazzName +"{\n" +
			"\n"+
			"\tpublic " + clazzName + "() { \n" +
				"\t\tSystem.out.println(\"This is the end\");\n" +
			"\t}" +
			"\n"+
			"\tpublic String toString() {" +
			"\n\t\treturn \"" + clazzName + "\";\n\t }\n"+
			
			"\tpublic static void main(String[] args) {\n" +
				"\t\t" +clazzName + " inst = new " + clazzName + "();\n\t}\n"+
		"}";
	}	
	static void writeFile(File file, String content) throws IOException {
		BufferedWriter bw = new BufferedWriter(new FileWriter(file));
		
		bw.write(content);
		bw.flush();
		bw.close();
	}
}

xxx@xxx-desktop:/main/develop/test$ javac Test.java
xxx@xxx-desktop:/main/develop/test$ java Test
149999 Classes created
xxx@xxx-desktop:/main/develop/test$ cd src/
xxx@xxx-desktop:/main/develop/test/src$ javac A0.java
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOfRange(Arrays.java:3209)
at java.lang.String.<init>(String.java:216)
at java.lang.StringBuilder.toString(StringBuilder.java:430)
at sun.net.www.protocol.jar.Handler.parseContextSpec(Handler.java:120)
at sun.net.www.protocol.jar.Handler.parseURL(Handler.java:66)
at java.net.URL.<init>(URL.java:596)
at java.net.URL.<init>(URL.java:464)
at sun.misc.URLClassPath$JarLoader.checkResource(URLClassPath.java:671)
at sun.misc.URLClassPath$JarLoader.getResource(URLClassPath.java:756)
at sun.misc.URLClassPath.getResource(URLClassPath.java:168)
at java.net.URLClassLoader$1.run(URLClassLoader.java:192)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.util.ResourceBundle$Control.newBundle(ResourceBundle.java:2383)
at java.util.ResourceBundle.loadBundle(ResourceBundle.java:1406)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1365)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1292)
at java.util.ResourceBundle.findBundle(ResourceBundle.java:1292)
at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1234)
at java.util.ResourceBundle.getBundle(ResourceBundle.java:715)
at com.sun.tools.javac.util.Messages.add(Messages.java:66)
at com.sun.tools.javac.util.Messages.<init>(Messages.java:52)
at com.sun.tools.javac.main.Main.getLocalizedString(Main.java:447)
at com.sun.tools.javac.main.Main.resourceMessage(Main.java:421)
at com.sun.tools.javac.main.Main.compile(Main.java:364)
at com.sun.tools.javac.main.Main.compile(Main.java:279)
at com.sun.tools.javac.main.Main.compile(Main.java:270)
at com.sun.tools.javac.Main.compile(Main.java:69)
at com.sun.tools.javac.Main.main(Main.java:54)
xxx@xxx-desktop:/main/develop/test/src$ ls | wc -l
157367
xxx@xxx-desktop:/main/develop/test/src$

so und jetzt noch ein rm -r src/ und weg ist wieder...(ca 20 min)

also wenn ich 7367 Klassen die zusammenhängen kompilier gibts eine Exception.
Ob das was sagen soll?
 
Auch dem javac kann man ja mehr Heap gönnen; mit javac -J-Xmx500m *.java sollte schon mehr möglich sein. Aber eigentlich war die Frage ja, aus wievielen Klassen ein Programm bestehen kann, und nicht, wieviele man gleichzeitig übersetzen kann.
 
Murray hat gesagt.:
Auch dem javac kann man ja mehr Heap gönnen; mit javac -J-Xmx500m *.java sollte schon mehr möglich sein. Aber eigentlich war die Frage ja, aus wievielen Klassen ein Programm bestehen kann, und nicht, wieviele man gleichzeitig übersetzen kann.

Schon klar.... sollte mehr ein realistische Beispiel sein. Bin zwar grad 32bit am auskitzeln mit 150'000 Klassen. Aber da tut sich grad noch nix..(P4 2.8 mit HT 40min++)...kann dauern.....wenn zu lang ..Ctrl-C oder kill -9 (sonst gibts ein edit)

EDIT:
also 150'000 kompiliernen scluckt er noch...2^31 ..hmm auf BigInt umstellen und testen...heut nicht mehr...
 
Vielleicht zeig ich euch 🙂 was ich nicht so verstehe ,hab zwei klassen ein mal class Multitext und HelloText

bitte bombadiert mich nicht mit krassen fremdwörter ,wäre mir lieb 🙂

ich komm schon sehr gut zurecht mit programmieren ,nun bin ich ein punkt gelangt bei java , wo es um objekte klassen atribute methoden geht (Subklassen Superklassen ) und bin gutdabei ,habe da paar lücken und würde gern so verstehen mit dem compiler

Code:
public class MultiText {
public static void main (String[] args) {
HelloText engl = new HelloText();
HelloText germ = new HelloText();
germ.messageText = "Hallo, liebe Leute!";
HelloText cat = new HelloText();
cat.messageText = "Miau!";
engl.printText();
germ.printText();
engl.printText();
cat.printText();
engl.printText();
}
}


public class HelloText {
public String messageText = "Hello World!";
public void printText() {
System.out.println (messageText);
}
Und Ausgabe will ich jetzt

Hello World!
Hallo, liebe Leute!
Hello World!
Miau!
Hello World!

haben 🙂

das klappt nicht ,🙁 hoffe ihr könnt mir helfen
 
Wenn Du a) am Ende noch eine schließende geschweifte Klammer ergänzt und b) vor der zweiten Klasse das public entfernst, funktioniert es.
In einer Datei darf es immer nur eine als public markierte Klasse geben; ein Programm darf aber durchaus aus Klassen bestehen, die in unterschiedlichen Dateien definiert sind. Du kannst also auch die zweite Klasse in einer eigenen Datei (HelloText.java) speichern; dann darf sie ruhig public sein.

Mit Subklassen und Superklassen (also mit Ableitung) hat diese Beispiel allerdings wenig zu tun.
 
aha danke hat funktioniert ,ich hab was neues ausprobiert ,ich hab in einer klasse eine klasse reingepackt , also class HelloText in public class MultiText...Warum Funktioniert das Programm nicht mehr , der Compiler hat Probleme dann bei new HelloText (); bzw er kommt da nicht mehr weiter...

Code:
public class MultiText { 
public static void main (String[] args) { 
HelloText engl = new HelloText(); 
HelloText germ = new HelloText(); 
germ.messageText = "Hallo, liebe Leute!"; 
HelloText cat = new HelloText(); 
cat.messageText = "Miau!"; 
engl.printText(); 
germ.printText(); 
engl.printText(); 
cat.printText(); 
engl.printText();

class HelloText { 
public String messageText = "Hello World!"; 

public void printText() { 
System.out.println (messageText); 
} 


}
 
math.iso@live.de hat gesagt.:
aha danke hat funktioniert ,ich hab was neues ausprobiert ,ich hab in einer klasse eine klasse reingepackt , also class HelloText in public class MultiText...Warum Funktioniert das Programm nicht mehr , der Compiler hat Probleme dann bei new HelloText (); bzw er kommt da nicht mehr weiter...

Code:
public class MultiText { 
public static void main (String[] args) { 
HelloText engl = new HelloText(); 
HelloText germ = new HelloText(); 
germ.messageText = "Hallo, liebe Leute!"; 
HelloText cat = new HelloText(); 
cat.messageText = "Miau!"; 
engl.printText(); 
germ.printText(); 
engl.printText(); 
cat.printText(); 
engl.printText();

class HelloText { 
public String messageText = "Hello World!"; 

public void printText() { 
System.out.println (messageText); 
} 


}
}
 
sorry ,dass letzte programm ist gemeint :roll:

Code:
public class MultiText { 
public static void main (String[] args) { 
HelloText engl = new HelloText(); 
HelloText germ = new HelloText(); 
germ.messageText = "Hallo, liebe Leute!"; 
HelloText cat = new HelloText(); 
cat.messageText = "Miau!"; 
engl.printText(); 
germ.printText(); 
engl.printText(); 
cat.printText(); 
engl.printText();

class HelloText { 
public String messageText = "Hello World!"; 

public void printText() { 
System.out.println (messageText); 
} 
}

}
}
[/quote][/quote]
 
Du kannst keine neue Klasse innerhalb einer Methode erstellen...
so isses richtig:

Code:
public class MultiText {
	public static void main (String[] args) {
		HelloText engl = new HelloText();
		HelloText germ = new HelloText();
		germ.messageText = "Hallo, liebe Leute!";
		HelloText cat = new HelloText();
		cat.messageText = "Miau!";
		engl.printText();
		germ.printText();
		engl.printText();
		cat.printText();
		engl.printText();
	}

}

class HelloText {
	
	public String messageText = "Hello World!";

	public void printText() {
		System.out.println (messageText);
	}
}
 
ehhh ?
"Du kannst keine neue Klasse innerhalb einer Methode erstellen... "Zitat

ehhh ,doch dass geht 🙂 hab es gerade ausprobiert ....

Warum gehts es mit beiden Varianten ,
1 Variante ,dass ich dich klassen unterteile
2 Variante ,dass die eine Klasse in der Methode der eine Klasse ist

es müsste doch nur eine Variante geben..

Code:
public class MultiText { 
public static void main (String[] args) 
{ 
HelloText engl = new HelloText(); 
HelloText germ = new HelloText(); 
germ.messageText = "Hallo, liebe Leute!"; 
HelloText cat = new HelloText(); 
cat.messageText = "Miau!"; 
engl.printText(); 
germ.printText(); 
engl.printText(); 
cat.printText(); 
engl.printText();

class HelloText { 
public String messageText = "Hello World!"; 
public void printText() { 
System.out.println (messageText); 
} 




 
}
} 
}
 
math.iso@live.de hat gesagt.:
Warum gehts es mit beiden Varianten ,
1 Variante ,dass ich dich klassen unterteile
2 Variante ,dass die eine Klasse in der Methode der eine Klasse ist
Du postest dann doch nur eine Variante. Mach Dir doch bitte mal die Mühe und poste a) was Deiner Meinung nach gehen sollte aber doch nicht geht und b) was Deiner Meinung nicht gehen sollte aber doch geht.

//EDIT: Tags repariert
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben