clone Methode nicht sichtbar



  • zu clone: bei mir funktioniert der Code einwandfrei ohne Fehlermeldung.

    zu static: du kannst statische Methoden natürlich nicht überschreiben (überschreiben == OOP != statisch), von daher sind sie implizit final.



  • Also:
    Ich erstelle in Eclipse ein neues Projekt namens "Test".
    Dann erstelle ich ein neues Package namens "TestPackage".
    Dann habe ich eine java-file in dem Testpackage names "Test.java".

    package TestPackage;
    
    public class Test
    {
    	public static void main(String [] args)
    	{
    		Foo f = new Foo();
    		Foo f2 = (Foo)f.clone(); // The method clone() from the type Object is not visible
    	}
    }
    
    class Foo implements Cloneable
    {
    }
    
    class A
    {
    	public static void fkt() {}
    }
    
    class B extends A
    {
    	public static void fkt() {}
    }
    

    Wenn statische Methoden implizit final sind, wieso kann ich sie dann überschreiben? @ byto



  • Dweb schrieb:

    Wenn statische Methoden implizit final sind, wieso kann ich sie dann überschreiben? @ byto

    Du überschreibst sie nicht, sie haben nur den gleichen Namen. Es gibt in deinem Code eine B.fkt() und eine A.fkt() Method.



  • DEvent schrieb:

    Du überschreibst sie nicht, sie haben nur den gleichen Namen. Es gibt in deinem Code eine B.fkt() und eine A.fkt() Method.

    hmm wenn es 2 verschiedene Funktionen sind, wieso kommt dann ein Fehler wenn ich A.fkt final mache :p 😕

    class A
    {
        public final static void fkt() {}
    }
    
    class B extends A
    {
        public static void fkt() {} // Cannot override the final method from A
    }
    


  • Dweb schrieb:

    DEvent schrieb:

    Du überschreibst sie nicht, sie haben nur den gleichen Namen. Es gibt in deinem Code eine B.fkt() und eine A.fkt() Method.

    hmm wenn es 2 verschiedene Funktionen sind, wieso kommt dann ein Fehler wenn ich A.fkt final mache :p 😕

    class A
    {
        public final static void fkt() {}
    }
    
    class B extends A
    {
        public static void fkt() {} // Cannot override the final method from A
    }
    

    Weil eclipse blöd ist.



  • Dweb schrieb:

    Also:
    Ich erstelle in Eclipse ein neues Projekt namens "Test".
    Dann erstelle ich ein neues Package namens "TestPackage".
    Dann habe ich eine java-file in dem Testpackage names "Test.java".

    package TestPackage;
    
    public class Test
    {
    	public static void main(String [] args)
    	{
    		Foo f = new Foo();
    		Foo f2 = (Foo)f.clone(); // The method clone() from the type Object is not visible
    	}
    }
    
    class Foo implements Cloneable
    {
    }
    
    class A
    {
    	public static void fkt() {}
    }
    
    class B extends A
    {
    	public static void fkt() {}
    }
    

    Achso. Deine Main Methode ist nicht in der selben Klasse wie Foo. Dann gehts natürlich nicht.

    Begründung: Foo erbt zwar die Methoden von Object, überschreibt aber die clone() Methode nicht. Foo#clone() ist also nur sichtbar in der Klasse Foo (weil sie von Object erbt) und im Package java.lang, weil dort Object#clone() deklariert ist.

    Du musst in der Klasse Foo also clone() überschreiben, um die Methode clone() aufrufen zu können. Darüber hinaus machts anders auch gar keinen Sinn (siehe Cloneable Konzept in Java).

    Die andere Frage wurde von DEvent schon beantwortet.



  • eclipse23 schrieb:

    Dweb schrieb:

    DEvent schrieb:

    Du überschreibst sie nicht, sie haben nur den gleichen Namen. Es gibt in deinem Code eine B.fkt() und eine A.fkt() Method.

    hmm wenn es 2 verschiedene Funktionen sind, wieso kommt dann ein Fehler wenn ich A.fkt final mache :p 😕

    class A
    {
        public final static void fkt() {}
    }
    
    class B extends A
    {
        public static void fkt() {} // Cannot override the final method from A
    }
    

    Weil eclipse blöd ist.

    Der Fehler kommt vom Java Compiler. Ich habe ehrlich gesagt keine Ahnung wieso. 🙂



  • DEvent schrieb:

    Der Fehler kommt vom Java Compiler. Ich habe ehrlich gesagt keine Ahnung wieso. 🙂

    Man kann mit dem final bei statischen Methoden halt das überlagern von Methoden verhindern. Die Fehlermeldung ist etwas irreführend:

    public class Foo {
    	public static void f() {
    		System.out.println("foo");
    	}
    }
    
    public class Bar extends Foo {
    	public static void f() {
    		System.out.println("bar");
    	}
    
    	public static void main(String[] args) {
    		f();
    	}
    }
    


  • 🙂 ah ja natürlich,
    Object ist ja im Package java.lang
    und dementsprechend ist clone() nur in Foo sichtbar,
    nicht aber in gesamten TestPackage.

    Dh.: ich muss die clone Methode überschreiben
    mit public o. friendly Zugriffsmodifizierer.



  • ich mach grad bisschen Exceptions und bin dabei auf folgendes gestoßen, und dachte das passt hier wieder gut zum Thema...

    Folgendes:

    Aussage von Sun: You can write a new static method in the subclass that has the same signature as the one in the superclass, thus hiding it.
    [ http://java.sun.com/docs/books/tutorial/java/IandI/subclasses.html ]

    Daraus interpretiere ich, dass statische Methoden nicht vererbt werden, und zwar in dem Sinne dass sie nicht überschrieben werden können, sondern nur verdeckt werden können.

    class Foo
    {
    	static void fkt() 
    	{
    	}
    }
    
    class Bar extends Foo
    {
    	/*
    	 * Laut Sun sind Foo.fkt und Bar.fkt ja dann vollkommen eigenständige Methoden,
    	 * wobei Bar.fkt die Foo.fkt verdeckt.
    	 * 
    	 * Dennoch bekomm ich hier in Eclipse folgenden Fehler:
    	 * Exception "Exception" is not compatible with throws clause in Foo.fkt()
    	 * 
    	 * Hat der Compiler nen Dachschaden oder was ist hier los  :confused:  ??
    	 */
    	static void fkt() throws Exception
    	{
    	}
    }
    

    danke für euere Meinungen 🙂


Anmelden zum Antworten