Interface und erforderte static's

Moch

Bekanntes Mitglied
Hallo,
im Rahmen der Übungen haben wir kürzlich mit Interfaces angefangen und sogleich eine "Hausaufgabe" bekommen, die mir Kopfzerbrechen bereitet.
Um uns Schreibarbeit zu ersparen, sollen wir ein Package basteln, das einige - für uns wesentliche - Grundfunktionen abdeckt.
- Zufallszahlen (von 0 bis n(Int), von m bis n(Int) und das gleiche nochmal für Double)
- Usereingabe (einlesen eines Strings aus der Konsole)
- Stringvergleiche (Rückgabe eines Bool-Werts (wo auch immer hier die Schreibarbeit sein soll...))
- Erzeugen von Arrays (Int, Double, String mit der Länge i)

Alles schön und gut. Mein Interface mit zugehöriger Klasse ist mittlerweile fertig und alle Funktionen sind - wie gewünscht - funktionstüchtig. In der nächsten Aufgabe jedoch sollen wir ein Zahlenraten-Spiel so modifizieren, dass wir die bisher ausgeschriebenen Sache durch die Funktionen des Packages ersetzen sollen. Habe damit jetzt noch nicht angefangen, aber mir ist aufgefallen, dass das zu modifizierende Programm fast komplett für die main-Methode abläuft - wie die aussieht, ist ja gemeinhin bekannt.

Aber erfordert die main-Methode nicht grundsätzlich Variablen, die als static deklariert wurden?
Das wäre dann für mich ein Widerspruch, da ich gelernt habe, dass man Interfaces (logischerweise) nicht mit static Methoden bauen kann.
Wie umgehe ich das Problem möglichst geschickt?

mfg
Moch
 

AmunRa

Gesperrter Benutzer
In dem du ein Object der Klasse anlegst das das Interface implementiert.

Für genaue Fragen bitte einfach mal etwas Code posten
 

XHelp

Top Contributor
Naja, das man aus der main-Methode nur auf den statischen Kontext zugreifen kann ist etwas eine andere Geschichte und bezieht sich eigentlich auf die selbe Klasse. Du kannst doch problemlos wie folgt machen:
Java:
class Test{
  public static void main(String[] args) {
    VonDirGebastelteHilfsklasse eingabe = new VonDirGebastelteHilfsklasse();
    ...
    String s = eingabe.leseIrgendwasEin();
    ...
  }
}
 

Moch

Bekanntes Mitglied
Okay, um es kurz zu halten, werde ich hier ein vereinfachtes Beispiel posten:

1. Das Interface:
[Java]
package user_fkt;

public interface Basis_Interface {
public int zufall_Integer(int n);
public int zufall_Integer(int n, int m);
public double zufall_Double(int n);
public double zufall_Double(int n, int m);
public String input();
public Boolean strBool(String s1, String s2);
public int[] l_Array_int (int i);
public String[] s_Array_int (int i);
public Double[] d_Array_int (int i);
}
[/Java]

2. zugehörige Klasse, erzeugt via Eclipse
Java:
package user_fkt;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Basis_fkt implements Basis_Interface {

	@Override
	public int zufall_Integer(int n) {
		int a = (int) (Math.random()*n);
		return a;
	}

	@Override
	public int zufall_Integer(int n, int m) {
		int a = (int) (Math.random()*n+m);
		return a;
	}

	@Override
	public double zufall_Double(int n) {
		n=n-1;
		double a = Math.random()*n;
		return a;
	}
	
	@Override
	public double zufall_Double(int n, int m) {
		n=n-1;
		double a = Math.random()*n+m;
		return a;
	}
	
	@Override
	public String input() {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String s = null;
		try{ s = br.readLine();}
		catch(IOException ioe){
			System.out.println("ERROR: IO error trying to read inputstring");
			System.exit(1);
		}
		return s;
	}

	@Override
	public Boolean strBool(String s1, String s2) {
		if(s1.equals(s2)){
			return true;
		}else{return false;}
	}

	@Override
	public int[] l_Array_int(int i) {
		int []a = new int[i];
		return a;
	}

	@Override
	public String[] s_Array_int(int i) {
		String[] a = new String[i];
		return a;
	}

	@Override
	public Double[] d_Array_int(int i) {
		Double[] a = new Double[i];
		return a;
	}

}

3. Eine simulierte Anweisung. Ich bitte Schreibfehler zu entschuldigen, da ich das Kurz selbst geschrieben habe.
Java:
public class beispiel{
public static void main(String[] args){
System.out.println("Bitte Namen eingeben");
String s = user_fkt.Basis_fkt.input();
System.out.println("Hallo, " + s);
}
}

Das jetzt nur als sehr einfaches Beispiel, da ich hier ungerne zig Seiten Quelltext abschreiben und posten wollte. Macht erstens viel Aufwand und zweitens macht's das sehr unübersichtlich denke ich.
 

jgh

Top Contributor
na ja, wie X-Help schon geschrieben hat...du musst erstmal eine Instanz deiner Klasse erzeugen und dann auf die Methoden zugreifen, wie gewünscht.
Dein Bsp. mal (mehr oder weniger) korrekt:

Java:
	public static void main(String[] args) {
		System.out.println("Bitte Namen eingeben");
		Basis_fkt basis_fkt = new Basis_fkt();

		String s = basis_fkt.input();
		System.out.println("Hallo, " + s);

	}
 

Moch

