Почему у классов с модификаторами доступа public и static одинаковые уровни доступа?

Почему я могу обратиться к статическому свойству через экземпляр в данном случае? Не должно ли быть объявлено public int num; или public static int num; для того чтобы этот код работал корректно? Ведь кажется, что использование public static приведет к той же логике работы, почему же public static?
  • 6 января 2024 г. 10:27
Ответы на вопрос 3
Вопрос содержит несколько неточностей. Давайте их разберем.

Модификаторы доступа (`private`, `protected`, `public`) и ключевое слово `static` применяются в Java (и в других языках программирования) к полям, методам и классам (в Java классы могут быть вложенными и тогда они могут иметь модификаторы доступа), но они служат разным целям.

1. **Модификаторы доступа** определяют, откуда можно обращаться к полю, методу или классу:
   - `public` означает, что доступ возможен из любого места.
   - `protected` означает, что доступ возможен из текущего класса, из классов находящихся в том же пакете, и из подклассов.
   - `private` означает, что доступ возможен только из текущего класса.
   - Если модификатор не указан (т.н. "package-private" или default), то доступ возможен только из текущего пакета.

2. **`static`** означает, что поле или метод принадлежит классу, а не экземпляру (объекту) этого класса. Это означает, что для доступа к статическому полю не нужно создавать объект класса - можно обратиться непосредственно через имя класса.

Ваш второй вопрос касается возможности доступа к статическому полю через экземпляр класса. В Java это действительно разрешено, но не рекомендуется, так как это может вводить в заблуждение. Статические поля существуют в одном экземпляре на класс, следовательно, все объекты класса ссылаются на одно и то же поле.

Пример кода для иллюстрации:

```java
public class MyClass {
    public static int num;
}

// ... в другом месте програмы ...

MyClass.num = 5; // Корректный способ доступа к статическому полю

MyClass obj = new MyClass();
obj.num = 10; // Некорректный, но допустимый способ доступа к тому же полю
```

Оба обращения выше модифицируют одно и то же статическое поле `num` класса `MyClass`.

Чтобы сделать код более понятным и следовать хорошим практикам программирования, рекомендуется обращение к статическим полям через имя класса, а не через экземпляры.

Надеюсь, это проясняет ваши вопросы о модификаторах доступа и статических полях.
Неправильно поняли. Модификатор static определяет к чему относится поле или метод - к классу или его экземпляру, доступ он не регулирует.
В джаве есть четыре модфикатора доступа: 
public
private
protected
и
" default ", когда никакой не указан.
default - который, вы используете, когда убираете public, обладает свойствами "package private", т.е. видимость внутри пакета.

Пример:



static - это вообще не о доступе.
Похожие вопросы