#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
usingnew
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?
таким, что вы, возможно, захотите переработать свой ответ 🙂