Bekanntes Mitglied
Oh, tschuldige XHelp, Deinen Beitrag habe ich übersehen :-(
Vielen Dank auf jeden Fall Euch beiden. :)

Wenn ich aber noch nachfragen darf: Welchen Effekt bewirkt denn diese Instaziierung?
Also, dass dadurch eine neue Instanz erstellt wird, ist selbst mir klar.
Was ich nur nich verstehe ist, warum ich hier "plötzlich" mit non-statics arbeiten kann/darf oder vorher nicht.

Hab' früher (in der Schule) schon mal den Fehler gemacht, etwas einfach als gegeben hinzunehmen -> hauptsache es lief irgendwie... erst im Studium habe ich dann auch teilweise verstanden warum oder was da lief und konnte das dementsprechend auch anders nutzen. Deshalb hinterfrage ich das, da ich vermutlich irgendwo im Teil über Instanzen nicht aufgepasst/zugehört habe, oder das nicht erklärt worden ist.

mfg und nochmals vielen Dank
Moch
 
G

Gastredner

Gast
Statische Methoden und Felder sind an die Klasse gebunden, nicht-statische an ihre Instanzen.
Will heißen: statische Methoden können verwendet bzw. auf statische Felder kann zugegriffen werden, ohne dass eine Instanz der Klasse angelegt werden muss. Daher verwendet man diese oftmals für Hilfsfunktionen, die aus den hineingegebenen Daten irgendetwas berechnen/erzeugen/was auch immer damit anstellen. Problematisch ist dies jedoch, wenn diese Methoden über mehrere Aufrufe hinweg einen persistenten Status benötigen, um ihre Funktion zu erfüllen. Diesen Status müsste man in statischen Feldern ablegen, die selbstverständlich auch durch andere Methoden manipuliert werden können. Das führt dann entweder zu hässlichem Code (für jede Methode eigene Felder) oder zu unerwarteten Fehlern (falscher Status beim Aufruf der Methode, da Status zwischendurch geändert).
Instanzen einer Klasse besitzen ihren eigenen Status bzw. kapseln ihren Zustand, sodass nur ihre eigenen Methoden darauf zugreifen können. Verschiedene Instanzen können verschiedene Zustände besitzen, ohne sich dabei in die Quere zu kommen. Nicht-statische Methoden haben dann nur Zugriff auf die Felder ihrer Instanz bzw. deren Methoden.

Ein Beispiel:
Java:
public enum TemperaturScale {

	/*
	 * Dieses enum repräsentiert nicht nur die verschiedenen Temperaturskalen,
	 * sondern übernimmt für uns auch die Konvertierung in und aus einer einheitlichen
	 * Skala, hier Kelvin. Damit erfolgt die Umrechnung.
	 */

	KELVIN {
		public float toKelvin(float degree) {
			return degree;
		}
		public float fromKelvin(float kelvin) {
			return kelvin;
		}
	},
	CELSIUS {
		public float toKelvin(float degree) {
			return degree + 273.15f;
		}
		public float fromKelvin(float kelvin) {
			return kelvin - 273.15f;
		}
	};

	public abstract float toKelvin(float degree);
	public abstract float fromKelvon(float kelvin);
}

public class StaticTemperaturConverter {

	public static TemperaturScale currentScale;

	public static float convert(float degree, TemperaturScale toScale) {
		return toScale.fromKelvin(currentScale.toKelvin(degree));
	}
}

public class TemperaturConverter {

	private TemperaturScale fromScale;
	private TemperaturScale toScale;

	public TemperaturConverter(TemperaturScale fromScale, TemperaturScale toScale) {
		this.fromScale = fromScale;
		this.toScale = toScale;
	}

	public float convert(float degree) {
		return toScale.fromKelvin(fromScale.toKelvin(degree));
	}
}

public class Test {

	public static void main(String[] args) {
		float kelvin = 23.753f;
		// Statisch - hätten wir die Initialisierung vergessen, gäbe es hier eine
		// NullPointerException. Wäre sie zwischendurch unbemerkt geändert worden,
		// dann gäbe es zwar keine Exception, aber die Konvertierung würde falsche
		// Werte zurückliefern!
		StaticTemperaturConverter.currentScale = TemperaturScale.KELVIN;
		float celsius = StaticTemperaturConverter.convert(kelvin, TemparaturScale.CELSIUS);
		// Nicht-statisch - benötigt ein Objekt und daher Speicher, bietet aber für
		// die Lebenszeit des Objekts eine garantiert gleichbleibende und unveränderbare
		// Konvertierung.
		TemperaturConverter fromKelvinToCelsius = new TemperaturConverter(TemperaturScale.KELVIN, TemperaturScale.CELSIUS);
		celsius = fromKelvinToCelsius.convert(kelvin);
	}
}
 
Zuletzt bearbeitet von einem Moderator:

Moch

Bekanntes Mitglied
Ich bedanke mich vielmals für die Erklärung =)
Muss ich wohl in der Vorlesung nicht mitbekommen haben.

liebe Grüße
und nochmal vielen Dank an Alle!
Moch
 

Crian

Top Contributor
Ich würde dir noch einen Blick auf die naming conventions empfehlen.

Außerdem sollten Methoden und Variablen möglichst sprechende (und aussprechbare) Namen haben.

Bist du sicher, dass die Zufallsmethoden, die double-Werte zurückgeben, die Grenzen als int bekommen sollen? Vielleicht möchte jemand Zufallswerte zwischen 0.4 und 0.7?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
P Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4
N Interface Interface (sinnvoll) erzeugen Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben