как можно составитель отличить "Classname"
Поскольку есть два компонента: Переменная типа и имя переменной. Вы объявляете переменную ClassName
типа ClassName
. Тип всегда идет первым. Классы не являются первоклассными объектами (что означает, что вы не можете иметь ссылку на класс), если вы не попадете в размышления (с свойством .class
).
Поэтому в операторе печати:
System.out.println(ClassName);
Это может быть только переменной. System.out.println
принимает ссылку на объект, и у вас есть объект, на который ссылается переменная с именем ClassName
, поэтому компилятор может ее решить.
Единственный случай, который может показаться двусмысленным для компилятора, заключается в том, что переменная относится к объекту, который имеет метод экземпляра с тем же именем, что и статический метод класса.
public class SomeClass {
public void aMethod() {
System.out.println("A method!");
}
public static void aMethod() {
System.out.println("Static version!");
}
}
public class TestClass {
public static void main (String[] args) {
SomeClass SomeClass = new SomeClass();
SomeClass.aMethod(); // does this call the instance method or the static method?
}
}
Я уверен, что компилятор обнаружит двусмысленность и обработать его в какой-то определенным образом (в спецификации Java). Вероятно, один из:
- Не допускайте, чтобы статический и экземплярный метод имел одинаковое имя.
- Разрешите это, и при разрешении ссылки во время компиляции выберите метод экземпляра.
- Разрешите это, и при разрешении ссылки во время компиляции предпочитайте статический метод.
Если какой-либо из последних 2, я думаю, будет зарегистрировано предупреждение о компиляторе.
Теперь, когда вопрос компилятора в стороне, единственным другим потребителем кода являются люди. Компиляторы могут быть в состоянии полагаться на спецификации, чтобы гарантировать логическое поведение, но люди не могут. Мы смущаемся легко. Лучший совет, который у меня есть для этого, - просто, не делайте этого!
Нет абсолютно никакой причины указывать переменную, идентичную классу. На самом деле, большинство соглашений о стиле кодирования Java, которые я видел, используют lowerCamelCase для обозначения переменных и методов и UpperCamelCase для обозначения классов, поэтому нет возможности столкнуться, если вы не отклоняетесь от стандартов.
Если я столкнулся с кодом, подобным этому в проекте, над которым я работал, я бы сразу переименовал переменную, прежде чем делать что-либо еще.
Для моего неоднозначного случая экземпляра и статического метода с тем же именем может быть и урок для человека: не делайте этого!
В Java есть много правил, которые заставляют вас делать то, что логично, и сделать код легким для подражания, но в конце концов это все еще код, и вы можете написать любой код, который вы хотите. Никакая спецификация языка или компилятор не могут помешать вам писать путаный код.
Да, и именно поэтому мы стандарты кодирования, чтобы объявить имя переменных в верблюжьем, чтобы избежать этих проблем удобочитаемости. –
@LuiggiMendoza ** нижний * camelCase. – Biffen
"результат выполнения, ссылка на компилятор" Имя класса "как имя переменной." Это не правда. Это имя класса, а не имя переменной! –