Many clever answers can be given, but the essence of things about first answer is very simple: the only goal of adding of a keyword
static
to a class is exactly this: to disable creation of its instance. There is no any special mechanism, this is just syntax.
You can talk about the purpose of it. This is just sanity. If a class has non-static members, creating of its instance is possible but pretty much useless. Claiming the class itself as static is just an additional safeguard to prevent creation of class. Also, if a class is already declared static, adding non-static members accidentally will be prevented by a compiler.
Allocation… You see, you cannot say anything about certain about allocation of the arbitrary static class. Suppose you create a static class with only the members of
value types. In this case, nothing is "allocated", the memory of the static data segment will be used — well, statically. But now, the static class can have only the static members, but any of the members can be of any class, and that classes may be not static; and their members can be static or not static, of value types or
reference types, so some of the memory can be allocated on heap.
Last question. When an instance constructor is called, a new instance of the class is created. The reference of the instance is assigned to the variable on right, if any. It may not exist as the constructor call could be done just for its side effect; in this case the instance may or may not be a subject of Garbage Collection. There can be (pretty unusual) case when this reference is not lost, as "this" reference is created before the body of the constructor is executed, and it can be assigned to some other type member or variable outside of the class scope. I already provided you with other detail in my recent solution, see
memory allocation when instance class constructor is called[
^].
—SA