Java Academy · Oppitunti

Polymorfiset toiminnallisuudet

Käyttäkää monimuotoisuutta sekoitettujen muotojen tulostamiseen, lajitteluun ja yhteenvetojen laskemiseen. Pitäkää algoritmit mobiiliympäristöön sopivina, pieninä ja helposti luettavina.

Oppitunti 3/38 vaihetta

Polymorfiset toiminnallisuudet on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/3. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 3 oppituntia.

Yleiskatsaus

Polymorfisten toimintojen avulla voimme käsitellä kaikkia muotoja samalla tavalla, vaikka kukin suorittaa oman laskentansa. Aiomme: (1) tulostaa sekaisin olevan listan yhdenmukaisesti, (2) lajitella area-arvon perusteella ja (3) laskea summat yhdellä silmukalla.

Perus-API:n tarkistuslista

Perus-API sisältää kaikkialla tarvittavat toiminnot:

  • area() ja perimeter() — jokaisen muodon on toteutettava ne.
  • Valinnainen pieni apumetodi, kuten label() tai info(), siistiä tulostusta varten.
  • Kentät pidetään konkreettisissa muodoissa.

Koodi: yhdenmukainen tulostus

Yhdenmukainen tulostus: silmukka käyttää vain Shape-API:a. Kukin olio suorittaa oman toteutuksensa laskentaa varten.

public class Main {
  static abstract class Shape {
    abstract double area();
    abstract double perimeter();
    String label() { return getClass().getSimpleName(); }
    String info() { return String.format("area=%.2f, per=%.2f", area(), perimeter()); }
  }
  static class Circle extends Shape {
    double r; Circle(double r) { this.r = (r < 0) ? 0 : r; }
    double area() { return Math.PI * r * r; }
    double perimeter() { return 2 * Math.PI * r; }
  }
  static class Rectangle extends Shape {
    double w, h; Rectangle(double w, double h) { this.w = Math.max(0, w); this.h = Math.max(0, h); }
    double area() { return w * h; }
    double perimeter() { return 2 * (w + h); }
  }
  public static void main(String[] args) {
    Shape[] list = { new Circle(2.0), new Rectangle(3.0, 4.0), new Circle(1.0) };
    for (int i = 0; i < list.length; i = i + 1) {
      Shape s = list[i];
      System.out.println(s.label() + " -> " + s.info());
    }
  }
}

Lajittelu alan perusteella (idea)

Lajitteluidea:

  • Vertailu: verrataan kahden muodon area()-arvoja.
  • Pienen tietomäärän tapauksessa yksinkertainen bubble/selection-lajittelu riittää.
  • Käyttäkää vain Shape-metodeja; tyyppitarkistuksia ei tehdä.

Koodi: lajittelu alan perusteella

Yksinkertainen lajittelu: tarvitaan vain area()-kutsu. Tyyppitarkistuksia ei tehdä, mikä osoittaa polymorfismin voiman.

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); String label(){ return getClass().getSimpleName(); } }
  static class Circle extends Shape { double r; Circle(double r){ this.r = Math.max(0, r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  // Very small bubble sort for beginners (ascending by area)
  static void sortByArea(Shape[] arr){
    for(int pass=0; pass<arr.length-1; pass=pass+1){
      for(int i=0; i<arr.length-1; i=i+1){
        if(arr[i].area() > arr[i+1].area()){
          Shape tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp;
        }
      }
    }
  }

  public static void main(String[] args) {
    Shape[] a = { new Rectangle(3,4), new Circle(2), new Circle(1) };
    sortByArea(a);
    for(int i=0;i<a.length;i=i+1){
      System.out.println(a[i].label() + " area=" + String.format("%.2f", a[i].area()));
    }
  }
}

Koodi: kokonaisala

Summan laskeminen: area()-kutsut lasketaan yhteen yhdessä silmukassa. Jokainen alkio tekee oman laskentansa, joten koodimme pysyy yksinkertaisena.

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); }
  static class Circle extends Shape { double r; Circle(double r){ this.r=Math.max(0,r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  static double totalArea(Shape[] arr){
    double sum = 0.0;
    for(int i=0;i<arr.length;i=i+1){
      sum = sum + arr[i].area(); // polymorphic call
    }
    return sum;
  }

  public static void main(String[] args) {
    Shape[] list = { new Circle(1), new Rectangle(2,3), new Circle(0.5) };
    System.out.println("Total area = " + String.format("%.2f", totalArea(list)));
  }
}

Polymorfisen tyylin tarkistus

Pikatarkistus: Mikä koodityyli hyödyntää tässä polymorfismia parhaiten?

Kertaus

Kertaus: Kirjoitimme saman API:n avulla, ja jokainen muoto tuotti oman tuloksensa. Tulostus, lajittelu ja summan laskeminen toimivat yhdenmukaisella koodilla.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Polymorfiset toiminnallisuudet” ilmainen?

Kyllä – oppitunnin ”Polymorfiset toiminnallisuudet” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 3 oppituntia.

Mitä opin oppitunnilla ”Polymorfiset toiminnallisuudet”?

Käyttäkää monimuotoisuutta sekoitettujen muotojen tulostamiseen, lajitteluun ja yhteenvetojen laskemiseen. Pitäkää algoritmit mobiiliympäristöön sopivina, pieninä ja helposti luettavina. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/3.

Kuinka kauan ”Polymorfiset toiminnallisuudet”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Suunnittelu
  2. Toteutus
  3. Polymorfiset toiminnallisuudet
← Takaisin: Java Academy