Loading

Paste #ppwy3mxst

  1. // Se declara clasa 'Town', ce este accesibila atat in pachetul curent cat si in afara lui (specificatorul 'public')
  2. public class Town {
  3.     // Campurile de date sau proprietatile sunt de cele mai multe ori lasate
  4.     // private, intrucat nu ar trebui accesate direct, ci prin intermediul
  5.     // metodelor
  6.     private String name;
  7.     private float x;
  8.     private float y;
  9.     private boolean isCapital;
  10.  
  11.     public Town(String name, float x, float y) {
  12.         this.name = name;
  13.         this.x = x;
  14.         this.y = y;
  15.         // 'this.isCapital' nu este initializat si ramane la valoarea default de
  16.         // false
  17.     }
  18.  
  19.     public float getDistanceTo(Town other) {
  20.         float xDif;
  21.         float yDif;
  22.  
  23.         xDif = x - other.x;
  24.         yDif = y - other.y;
  25.         // Distanta euclidiana
  26.         return (float) Math.sqrt(xDif * xDif + yDif * yDif);
  27.     }
  28.  
  29.     // '@Override' este o anotatie ce transmite compilatorului intentia de a
  30.     // suprascrie o metoda dintr-o clasa parinte. Mai multe detalii in
  31.     // laboratoarele de mostenire
  32.     @Override
  33.     public String toString() {
  34.         // Metoda 'toString()' este invocata automat de compilatorul java atunci
  35.         // cand se incearca transformarea unei instante intr-un 'String'. Un
  36.         // exemplu este in cazul folosirii functiei 'System.out.println()'.
  37.         // Aceasta asteapta un singur parametru de tip 'String', iar daca
  38.         // parametrul nu are acest tip se incearca transformarea lui, de exemplu
  39.         // prin apelarea metodei 'toString()'
  40.  
  41.         String townString;
  42.  
  43.         // Java suporta concatenarea de 'String'-uri. Orice (numere intreci,
  44.         // reale, instante ale claselor) este concatenat unui 'String' este
  45.         // automat convertit intr-un 'String' mai intai
  46.         townString = name + " [" + x + ", " + y + "]";
  47.  
  48.         if (isCapital) {
  49.             townString += " <Capital>";
  50.         }
  51.  
  52.         return townString;
  53.     }
  54.  
  55.     // Metodele de tip 'setter' au un singur scop: acela de a seta valoarea unei
  56.     // proprietati ce nu este direct accesibila (adica nu este publica)
  57.     public void setIsCapital(boolean isCapital) {
  58.         this.isCapital = isCapital;
  59.     }
  60.  
  61.     // Metodele de tip 'getter' au scopul de a intoarce valoarea unei
  62.     // proprietati ce nu este direct acceesibila.
  63.     public String getName() {
  64.         return name;
  65.     }
  66.  
  67.     // Pro tip: setters & getters pot fi generati direct de catre IDE
  68.     public float getX() {
  69.         return x;
  70.     }
  71.  
  72.     public float getY() {
  73.         return y;
  74.     }
  75.  
  76.     // Pentru a executa un program java este nevoie de o clasa executabila. O
  77.     // clasa este considerata executabila daca defineste metoda cu semnatura
  78.     // 'public static void main(String[] args)', similar cu 'int main(int argc,
  79.     // char *argv[])' din C
  80.     public static void main(String[] args) {
  81.         // 'main' este tot o metoda in contextul clasei, intrucat in java nu pot
  82.         // exista functii in afara unei clase. Intrucat metoda este declarata
  83.         // 'static', executia nu se desfasoara in contextul unei instante (de
  84.         // exemplu, nu se poate folosi 'this')
  85.  
  86.         // Sintaxa declarare: ClassName variableName;
  87.         Town bucharest;
  88.         Town sameBucharest;
  89.         Town anotherBucharest;
  90.  
  91.         // Clasa este 'Town', iar numele referintei este 'bucuresti'
  92.         // Atunci cand apelam constructorul unei clase spunem ca instantiem
  93.         // clasa respectiva - 'bucharest' este o instanta a clasei 'Town'
  94.         bucharest = new Town("Bucharest", 0.2f, 0.2f);
  95.  
  96.         // O instanta poate avea mai multe referinte catre ea. In acest exemplu,
  97.         // atat 'bucharest' cat si 'sameBucharest' refera aceeasi instanta
  98.         // din memorie
  99.         sameBucharest = bucharest;
  100.  
  101.         // Operatorul '==' efectueaza comparare de referinte, adica de adrese de
  102.         // memorie.Nu efectueaza compararea efectiva a instantelor! Pentru a
  103.         // defini un mod de a compara instante, in java se defineste si se
  104.         // foloseste de obicei metoda 'equals'
  105.         if (sameBucharest == bucharest) {
  106.             System.out.println("Aceeasi referinta, deci aceeasi instanta din memorie");
  107.         }
  108.  
  109.         // 'anotherBucharest' refera aparent o instanta de tip 'Town' la fel ca
  110.         // 'bucharest'
  111.         anotherBucharest = new Town("Bucharest", 0.2f, 0.2f);
  112.         // Acest lucru nu inseamna ca cele doua referinte vor fi egale.
  113.         // Ganditi-va ca daca alocati dinamic doi intregi cu valoarea 5,
  114.         // valorile lor vor fi egale, pe cand adresele lor din memorie nu
  115.         if (anotherBucharest != bucharest) {
  116.             System.out.println("Referinte diferite, instante diferite in memorie");
  117.         }
  118.         // Pentru tipurile fundamentale, '==' compara valorile
  119.         if (anotherBucharest.getX() == bucharest.getX() && anotherBucharest.getY() == bucharest.getY()) {
  120.             System.out.println("Coordonate identice");
  121.         }
  122.         // Pentru instante, folosim metoda equals (atentie, ea trebuie definita
  123.         // in clasele nou create, altfel va fi folosita o implementare default
  124.         // bazata pe comparare de referinte)
  125.         if (anotherBucharest.getName().equals(bucharest.getName())) {
  126.             System.out.println("Nume identice");
  127.         }
  128.  
  129.         bucharest.setIsCapital(true);
  130.         // Se poate apela 'toString' explicit
  131.         System.out.println(bucharest.toString());
  132.         // Dar nu este neaparata nevoie
  133.         System.out.println(anotherBucharest);
  134.        
  135.         System.out.println(bucharest.getDistanceTo(anotherBucharest));
  136.     }
  137. }