Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using an inner class name and an object name same in Java

In the following code snippet, presumably it appears that it should issue some compilation error but it doesn't:

class Outer {
    public static class Inner {
        static String obj = "Inner";
    }

    static Optional Inner = new Optional();
    //The (inner) class name and the object name are same.
}

class Optional {
    String obj = "Optional";
}

public class Main {

    public static void main(String[] args) {
        System.out.println(Outer.Inner.obj);
        //Refers to the string inside the optional class
    }
}

The class Outer has a static class inside it named Inner. Additionally, it declares an object (static) of the class Optional (static Optional Inner = new Optional();)

This object and the class names (inside the class Outer) are same which is Inner. The program displays Optional. The only expression Outer.Inner.obj within main() is expected to display Inner but it doesn't. The actual output is however Optional which is the case of the Optional class.

One way to display Inner is by changing the object name to something else.

static Optional Inner1 = new Optional();

From the output it displays, it appears that the object name (or a variable) is chosen over a type name (the class Inner) because they have the same name. What exact case is applied here?

like image 339
Tiny Avatar asked Oct 17 '12 09:10

Tiny


People also ask

Can object name be same as class name Java?

We can have a method name same as a class name in Java but it is not a good practice to do so.

Can object and class have same name?

An object with the same name as a class is called a companion object. Conversely, the class is the object's companion class.

Can an object created from a class be given the same name as the class?

Yes, It is allowed to define a method with the same name as that of a class. There is no compile-time or runtime error will occur. But this is not recommended as per coding standards in Java. Normally the constructor name and class name always the same in Java.

Can we create object of a class inside the same class?

No, the main method only runs once when you run your program. It will not be executed again. So, the object will be created only once. Think of your main method to be outside your class.


1 Answers

Paragraph 6.4.2 of the Java Language Specification has some information about the rules that apply in this case.

A simple name may occur in contexts where it may potentially be interpreted as the name of a variable, a type, or a package. In these situations, the rules of §6.5 specify that a variable will be chosen in preference to a type, and that a type will be chosen in preference to a package. Thus, it is may sometimes be impossible to refer to a visible type or package declaration via its simple name. We say that such a declaration is obscured.

This refers to paragraph 6.5 Determining the Meaning of a Name, which explains the rules in detail.

In your example, Outer.Inner could refer to the type of the nested class named Inner, or the static member variable Inner. The rules say the variable will be chosen over the type.

like image 162
Jesper Avatar answered Oct 05 '22 10:10

Jesper