hakish
hakish

Reputation: 4048

Static class Initialisation in Java

Is there a difference between initialisation of a static nested class and top level class?I understand that static class doesnt require an enclosing class instance but what happens if there are multiple instances of the static nested class? Just like static variables are shared by class instances, will the instances of the static class be shared also?

Upvotes: 2

Views: 175

Answers (4)

Nicolas Rinaudo
Nicolas Rinaudo

Reputation: 6168

Let me see if I understand your question correctly.

A class can declare nested classes.

If a class C1 declares a non-static inner class C2, then C2 has access to all of C1's fields and methods, regardless of their access modifiers. C2 is, in fact, treated as a field: its declaration is loaded whenever a new instance of C1 is created. This means that non-static inner classes are rather more expensive than static ones, and should be avoided if not strictly necessary.

If a class C1 declares a static inner class C3, then C3 is shared across all instances of C1. It has access to all static methods and fields of C1, but not to non static ones - C3 is by definition not tied to a specific instance of C1, so there is nothing for it to have access to.

When you declare a static inner class, you're not saying anything about its instances. You're just telling the compiler that the class' definition is shared across all instances of the enclosing class. So, no, instances of the nested static class aren't shared automatically.

Upvotes: 1

The nested class as you declared it as "static class" does not differ from another top level class like inner class does. Adding the static to it declaration you promote it to be separated from owner class that became only a namespace for it.

package org.stack.question

public class Top {

  public static class Nested {

  }

}

To create a instance of Nested class you must only do this

Object instance = new org.stack.question.Top.Nested();

From specification:

Nested classes that are not inner classes may declare static members freely, in accordance with the usual rules of the Java programming language. Member interfaces (§8.5) are implicitly static so they are never considered to be inner classes.

Upvotes: 0

Joop Eggen
Joop Eggen

Reputation: 109547

Every class is a singleton object of type Class.

A static inner class is the base case. It is the other, normal inner class, that also has an OuterClass.this pointer for its instance objects.

So as such, there is no difference in class initialisation of any class.

Upvotes: 0

Boris the Spider
Boris the Spider

Reputation: 61128

A static nested class does not required an instance of the enclosing class (as you point out) so there is nothing to share.

If you have a static variable then every instance of the class will hold a reference to the same static variable. Changes in one class will change the variable in all classes.

As a class is immutable at run time then this same logic doesn't carry through.

An instance of a static nested class is effectively the same as an instance of any other class.

The only way an instance would be shared would be if you had a static variable pointing to an instance of a static nested class. In this case it is the same as any other static variable.

As is pointed out the the tutorial the only real different between a static nested class and a top level class is that a static nested class can access private static members of it's enclosing class.

Upvotes: 1

Related Questions