Java——static关键字

前言



static关键字算是Java中比较复杂的关键字之一,它可以修饰变量、方法、类以及代码块。下面将介绍static的具体使用。

  • static引入的目的
  • static的作用
  • java中的主方法入口:public static void main(String[] args)

  • 引入static的目的



    在《Java编程思想》中对static的描述有这样的一句话:

    static方法就是没有this的方法。在static的方法内部不能调用非静态方法,反过来到是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。

    这最后一句便是引入static主要的用途,免去创建类对象的开销就可以调用类中的方法,可以说是十分诱人。



    static的作用



    static修饰变量

    private static int num;

    变量num可以称为静态变量也可以称为类变量。

    static修饰属性只能修饰类属性,不可以修饰局部变量,如方法中的定义的属性。Java中规定如此。

    Java中的static和C++中的static含义是不一样的,C++中的static修饰的变量是全局变量,而Java中没有全局变量的概念,在Java中使用static修饰的类属性是存放在方法区的,为该类所有对象共享的变量,与具体某个对象没有关系

    static属性和非static属性的区别主要有两点:①在内存区域的保存位置不同,static属性存放在方法区,非static属性存放在堆栈区。②static属性是属于类对象的公共属性,可以在没有实例化对象的前提下使用类名.静态属性名的方式访问;而非static属性则需要使用对象进行访问。

    关于什么时候该使用static属性?

    需要进行描述共享信息的属性并且该属性不需要重复开辟内存空间而且便于修改,则使用static进行修饰该变量。其余情况,不建议使用static修饰变量。



    static修饰方法


    public static void printNumberOfStudent(){
      ...
    }

    被static修饰的方法叫做静态方法。静态方法同静态变量一样可以直接使用类名称.静态方法名调用。若是使用类名调用静态方法需要满足该方法不是private。在非静态方法中是可以使用this访问静态变量。

    在使用静态方法时需要注意两点:

    • 静态方法中是不存在this的。因为this是指向当前对象的,静态方法是与类相关的,与对象无关,不存在对象调用问题。一般直接使用类名.静态方法名 进行访问

    • 静态方法内部只能直接调用静态方法和静态成员。调用普通方法会报错,在普通方法中可以调用静态方法。
      因为普通方法一般会将对象作为隐藏实参传入并用this指向,在没有创建对象时,普通方法中就不存在this,调用包含普通方法的静态方法就会报错!



    static修饰代码块



    在程序编写中可以直接使用 {...}定义一段语句块,这个语句块就是代码块,使用static修饰的语句块就叫做静态代码块。

    观察下面程序的结果,分析静态块在程序中的执行顺序:

    public class A {
        A(){
            System.out.println("A constructor");
        }
        static {
            System.out.println("A's static block");
        }
    }
    
    public class B extends A{
        B(){
            System.out.println("B constructor");
        }
        static {
            System.out.println("B's static block");
        }
    }
    
    public class StaticBlock {
        public static void main(String[] args) {
            B objb = new B();
        }
    }
    
    /*output
    A's static block
    B's static block
    A constructor
    B constructor
    */

    可以看出静态代码块的执行顺序优先于构造函数,在程序执行时,会先找到main入口,然后准备加载类B,发现B有父类A,于是先去加载A,静态代码块就是在类加载的时候执行的。在静态块执行完后,就会去执行构造函数。

    静态块因为在构造函数之前执行,所以常用来初始化静态变量

    public  class Student {
        private static int numOfStu;
        private String name;
        private int age;
    
        static {
            numOfStu = 0;
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
            numOfStu++;
        }

    静态代码块可以在类的任意位置定义(方法中不可以),不会影响其优先于构造函数执行的顺序。但是多个静态块的执行顺序会依据其声明的前后执行。

    public  class Student {
        private static int numOfStu;
        private String name;
        private int age;
    
        static {
            numOfStu = 0;
            System.out.println("first sttaic block");
        }
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
            numOfStu++;
        }
    
        static {
            System.out.println("second sttaic block");
        }
    
        public static void main(String[] args) {
            Student stu1 = new Student("sakura",20);
        }
    }
    /*
    output:
    first sttaic block
    second sttaic block
    */



    static修饰内部类



    内部类顾名思义就是定义在一个类中的类。使用static定义的属性或者方法是不受类实例化对象的控制的,所以,如果内部类被static修饰,是不会受到外部类实例化对象控制。此时, 内部类就相等于变成了一个外部类,并且只能访问外部类中的static属性或者方法。关于内部类,后面会详细介绍。



    java中的主方法入口:public static void main(String[] args)


    class Test{
      ...
      public static void main(String[] args){
      ...
      }
    }

    现在来看待被static修饰的主函数,这样的好处可能就是:不用创建当前类的对象就可以调用,节省空间。

    【public】: 主方法是程序的开始,所以这个方法对任何操作都应该是可见

    【static】: 此方法由类名称调用,在命令行使用java Test是调用Test.main主方法

    【void】: 主方法是一切执行的开始点,既然是起点,那么就没有回到其他方法中的返回值

    【String[] args】: 传递给程序的参数。输入的参数以空格隔开,若是输入的参数本省有空格,则使用双引号将该参数括起来



    小结



    介绍了Java中static关键字的基础应用:修饰变量、方法等。Java中还可以利用static关键字实现 单例模式,这些后面介绍。

    参考:《Java编程思想》

    猜你喜欢

    转载自www.cnblogs.com/myworld7/p/10052245.html