#c# #.net #oop #class #static
#c# #.net #ооп #класс #статические
Вопрос:
Почему статические классы не могут иметь нестатические методы и переменные, когда нестатические классы могут иметь статические методы и переменные?
В чем преимущество наличия статических методов и переменных в нестатическом классе? Хотя наличие статического конструктора в нестатическом классе понятно.
Ответ №1:
Статические классы не могут быть созданы в первую очередь, поэтому, даже если вы могли бы объявить нестатические (экземплярные) члены, к ним никогда нельзя будет получить доступ. Поскольку на самом деле нет смысла разрешать это по этой причине, язык просто запрещает это.
Имейте в виду, что статические классы — это просто классы, в то время как есть две вещи, которые напрямую связаны с нестатическими классами: сами классы и экземпляры / объекты классов.
Нестатический класс может иметь как статические, так и нестатические члены, так что статические члены применяются к классу, тогда как нестатические члены применяются к экземплярам этого класса.
Ответ №2:
Статический класс не может содержать нестатические члены, потому что по определению он не может быть создан, поэтому нет возможности использовать эти члены.
Однако статические члены в нестатическом классе можно использовать без экземпляра класса — немного другой сценарий, т. Е. Для служебных методов или заводских методов.
Ответ №3:
Допустим, у вас есть класс Person, у которого есть имя поля. И давайте предположим, ради аргумента, что Java разрешила статическим методам прямой доступ к нестатическим переменным-членам. Затем мы могли бы указать статический метод getName для нашего Person следующим образом:
class Person {
private final String name;
public Person(String name) {
this.name = name;
}
public static String getName() {
return name;
}
}
Теперь давайте попробуем использовать этот класс в примере:
public static void main(String[] args) {
Person alice = new Person("Alice");
Person bob = new Person("Bob");
System.out.println("name: " Person.getName());
}
Итак, скажите мне, что, черт возьми, мы ожидаем, что Person.getName() напечатает в этом примере? Алиса? Боб? Null?
Правильного ответа нет. Это не имеет смысла, потому что имя — это то, что принадлежит отдельному лицу (экземпляру), а не классу в целом. Итак, очевидно, что у нас не может быть доступа статического метода к нестатическим членам, потому что у нас нет способа узнать, к каким нестатическим членам мы должны обращаться.