Доступ к элементу Stati c осуществляется через ссылку на экземпляр (с помощью ключевого слова this) - PullRequest
2 голосов
/ 05 февраля 2020
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 Я пытаюсь установить значение strokeWidth с помощью setStrokeWidth. Но я получаю предупреждение stati c member 'com.example.ud.RoundCapGraph.strokeWidth', доступ к которому осуществляется через ссылку на экземпляр

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

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

Ответы [ 3 ]

2 голосов
/ 05 февраля 2020
Ключевое слово

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

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

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

RoundCapGraph.strokeWidth = strokeWidth;

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

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

0 голосов
/ 05 февраля 2020

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

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

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

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

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

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
   }
}
0 голосов
/ 05 февраля 2020

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

...