Strona 1 z 2

Prywatne pola

Napisane: środa, 1 września 2010, 21:34
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);
    }
    

}

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 10:31
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

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 15:13
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.

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 15:36
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.

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 16:14
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.

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 16:39
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 ".".

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 16:46
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.

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 17:12
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...

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 17:19
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()?

Re: Prywatne pola

Napisane: czwartek, 2 września 2010, 18:17
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.