# Static Keyword > > The static keyword can be applied to fields, methods, and classes >
### Static Field (Variables, Constants) - When you declare a variable inside a class, it is declared as a member variable and must be accessed through an object like [`car.name`](http://car.name) - However, if you declare a variable using the static keyword, it can also be `accessed through the Class` - When accessed through the Class, it can be `accessed externally` `without creating an object` - It can also be accessed through an object, but accessing through the Class is recommended - Why? - Because it is difficult to distinguish whether you are accessing a member variable or a static variable! - Variables declared as static are created and initialized `when the program is executed` - Therefore, even without creating an object, the `variable is already in a created state`! - Declaring as `final static` makes it a `constant` whose value cannot be changed - Conventionally, to easily distinguish static constants, names are written using only `uppercase letters` and underscores (`_`) - `Access modifiers` - When declaring a static field, you can set the scope you want to expose using access modifiers - `Reasons for use` - Most static fields are used when `declaring constants` - When you declare a constant with the `final static` keyword, other classes can also access the constant - It can also be declared as a member variable, but implementing it this way means each object holds the constants, which can increase the object's size - Declaring too many variables as static moves away from object-orientation and can easily lead to spaghetti code (complex tangled code)
### Static Method - Static methods are similar to static fields - If you use the static keyword when declaring a method, you can call that method without creating an object - Since it is difficult to distinguish whether you are calling an object method or a static method, it should `only be called through the Class` - `Cautions` - A static method can be called without creating an object, which means `the method is separated from the object` - Therefore, keywords like `super` and `this` cannot be used `inside the method`, - and it also `cannot access` the class's `member variables` - In static methods, only variables declared inside the method, static fields, and static methods can be accessed - `Reasons for use` - Static methods are typically used to create `Utils` and `Helper` classes - ex) Creating a Math Utils class ```java public class Math { public static double sqrt(double num) { // .... } public static double sum(double num1, double num2) { // .... } } ``` - It has the advantage of grouping math-related methods under a class called Math (`grouping`)
### Static Class - Declaring a class using the static keyword separates it from the upper class - An `Inner class` is `connected to the upper class`, so it can access the upper class's member variables - Declaring a sub-class as static makes it impossible to access the upper class's member variables! - A `sub-class declared as static` is called a `static nested class` - A `Static nested class` can have objects created directly from the outside even without the upper class being created ```java Car.Wheel wheel = new Car.Wheel(); ``` -> This is the biggest difference between `Inner class` and `Static nested class` - `Cautions` - Static class is only possible `when declaring a sub-class` - Trying to declare the upper class as static will cause a compile error - Reasons for using `static class` - The benefit of creating an Inner class as a static class is `grouping` - There is an advantage of being able to group related classes by declaring classes associated with a certain class below it - This can also be done with Inner classes, but Inner classes are `connected` to the upper class and are not independent classes!
### Summary of Static Keyword Advantages - The common aspect of the static keyword is `separation from objects` - It allows access without creating an object! - It has the advantage of `Grouping` - Methods and classes related to a certain class can be declared as static below it to gather them in one place!!