Доступ к статическому члену через ссылку на экземпляр (с использованием ключевого слова ‘this’)

#java

#java #Android #android-studio #статический #экземпляр

Вопрос:

 public class RoundCapGraph extends View {
   static private int strokeWidth = 20;

   public void setStrokeWidth(int strokeWidth){
       this.strokeWidth = strokeWidth;
       //warning : static member 'com.example.ud.RoundCapGraph.strokeWidth' accessed via instance reference
   }
}
  

В Android Studio я пытаюсь установить ширину строки с помощью setStrokeWidth.
Но я получаю предупреждение
о статическом члене ‘com.example.ud.RoundCapGraph.strokeWidth’, доступ к которому осуществляется через ссылку на экземпляр

Вопрос: Создает ли ключевое слово ‘this’ новый экземпляр и переменную доступа через новый экземпляр?

ОТРЕДАКТИРОВАНО: мне действительно не нужно устанавливать strokeWidth переменную static, но я хочу понять, почему использование ключевого слова ‘this’ приводит к конкретному предупреждению

Комментарии:

1. Создайте объект RoundCapGraph using new operator и затем используйте его.

2. @chiragsoni это ужасная идея 🙂

Ответ №1:

this ключевое слово не создает новый экземпляр, но this. обычно используется для доступа к переменным экземпляра.

Поэтому, когда компилятор видит, что вы пытаетесь получить доступ static к переменной через this. , он предполагает, что вы, возможно, допустили ошибку (т. Е. Что Вы намеревались получить доступ к переменной экземпляра), поэтому он предупреждает об этом.

Лучший способ доступа к static переменной:

 RoundCapGraph.strokeWidth = strokeWidth;
  

РЕДАКТИРОВАТЬ: вы устанавливаете свою static переменную в методе экземпляра. Это хороший признак того, что компилятор был прав, предупреждая вас о доступе к static переменной, как если бы это была переменная экземпляра.

Вы должны устанавливать static переменные с помощью static методов и устанавливать переменные экземпляра с помощью методов экземпляра.

Комментарии:

1. Другими словами, this не создает экземпляр, если вы не используете его как this(/*...*/) (но это уже другая история), когда мы используем this , мы ссылаемся на объект экземпляра, который будет создан с использованием класса.

Ответ №2:

Когда вы обращаетесь к статическому члену с помощью экземпляра объекта, экземпляр заменяется классом. т.е. this.strokeWidth заменяется на RoundCapGraph.strokeWidth

Не будет NullPointerException из-за замены экземпляра.

Я нашел ссылку на это в спецификации Java: глава 15, раздел 11: Выражения доступа к полю.

Пример 15.11.1-2. Переменная получателя не имеет значения для доступа к статическому полю

Следующая программа демонстрирует, что нулевая ссылка может использоваться для доступа к переменной класса (статической), не вызывая исключения

 public class RoundCapGraph extends View {
   static private int strokeWidth = 20;

   public void setStrokeWidth(int strokeWidth){
       RoundCapGraph roundCapGraph = null;
       roundCapGraph.strokeWidth = strokeWidth; // NullPointerException?
       //warning : static member 'com.example.ud.RoundCapGraph.strokeWidth' accessed via instance reference
   }
}
  

Ответ №3:

Правильно, статические члены принадлежат классу, а не экземпляру.

Комментарии:

1. вопрос был Does 'this' keyword make new instance and access variable via new instance? таким, что вы, возможно, захотите переработать свой ответ 🙂