public class Luokka {

//-- muuttujia eli kenttiä -----------------------------

  private int i=1;       // joka ilmentymällä on oma i
  private static int j;  // luokkamuuttuja eli staattinen kenttä:
                         // j on yhteinen kaikille ilmentymille

  private int k;         // yksityinen ilmentymämuuttuja
  public static int m;   // jukinen luokkamuuttuja
  int n;                 // pakkausnäkyvyys
  protected int o;       // pakkaus- ja aliluokkanäkyvyys

  public static final int VAKIO=77; // jukinen luokkavakio

  private static int[] taulu;   // yksityinen luokkataulukko

  public int[][] matriisi = {{1,2},{3,4}}; // julkinen luokkamatriisi

//--  konstruktoreita -----------------------------------

  public Luokka() { 
    i+=2; j=3+VAKIO;
  }

  public Luokka(int i) {  // kuormittaminen! 
    this();               // konstruktorin kutsu!
    this.i=i+2*this.i;    // viittaus olion i:hin! 
    j=3*i;
  }

//-- metodeita -----------------------------------------

  public int laske(int x) {  // arvon palauttava ilmentymämetodi,
    return i+j+x+VAKIO;      // "funktio"
  }

  private void tulosta(int x) {  // "arvoton" metodi, "proseduuri"
    System.out.println(i+x);
  }

  static void tulostaJ() { // staattinen metodi eli luokkametodi
    ++j;                   // pakkausnäkyvyydellä
    System.out.println(j);
    //  ++i; ei olisi luvallinen:
    //  "non-static variable i cannot be referenced from a static context"
  }

//-- aksessoreita ------------

  public void asetaK(int x) {     // piilotetun asetus,
    k = x;                        // asettava aksessori
  }
  public int mitaKOn() {          // piilotetun kysely,
    return k;                     // ottava aksessori
  }

//-- staattinen alustuslohko -----------------

  static {
    taulu = new int[8];
    for (int i=0; i<taulu.length; ++i)
      taulu[i] = i*i;
  } 

//-- pääohjelmametodi ----------------

  public static void main(String[] args) {

    Luokka olioA = new Luokka();
    Luokka olioB = new Luokka(7);

    System.out.println(olioA.i+" "+olioB.i);

    System.out.println(olioA.taulu[5]+" "+
                       olioB.taulu[6]+" "+
                       Luokka.taulu[7]);

    olioA.matriisi[0][1] = olioB.matriisi[1][0];
    System.out.println(olioA.matriisi[0][1]+" "+ olioB.matriisi[0][1]);

    System.out.println("Böö! "+olioA.laske(5)+" "+olioB.laske(6));

    olioA.tulosta(7); olioB.tulosta(8);

    olioA.asetaK(89);
    System.out.println(olioA.mitaKOn());

    olioA.tulostaJ(); olioB.tulostaJ();

    tulostaJ();                // oman luokan staattinen!
    // tulosta(8); ei olisi luvallinen!
    // "non-static method tulosta(int) cannot be referenced from a
    //  static context"

    Luokka.tulostaJ();
    // Luokka.tulosta(8);  ei myöskään olisi luvallinen!
  }
}



