Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Peter Heitzer" Newsgroups: de.comp.lang.java Subject: Re: Was ist an dieser Klasse falsch? Date: 30 Jul 2020 09:10:19 GMT Lines: 61 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net tFiRONuz/k1wu0uCwf5zDgwHQdpyLdFZ5YBXLvHPTr+OaJS69tnYJ0JCxm X-Orig-Path: not-for-mail Cancel-Lock: sha1:Ryo12lfAZ7vBeJuAYw5xM48R9kc= User-Agent: tin/2.4.1-20161224 ("Daill") (UNIX) (Linux/4.9.0-12-amd64 (x86_64)) Xref: csiph.com de.comp.lang.java:13348 Michael Paap wrote: >Am 30.07.2020 um 09:58 schrieb Peter Heitzer: >> Peter Heitzer wrote: >>> Ich habe ein Verständnisproblem mit folgendem kleinen Stück Javacode: >> >>> import java.util.*; >> >>> public class P extends Properties { >>> public String getProperty(String p) { >>> return super.getProperty(p,"de"); >>> } >>> >>> public static void main(String[] args) { >>> P x=new P(); >>> x.setProperty("a","b"); >>> System.out.println(x.getProperty(args[0])); >>> } >>> } >> >>> Es wird ohne Fehler übersetzt. Wenn man es aber startet bricht es mit >>> Stackoverflow ab. Ich kann mir nicht erklären, was hier passiert. >>> Die abgeleitete Klasse P überschreibt die Methode getProperty(String) und >>> ruft darin die Originalmethode getProperty(String,String) auf. >>> Das Laufzeitverhalten mit Stackoverflow schaut aber für mich so aus, als >>> ob die überschriebene Methode sich selbst aufruft. >>> Wer kann mir das Verhalten erklären? >Vorab: Es wäre sinnvoll, wenn du dein Posting nicht schon als Zitat >beginnen würdest. Wenn man dann z.B. den Code rauskopieren will, muss >man erst noch Zitatzeichen entfernen... Ich hatte es ursprünglich in die falsche Gruppe gepostet und der Einfachheit (meiner Faulheit geschuldet) hierhin als Following gepostet. Sorry dafür. >Zur Frage: Du rufst in deiner Methode getProperty() eine Methode der >Superklasse auf. Das könntest du übrigens auch ohne "super", weil es ja >nicht die Methode ist, die du überschrieben hast (unterschiedliche >Parameterzahl). Aber das ist nicht das Problem. >Das Problem besteht darin, dass die Methode, die du da aufrufst, >ihrerseits wieder die Methode getProperty() aufruft, die einen Parameter >mit Deklarationstyp String hat. Und das ist aufgrund dynamischer Bindung >dann wieder "deine" Methode getProperty(), womit du eine nette kleine >Endlosschleife gebaut hast. Zu der Erkenntnis hat mit ein Kollege mittlerweile auch gebracht. Ich habe nicht überrissen, daß in der Superklasse die originale einparametrige nicht mehr sichtbar ist, sondern nur die überschriebene. Der Grund für die Ableitung der Properties Klasse ist in einem Programm von mir gegründet. Es ist ein kleiner Webservice, der sowohl als Produktivversion als auch als Testversion läuft. Welche Version es ist, wird beim Start durch eine Systemvariable festgelegt, welche als Präfix dient. Da der Service seine Parameter aus einer Datei liesst, einhält diese jeweils einen Eintrag für Produktion und Test, z.B. Serverport=xxx bzw. TestServerport=yyy Im eigentlichen Programm brauche ich dann keine Fallunterscheidung, da meine abgeleitete Properties Klasse jeweils das passende Präfix vor den Namen der Property setzt. Danke auf jeden Fall für die prompte Hilfe. -- Dipl.-Inform(FH) Peter Heitzer, peter.heitzer@rz.uni-regensburg.de