- 静态变量
当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改 该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
- 类变量:使用 static关键字修饰的成员变量
- 静态方法
当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,建议使用类名来调用,而不需要 创建类的对象。调用方式非常简单。
- 类方法:使用 static关键字修饰的成员方法,习惯称为静态方法。
-
静态方法可以访问静态变量,不能直接访问非静态
原因:因为在内存当中现有的静态内容,后有的非静态内容 -
静态方法中不能用this
原因: this代表当前对象,通过谁调用的方法,谁就是当前对象,
调用静态方法时,不应该通过对象调用, -
一旦使用static修饰成员变量,那么这就成为了静态方法,静态方法不属于对象,而是属于类
如果没有static关键字,就必须先创建对象,然后通过对象才能使用它
如果有了static关键字,那么不需要创建对象,直接就能通过类名称来使用它
无论是成员变量还是成员方法,如果有了static,都推荐使用类名称进行调用
public class Demo02StaticMethod
{
public static void main(String[] args)
{
MyClass my = new MyClass();//先创建对象
//然后才能使用没有static关键字的内容
my.method();
my.methodStatic();//对象名调用,不推荐,这种写法在编译后也会被javac翻译成"类名称.静态方法"
MyClass.methodStatic();//类名称调用,推荐
//对于本类中的静态方法可以省略类名称
method();
Demo02StaticMethod.method();//完全等效
}
public static void method()
{
System.out.println("自己的方法");
}
}
public class MyClass
{
int num = 66; //成员变量
static int silence; //静态变量
//成员方法
public void method()
{
System.out.println("这是一个成员方法");
//成员方法可以访问成员变量
System.out.println(num);
//成员方法可以访问静态变量
System.out.println(silence);
}
//静态方法
public static void methodStatic()
{
System.out.println("我是静态方法");
System.out.println(silence);//静态方法可以访问静态变量,不能直接访问成员变量
}
}
这里建一个Sdudent类,里面被static修饰的变量会变成共享变量
{
private int id;
private String name;
private int age;
private static int room = 202;
private static int idCount = 0;
public Student(String name, int age)
{
this.name = name;
this.age = age;
this.id = ++idCount;
}
} //SetterGetter方法略
因为room,idCount 是共享变量
public static void main(String[] args)
{
Student one = new Student("sikadi",18);
System.out.println("姓名 " + one.getName() + " 年龄 " + one.getAge()
+ " sikadi的教室为 " +one.getRoom() + " 学号为 " + one.getId() ); //因为room通过static进行修饰
Student two = new Student("Lifu",17);
System.out.println("姓名 " + two.getName() + " 年龄 " + two.getAge()
+ " Lifu的教室为 " + two.getRoom() + " 学号为 " + two.getId());
}
所以两位同学的房间号一致
static 修饰的内容:
- 是随着类的加载而加载的,且只加载一次。 存储于一块固定的内存区域(静态区),所以,可以直接被类名调用。 它优先于对象存在,所以,可以被所有对象共享
静态代码块:
静态代码块的格式是:
public class 类名称
{
static
{
// 静态代码块的内容
}
}
-
特点:当第一次用到本类时,静态代码块执行唯一的一次。
静态内容总是优先于非静态,所以静态代码块优先于main方法和构造方法的执行 -
静态代码块的典型用途:
用来一次性地对静态成员变量进行赋值。
静态的内存图
由图可知,根据类名称访问静态变量时,是直接在方法区找,跟堆上的对象没关系,只和类有关系