user1050619
user1050619

Reputation: 20906

static variable vs non static variable

I have defined an object and declared a static variable i. In the get() method, when I try to print the instance and class variable, both print the same value.

Isn't this.i an instance variable? Should it print 0 instead of 50?

public class test {
    static int i = 50;
    void get(){
        System.out.println("Value of i = " + this.i);
        System.out.println("Value of static i = " + test.i);
    }

    public static void main(String[] args){
        new test().get();
    }

}

Upvotes: 0

Views: 6827

Answers (4)

you didn't declare any instance variable in here.only one static variable.if you declare instance variable without assigning value,then if you try to print that instance variable value using "this" key word you can get default value as 0.

Upvotes: 0

Sunil Behera
Sunil Behera

Reputation: 9

static is a class level variable and non static is an instance variable(object level variable) . So here you declare only static variable and call them different way but same meaning.

this.i
test.i

both treated as class level variable or static variable.

Upvotes: 0

Jon Skeet
Jon Skeet

Reputation: 1503409

No, there's only one variable - you haven't declared any instance variables.

Unfortunately, Java lets you access static members as if you were accessing it via a reference of the relevant type. It's a design flaw IMO, and some IDEs (e.g. Eclipse) allow you to flag it as a warning or an error - but it's part of the language. Your code is effectively:

System.out.println("Value of i = " + test.i);
System.out.println("Value of static i = " + test.i);

If you do go via an expression of the relevant type, it doesn't even check the value - for example:

test ignored = null;
System.out.println(ignored.i); // Still works! No exception

Any side effects are still evaluated though. For example:

// This will still call the constructor, even though the result is ignored.
System.out.println(new test().i);

Upvotes: 8

Sotirios Delimanolis
Sotirios Delimanolis

Reputation: 280168

The field i is declared as static. You can access static fields either with the YourClass.StaticField or instance.StaticField. So both of

this.i
test.i

are referring to the same value in the context of an instance method of your test class.

It's considered bad practice to access a static field with this.i or instance.i.

Upvotes: 2

Related Questions