Sarthak Gupta wrote:
Here we are able to access variables of Box object which are instatnce variables and are not static? Similarly:
Here we are accessing volume() method which again is not static.

Congrats, now you know your previous point 2 was wrong. Back to the tutorial http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
which states (bolding mine):

Class methods cannot access instance variables or instance methods directly—they must use an object reference. Also, class methods cannot use the this keyword as there is no instance for this to refer to.

Sarthak Gupta wrote:
Here we are accessing volume() method which again is not static.

No duh, because you are making object instances and calling the method on that.

You can't get anywhere by making assumptions and just trying stuff. You really have to do some reading and actually understand what these concepts are. What is a class? What is an object? What does the static keyword actually do? WHY do you need to create object instances to be able to call their (non-static) methods? I'm pretty sure you can't answer most of these very basic questions yet.

Taking your initial question literally, this is what you should have posted and that wouldn't have worked:

Ok, I think I have got some Idea which I will try to put here. Correct me if I am wrong. Thanks in Advance.

Basically, a static method (or class method) can access instance variables and instance method - however to do that it should use an object reference. It can't access the instance variables and methods directly.

This is because, class definition is actually a framework which has no 'PHYSICAL EXISTENCE" in the memory as such. An object on the other hand has a physical existence in the memory. Therefore, a static method can't access the instance method and variable directly because if suppose the object of the class has not been created via new(), there is no existence of the object and correspondingly, no existence of its instance variables and methods. Thus there is no way, non static members can be accessed.

When i read the following two statements (as in my first post of this thread):

1. A static method can access only static data. It can not access non-static data (instance variables)
2. A static method can call only other static methods and can not call a non-static method from it.

I assumed that there is no possible way to access non-static members at all (directly or via object reference). I was wrong to think that.

This is because, class definition is actually a framework which has no 'PHYSICAL EXISTENCE" in the memory as such.

False. Where do you think the static variables get stored, and the code, and the class name? Nowhere?

An object on the other hand has a physical existence in the memory.

True. So does a class.

Therefore, a static method can't access the instance method and variable directly because if suppose the object of the class has not been created via new(), there is no existence of the object and correspondingly, no existence of its instance variables and methods. Thus there is no way, non static members can be accessed.

Now this is starting to make sense. What you are struggling to say here is that a static method cannot access non-static members or methods of its own class without using a reference to an instance of that class.

I think I got the concept now.

Not quite. You are overcomplicating it. It is as simple as this: there is no 'this' inside a static method, so nothing that requires an implicit dereference of 'this' can be accessed from within a static method.

Sarthak Gupta wrote:
Ok, I think I have got some Idea which I will try to put here. Correct me if I am wrong. Thanks in Advance.

Basically, a static method (or class method) can access instance variables and instance method - however to do that it should use an object reference. It can't access the instance variables and methods directly.

This is because, class definition is actually a framework which has no 'PHYSICAL EXISTENCE" in the memory as such.

"Physical existence" and "memory" have nothing to do with it. It's as simple as this: The only way to refer to a non-static member M of class C is through reference to an object of type C, such as cReference.someMember. When you don't qualify it with a leading "cReference." the implied reference is "this." In a static context, there is no "this." So, no explicit "cReference" and no explicit or implicit "this" means no access to a non-static member.