Avatar billede themepark Nybegynder
28. april 2005 - 00:52 Der er 16 kommentarer

Tilføjelse af nye funktioner til Java standard classes

Er det egentlig muligt at lave en funktion, som man så kalder med en af Java's standard classes, som f.eks. Math.pow, Math.floor osv, så man kaldte funktionen med Math.funktionsnavn?
Avatar billede kalp Novice
28. april 2005 - 01:19 #1
arve fra klassen?
Avatar billede themepark Nybegynder
28. april 2005 - 01:34 #2
Hmm...næh, mere tilføje til en klasse, så man ikke skal kalde f.eks. Add (hvis ens funktion hedder det), men kan kalde Math.add i stedet for, altså på en eller anden måde lave ens class sådan at den automatisk bliver implementeret til Math, hvis man har installeret class filen.
Avatar billede kalp Novice
28. april 2005 - 01:49 #3
Alle metoder i Math klassen kan du kalde ved at skrive Math.metodenavnet
Hvis du vil tilføje yderligere funktioner til klassen og bibeholde de metoder den i forvejen har må du arve fra den.

men jeg kan godt høre hvad du vil have.. at du kan lave en klasse med nogle metoder som bliver tilføjet Math klassen.

Det tror jeg bare ikke du kan gøre.
Avatar billede themepark Nybegynder
28. april 2005 - 01:58 #4
Lige præcis det :) Næh det anede mig jo :(
Avatar billede mollevp Nybegynder
28. april 2005 - 02:19 #5
Du kan lave din egen Math klasse der arver fra Math, og der tilføje ekstra funktionalitet...

fx.

public class MyMath extends Math
{
  public MyMath()
  {
      super();
  }

  public static int add(int a, int b)
  {
      return a+b;
  }
}


Noget i den retning :)
Avatar billede kalp Novice
28. april 2005 - 02:26 #6
mollevp

sikkert mig som sover.. men hvorfor kalder du super() ? altså Math's kontruktør?
er alle dens metoder ikke statiske?
Avatar billede arne_v Ekspert
28. april 2005 - 07:48 #7
Desværre har SUN forudset den lille manøvre.

java.lang.Math er final - I kan ikke extende den
Avatar billede arne_v Ekspert
28. april 2005 - 07:48 #8
PS: iøvrigt er der ikke meget sjov ved at extende en klasse med kun
    static metoder da static metoder ikke er virtual
Avatar billede mollevp Nybegynder
28. april 2005 - 11:30 #9
kalp: he he.. tror vist det var mig der sov der, du har ret..

arne_v: det havde jeg ikke lige tænkt på, hvad betyder det at static metoder ikke er virtual?
Avatar billede arne_v Ekspert
28. april 2005 - 11:37 #10
mollevp>

Prøv og kør:

public class PolyOrNotPoly {
    public static void test(A o) {
        o.m1();
        o.m2();
    }
    public static void main(String[] args) {
        test(new B());
    }
}

class A {
    public void m1() {
        System.out.println("A.m1");
    }
    public static void m2() {
        System.out.println("A.m2");
    }
}

class B extends A {
    public void m1() {
        System.out.println("B.m1");
    }
    public static void m2() {
        System.out.println("B.m2");
    }
}
Avatar billede mollevp Nybegynder
28. april 2005 - 14:13 #11
Ok, tror jeg forstår det: hvis en funktion er static bliver den ikke (kender ikke lige den tekniske betegnelse) "over-ruled" hvis man extender... godt at vide.. takker
Avatar billede kalp Novice
28. april 2005 - 14:21 #12
Nu sidder jeg her og prøver at finde et alternativ..

Man kan ikke tilføje ekstra metoder til Math klassen.
Man kan ikke arve fra math klassen fordi den er Final.

og dog... man har jo adgang til source koden. Så kan man vel bare bruge den og indsætte sine egne metoder i klassen.?
Avatar billede arne_v Ekspert
28. april 2005 - 15:10 #13
Ja måske .........

Der er også et par små forhindringer der.

Jeg mener at klasser i java.lang skal loades med boot classloaderen d.v.s. at
man skal bruge -Xbootclasspath

Endvidere søger Java jo først i rt.jar efter klasser d.v.s. at man skal faktisk
have erstattet rt.jar med -Xbootclasspath ikke appended

Og så er der lige licensen. Fra dokumentationen:

-Xbootclasspath:bootclasspath
    Specify a semicolon-separated list of directories, JAR archives, and ZIP archives to search for boot class files. These are used in place of the boot class files included in the Java 2 SDK. Note: Applications that use this option for the purpose of overriding a class in rt.jar should not be deployed as doing so would contravene the Java 2 Runtime Environment binary code license.
Avatar billede simonvalter Praktikant
28. april 2005 - 15:29 #14
public class Test {
    public static void main(String[] args) {
    System.out.println(Test.minCeil(1.3));
    }

    public static double minCeil(double a) {
        return Math.ceil(a);
    }
}

eller har jeg misforstået hvad du vil.
Avatar billede simonvalter Praktikant
28. april 2005 - 15:43 #15
ja det har jeg vist ;) .. men kan nu ikke se nogen grund til at gøre det andet.
Avatar billede snoop_one Nybegynder
29. april 2005 - 01:13 #16
Det, jeg tror, du kunne gøre er at finde sorce koden og copy paste den i dit projekt og tilføje dine metoder der... så istedet for at kalde
import java.lang.math;
kalder du
import dinpakke.math;

Grunden til, at det ikke er så smart at tilføje metoder og klasser til JAVA CLASS LIBRARY er bla., at du så derved altid skal distribuere din JRE med dit program. Desudens skal du huske hver eneste gang du benytter dig af de metoder du selv har tilføjet at skrive som kommentar at det er metoder du selv har tilføjet til class library - ellers kan en anden der kigger din kode igennem eller skal arbejde vidre med den bruge masser af tid på, at finde ud af hvor/hvordan de metoder er kommet til (med mindre du selvfølgelig også udgiver din egen JAVADOC til din JRE) ;0)
Som det fremgår er ulemperne store og fordelen meget lille - selv hvis det var lovligt at gøre det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester