Prywatne pola

Dyskusje na temat Javy.
assassin90
Początkujący
Początkujący
Posty: 6
Dołączył(a): środa, 1 września 2010, 20:58

Prywatne pola

Post przez assassin90 »

Witam
Oglądałem kurs dotyczący Swinga(lekcja 13),napisałem podobny kod.Zdziwiła mnie jednak jedna rzecz.
Klasa zewnętrzna Main ma dostęp do prywatnych pól klasy wewnętrznej ColorHandler.
Prawdopodobnie czegoś nie widzę w kodzie,ale bardzo proszę o pomoc.
Chodzi o tą linijkę:

Code: Zaznacz cały

((JComboBox)e.getSource()).setBackground(((ColorHandler)((JComboBox)e.getSource()).getSelectedItem()).kolor);
Wklejam tu akurat pański kod, tylko zmieniłem,że zamiast funkcji get bezwzględnie odwołałem się do zmiennej.
Pozdrawiam
Adam

Code: Zaznacz cały

package listykombinowane;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Main extends JFrame
{
    public Main()
    {
        initComponents();
    }
    public void initComponents()
    {
        this.setTitle("Listy kombinowane");
        this.setBounds(300, 300, 300, 200);
        
        kombinacja.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) 
            {
                //ColorHandler handler = (ColorHandler)((JComboBox)e.getSource()).getSelectedItem();
                
              ((JComboBox)e.getSource()).setBackground(((ColorHandler)((JComboBox)e.getSource()).getSelectedItem()).kolor);
                        
            }
        });
        
        panel.add(kombinacja);
        
        kombinacja.addItem(new ColorHandler("Czarny", Color.BLACK));
        kombinacja.addItem(new ColorHandler("Zielony", Color.GREEN));
        kombinacja.addItem(new ColorHandler("Niebieski", Color.BLUE));
        kombinacja.addItem(new ColorHandler("Żółty", Color.YELLOW));

        this.getContentPane().add(panel);
        this.setDefaultCloseOperation(3);
    }
    private class ColorHandler
    {
        public ColorHandler(String colorName, Color kolor)
        {
            this.kolor = kolor;
            this.colorName = colorName;
        }
        @Override
        public String toString()
        {
            return this.colorName;
        }
      
        private Color kolor;
        private String colorName;
    }
    
    private JPanel panel = new JPanel();
    private JComboBox kombinacja = new JComboBox();
    
    public static void main(String[] args)
    {
        new Main().setVisible(true);
    }
    

}
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Prywatne pola

Post przez Morfidon »

Witam,

Klasa Main nie ma dostępu do zmiennych; prywatnej klasy wewnętrznej ColorHandler, ale jeżeli stworzy się instancję obiektu ColorHandler w klasie Main, to jak najbardziej ta instancja ma dostęp do swoich pól.

Trzeba rozróżnić pojęcie klasa od obiektu. Klasa to foremka do tworzenia obiektów. Po stworzeniu obiektu przy pomocy operatora new, mamy instancję tego obiektu, czyli jego wyjątkowy egzemplarz. Każdy stworzony egzemplarz nie ma pojęcia o innych egzemplarzach i każdy egzemplarz może wykonywać operacje jakie ma zapisane w klasie.

Pozdrawiam serdecznie,

Arkadiusz Włodarczyk
assassin90
Początkujący
Początkujący
Posty: 6
Dołączył(a): środa, 1 września 2010, 20:58

Re: Prywatne pola

Post przez assassin90 »

To ja chyba czegoś nie rozumiem.
Private oznacza,że żadna metoda zewnętrzna nie może odczytać ani zmienić wartości pól.Po to pisze się publiczne metody get.
W klasie Main można, przecież zrobić tak:

ColorHandler handler = new ColorHandler("Czarny", Color.BLACK);
Color kolor = handler.color;
kolor = Color.RED;

To narusza enkapuslacje wg.Zawsze myślałem, że do prywatnych pól konkretnego już obiektu,nie można się tak po prostu odwołać, tylko przez metody get(po to one są).

Przepraszam bardzo, jednak proszę o dalsze wyjaśnienie.
...
Pokaże w innym przykładzie o co mi chodzi (jest on z książki).

Code: Zaznacz cały

public class EqualsTest
{
   public static void main(String[] args)
   {
      Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
     
      String string = alice1.getName();

   }
}

class Employee
{
   public Employee(String n, double s, int year, int month, int day)
   {
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month - 1, day);
      hireDay = calendar.getTime();
   }

   public String getName()
   {
      return name;
   }

   public double getSalary()
   {
      return salary;
   }

   public Date getHireDay()
   {
      return hireDay;
   }

 
   private String name;
   private double salary;
   private Date hireDay;
}



To nie można z żaden sposób odwołać się do name bezwzględnie, tylko przez metodę getName.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Prywatne pola

Post przez Morfidon »

"Private oznacza,że żadna metoda zewnętrzna nie może odczytać ani zmienić wartości pól.Po to pisze się publiczne metody get."
Przeczytaj sobie to jeszcze raz - dobrze napisałeś, ale metody znajdujące się w klasie Main są na takim samym poziomie jak najbardziej zewnętrzna wewnętrzna klasa klasy Main.

Wyobraź sobie, że prywatna klasa wewnętrzna jest taka sama jak prywatne pole / zmienna.

Czy w klasie Main po stworzeniu prywatnego pola, masz do niego dostęp? Oczywiście! gdybyś nie miał do niego dostępu z klasy Main to by nie było do niego dostępu z żadnego miejsca. Tak samo jest z klasą wewnętrzną.

Masz dostęp do stworzenia instancji obiektu klasy wewnętrznej, ale nie masz dostępu do zmiennych klasy wewnętrznej, czyli NIE masz możliwości edycji BEZPOŚREDNIO tego co znajduje się w klasie wewnętrznej.

Nie masz bezpośrednio dostępu do tego co znajduje się wewnątrz klasy wewnętrznej z klasy Main, bo wtedy edytowałbyś wszystkie przyszłe instancje stworzone przy pomocy takiej wewnętrznej klasy.

Dopiero po stworzeniu instancji obiektu, (co można Ci zrobić bo w końcu traktujesz klasę wewnętrzną podobnie jak zmienna), czyli egzemplarza, masz dostęp do zmiennych znajdujących się w klasie wewnętrznej, ale to tak naprawdę nie jest to dostęp przy pomocy klasy Main. Tak naprawdę dostajesz się tam tylko dlatego, że egzemplarz ma pozwolenie, aby dostać się do własnych pól.
assassin90
Początkujący
Początkujący
Posty: 6
Dołączył(a): środa, 1 września 2010, 20:58

Re: Prywatne pola

Post przez assassin90 »

Zaczyna mi coś świtać :| .Znaczy to jednak, że normalnie czyli 2 klasy osobne, nie mają dostępu do prywatnych pól EGZEMPLARZY, to jasne i logiczne(metody get).
Jednak gdy mowa o klasach wewnętrznych to:
Klasa wewnętrzna ma dostęp do pól nawet prywatnych klasy zewnętrznej , to też jasne.
Klasa zewnętrzna nie ma dostępu do pól KLASY wewnętrznej ,jasne, ale po stworzeniu EGZEMPLARZA ma dostęp do pól konkretnego obiektu??
To w takim razie po co są w ogóle tworzył Pan metodę getName(), przecież można było o bez niej ?
To czym by się różnił przypadek gdy pola byłyby public ? Klasa wewnętrzna i tak jest tylko widoczna w Main,zewnętrzne klasy nie miały by do nich dostępu.

Jeszcze raz bardzo przepraszam, ale się zamotałem w tych klasach wewnętrznych.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Prywatne pola

Post przez Morfidon »

assassin90 napisał(a):Klasa zewnętrzna nie ma dostępu do pól KLASY wewnętrznej ,jasne, ale po stworzeniu EGZEMPLARZA ma dostęp do pól konkretnego obiektu??
tak
assassin90 napisał(a):To w takim razie po co są w ogóle tworzył Pan metodę getName(), przecież można było o bez niej ?
Nie mogę znaleźć metody getName?
assassin90 napisał(a):To czym by się różnił przypadek gdy pola byłyby public ? Klasa wewnętrzna i tak jest tylko widoczna w Main,zewnętrzne klasy nie miały by do nich dostępu.
Które pola? jeśli pola klasy wewnętrznej byłyby publiczne, to wtedy po stworzeniu egzemplarza takiej klasy, można by się dostać do pól bez używania metod zwanymi "get" z klasy wewnętrznej, tylko bezpośrednio przy pomocy operatora ".".
assassin90
Początkujący
Początkujący
Posty: 6
Dołączył(a): środa, 1 września 2010, 20:58

Re: Prywatne pola

Post przez assassin90 »

Nie mogę znaleźć metody getName?
Przepraszam chodziło mi o getColor().Oryginalnie było:

Code: Zaznacz cały

((JComboBox)e.getSource()).setBackground(((ColorHandler)((JComboBox)e.getSource()).getSelectedItem()).getColor());
Które pola? jeśli pola klasy wewnętrznej byłyby publiczne, to wtedy po stworzeniu egzemplarza takiej klasy, można by się dostać do pól bez używania metod zwanymi "get" z klasy wewnętrznej, tylko bezpośrednio przy pomocy operatora ".".
Chodzi o color i colorName.
No właśnie w klasie zewnętrznej można odwołać się za pomocą ".", więc getColor() jest nie porzebny(chyba, że dla zachowania stylu).
.
.
.
assassin90 napisał(a):Klasa zewnętrzna nie ma dostępu do pól KLASY wewnętrznej ,jasne, ale po stworzeniu EGZEMPLARZA ma dostęp do pól konkretnego obiektu??
tak
To w tym przypadku sprawa się rozjaśnia.Zawsze myślałem, że jeśli pole jest private to operatora "." można użyć TYLKO w metodach tej klasy, a tu zonk.
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Prywatne pola

Post przez Morfidon »

assassin90 napisał(a):
assassin90 napisał(a):Klasa zewnętrzna nie ma dostępu do pól KLASY wewnętrznej ,jasne, ale po stworzeniu EGZEMPLARZA ma dostęp do pól konkretnego obiektu??
tak
To w tym przypadku sprawa się rozjaśnia.Zawsze myślałem, że jeśli pole jest private to operatora "." można użyć TYLKO w metodach tej klasy, a tu zonk.
oczywiście tylko za pośrednictwem tego egzemplarza...
assassin90
Początkujący
Początkujący
Posty: 6
Dołączył(a): środa, 1 września 2010, 20:58

Re: Prywatne pola

Post przez assassin90 »

To tu naprawdę tego nie wiedziałem.Wg trochę to dziwne, zaburza on enkapsulacje.
Ponowie pytanie to po co pisał Pan metodę getColor()?
Morfidon
Administrator
Administrator
Posty: 1332
Dołączył(a): wtorek, 5 sierpnia 2008, 21:48
Contact:

Re: Prywatne pola

Post przez Morfidon »

Metody się piszę nie tylko z "założeń", ale też po to aby było przejrzyście. Metody "get" w kursach najczęściej tylko coś zwracają, ale w praktyce, często mogą też robić jakiś test lub jakąś operację np. tu: http://download.oracle.com/javase/tutor ... asses.html, przed zwróceniem zmiennej. Przy rozszerzaniu możliwości klasy wystarczy teraz edytować już tylko tą metodę, a nie tworzyć ją od nowa.
Post Reply