Java static 静态关键字之我见

Java static 静态关键字

  • 某个类中的成员或者方法加上static之后,该成员或者方法是属于类(Class)的,而不属于对象(Object)的,也就是说,你用某个Class类new出来的东西的空间当中,不包含这个static成员或对象。
  • static只在类当中保存一份,所有本类的对象共享一份。其中一个对象改了static的值,另一个对象的也会改。
  • static 的一个用法是可以用作类的计数,记录该类被创建了多少次。比如自动生成学号。
    Java static 静态关键字之我见_第1张图片

static 修饰成员变量

public class Student {
    //为演示方便这里不用getter setter
    String name;
    int age;
    int id; //学生学号
    static int classroom;
    static int count = 1; //自动生成学号用, 我这里不用用户手动输入学号,自动生成

    public Student() {
        id = this.count++;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        id = this.count++;
    }
}
public class DemoStatic {
    public static void main(String[] args) {
        Student stu1 = new Student("张三", 19);
        //new之后自动赋予学号1,然后class计数器count+1=2
        System.out.println(stu1.name + "的学号是:" + stu1.id);
        //给定教室
        stu1.classroom = 101;
        System.out.println(stu1.name + "的教室是:" + stu1.classroom);

        Student stu2 = new Student("李四", 20);
        //new李四的时候,static变量count已经是2,学号自动赋2
        System.out.println(stu2.name + "的学号是:" + stu2.id);
        System.out.println(stu1.name + "的教室是:" + stu2.classroom);
    }
}

输出:

张三的学号是:1
张三的教室是:101
李四的学号是:2
张三的教室是:101

static 修饰方法

  • 记住,静态的成员和方法都只属于类而不属于对象。所以一旦类存在,类中的方法就可以被使用,也就是说不需要用类new一个对象出来去使用其中的方法。
public class StaticMethod {
    public void commomMethod(){
        System.out.println("这里调用了一个对象的一般方法");
    }

    public static void staticMethod(){
        System.out.println("这里调用了一个类的静态方法");
    }
}
package cn.edu.ustb.demo06;

public class StaticRun {
    public static void main(String[] args) {
        // 静态类方法不需要new对象,可以直接用类的方法
        StaticMethod.staticMethod();

        // 一般方法需要new一个对象才能用对象的方法
        //StaticMethod.commomMethod();不能用类直接调用
        StaticMethod sm = new StaticMethod();
        sm.commomMethod();

        //如果你在有对象的情况下仍然要使用该静态方法,
        //用类名称而不是对象名修饰,即使用对象名,编译器会自动换成类名称
        //sm.staticMethod(); 比如这种不推荐
        StaticMethod.staticMethod();//推荐这种写法
    }
}

输出:

这里调用了一个类的静态方法
这里调用了一个对象的一般方法
这里调用了一个类的静态方法

结论:

  • 静态变量:类名称.静态变量

  • 静态方法:类名称.静态方法()

  • 对于本类中调用本类的静态方法,可以不写类名称

注意事项:

  1. 静态不能访问非静态,非静态既可以访问非静态又可以访问静态。因为内存中现有静态再有非静态,也就是说,当class存在的时候内存中就有static的元素存在了,你只有new出新对象的时候才有其他非static的元素,所以静态中不能出现非静态。也不能出现this.,因为这个关键字本身代表的就是对象。
public class StaticMethod {
    static int a = 1;
    int b = 2;

    public void commomMethod() {
        System.out.println(a);
        System.out.println(b);
        System.out.println("这里调用了一个对象的一般方法");
    }

    public static void staticMethod() {
        System.out.println(a);
        //System.out.println(b);  不可以访问b这个非静态元素
        System.out.println("这里调用了一个类的静态方法");
    }
}

你可能感兴趣的:(java,类)