Почему статические классы не могут иметь нестатические методы и переменные?

#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?

Правильного ответа нет. Это не имеет смысла, потому что имя — это то, что принадлежит отдельному лицу (экземпляру), а не классу в целом. Итак, очевидно, что у нас не может быть доступа статического метода к нестатическим членам, потому что у нас нет способа узнать, к каким нестатическим членам мы должны обращаться.