Java的Static

  1. 静态变量
    当 static 修饰成员变量时,该变量称为类变量。该类的每个对象都共享同一个类变量的值。任何对象都可以更改 该类变量的值,但也可以在不创建该类的对象的情况下对类变量进行操作。
  • 类变量:使用 static关键字修饰的成员变量
  1. 静态方法
    当 static 修饰成员方法时,该方法称为类方法 。静态方法在声明中有 static ,建议使用类名来调用,而不需要 创建类的对象。调用方式非常简单。
  • 类方法:使用 static关键字修饰的成员方法,习惯称为静态方法。
  1. 静态方法可以访问静态变量,不能直接访问非静态
    原因:因为在内存当中现有的静态内容,后有的非静态内容

  2. 静态方法中不能用this
    原因: this代表当前对象,通过谁调用的方法,谁就是当前对象,
    调用静态方法时,不应该通过对象调用,

  3. 一旦使用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方法和构造方法的执行

  • 静态代码块的典型用途:
    用来一次性地对静态成员变量进行赋值。


静态的内存图
在这里插入图片描述
由图可知,根据类名称访问静态变量时,是直接在方法区找,跟堆上的对象没关系,只和类有关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值