• ,

Получение доступа к private полям??

Я заметил это решая задачу Stopwatch (Секундомер).
Обратите внимание на метод doStep класса Stopwatch.

package com.javarush.task.task16.task1612;

public class Solution {
    public static volatile boolean isStopped = false;

    public static void main(String[] args) throws InterruptedException {
        Runner ivanov = new Runner("Ivanov", 4);
        Runner petrov = new Runner("Petrov", 2);
        ivanov.start();
        petrov.start();
        Thread.sleep(2000);
        isStopped = true;
        Thread.sleep(1000);
    }

    public static class Stopwatch extends Thread {
        private Runner owner;
        private int stepNumber;

        public Stopwatch(Runner runner) {
            this.owner = runner;
        }

        public void run() {
            try {
                while (!isStopped) {
                    doStep();
                }
            } catch (InterruptedException e) {
            }
        }

        private void doStep() throws InterruptedException {
            stepNumber++;
            Thread.sleep((long)1000 / owner.speed);
            System.out.println(owner.getName() + " делает шаг №" + stepNumber + "!");
        }
    }

    public static class Runner {
        Stopwatch stopwatch;
        private String name;
        private int speed;

        public Runner(String name, int speed) {
            this.name = name;
            this.speed = speed;
            this.stopwatch = new Stopwatch(this);
        }

        public String getName() {
            return name;
        }

        public int getSpeed() {
            return speed;
        }

        public void start() {
            stopwatch.start();
        }
    }
}


А точнее на строку
Thread.sleep((long)1000 / owner.speed);

Этот код компилируется и запускается.
Как это работает?? Почему?? ведь поле speed класса Runner объявлено:
private int speed;

Получается что можно получить доступ к private полям объекта?
Умные люди! Объясните пожалуйста или тыкните носом если ответ очевиден.
  • ,

Модификаторы доступа

Интересный пример из доп.материалов (http://old.intuit.ru/department/pl/javapl/6/)

public class Point {
  private int x, y;

  public boolean equals(Object o) {
    if (o instanceof Point) {
      Point p = (Point)o;
      return p.x==x && p.y==y; //интересна эта строка
    }
    return false;
  }
}


в то время как

Human h = new getHuman();   // получаем ссылку
int i=h.age;   // ошибка!!


«private допускает обращения из любой точки класса, независимо от того, к какому именно объекту оно производится.» Т.е. внутри класса мы можем обращаться к private полям (и методам наверное) любых объектов этого класса.

Вообще в Java 4 модификатора доступа:
private
(none) default
protected
public