【Java基础】static关键字

一、static修饰成员变量

  定义一个学生类,其中grade使用static修饰

public class Student {

    private String name;
    private int age;
    static String grade;//所在班级

    public Student() {

    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

  创建Student对象,且只对其中一个对象的grade赋值,此时第二个对象的grade会自动赋值

/*
一旦使用static关键字,那么这个变量不再属于对象自己,而是属于所在的类
即多个对象共享同一份数据

 */
public class Demo01StaticField {

    public static void main(String[] args) {

     Student one = new Student("郭靖",19);
     //只对one的属性进行赋值
     one.grade = "三年二班";
     System.out.println("姓名:" + one.getName()
             + " 年龄:" + one.getAge()
             + " 班级:" + one.grade);

     Student two = new Student("黄蓉",18);
     System.out.println("姓名:" + two.getName()
             + " 年龄:" + two.getAge()
             + " 班级:" + two.grade);//two的属性值此时也会自动赋值
    }
}

 

二、static修饰成员方法

public class MyClass {

    int num;//成员变量
    static int numStatic;//静态变量

    //成员方法
    public void method(){
        System.out.println("这是一个普通的成员方法");
        //成员方法可以直接使用成员变量
        System.out.println(num);
        //成员方法可以直接使用静态变量
        System.out.println(numStatic);
    }
    //静态方法
    public static void methodStatic(){
        System.out.println("这是一个静态方法");
        //静态方法可以直接使用静态变量
        System.out.println(numStatic);
        //静态方法不能直接使用成员变量
        //System.out.println(num);
    }
}
/*
一旦使用static修饰成员方法,那么此方法就成为了静态方法;
静态方法不属于对象,而是属于类的

如果没有static关键字,必须首先创建对象,通过对象才能使用该方法
如有有static关键字,那么不需要创建对象,直接通过类名称来使用该方法

注意事项:
1、静态不能直接访问非静态
    原因:内存中是 先有 静态内容,后有 非静态内容
2、静态方法中不能用this
 */
public class Demo02StaticMethod {

    public static void main(String[] args) {
        //创建Myclass对象
        MyClass obj = new MyClass();
        //通过对象调用成员方法
        obj.method();

        //调用静态方法,可以通过对象名调用(不推荐),也可以通过类名来调用
        obj.methodStatic();//正确,但不推荐
        MyClass.methodStatic();//推荐写法

        //对于本类当中的静态方法,可以省略类名称
        myMethod();
        Demo02StaticMethod.myMethod();
    }

    public static void myMethod(){
        System.out.println("这是一个本类中的静态方法");
    }
}

 

三、静态代码块

/*
public class 类名称{

    static{
        代码块内容
    }
}

特点:
执行唯一的一次;
静态内容总是优先于非静态

典型用途:用来一次性地对静态变量进行赋值
 */

  示例:

public class Person {

    static {
        System.out.println("静态代码块执行啦");
    }

    public Person(){
        System.out.println("构造方法执行啦");
    }
}
public class Demo03Static {
    public static void main(String[] args) {
        Person one = new Person();

        Person two = new Person();
    }
}

  执行结果:

  静态代码块执行啦

  构造方法执行啦

  构造方法执行啦

根据执行结果可以说明:1、静态代码块优先执行;2、静态初始化块只在类加载时执行一次,所以当再次创建对象 two 时并未执行静态初始化块。

posted @ 2020-06-11 00:07  蹲马路牙子吃炒面  阅读(124)  评论(0编辑  收藏  举报