java 中的static关键字

一、方便在没有建立对象的状况下来进行调用(方法/变量)java

  • static方法就是没有this的方法
  • 在static方法内部不能调用非静态方法,反过来是能够的
  • 能够在没有建立任何对象的前提下,仅仅经过类自己来调用static方法(这实际上正是static方法的主要用途)
  • 被static关键字修饰的方法或者变量,只要类被加载了,就能够经过类名去进行访问
  • 能够编写static代码块来优化程序性能

二、static方法函数

  • 在静态方法中不能访问类的非静态成员变量和非静态成员方法
  • 由于非静态成员方法/变量都是必须依赖具体的对象才可以被调用
  • 在非静态成员方法中是能够访问静态成员方法/变量的

三、static变量性能

  • static成员变量的初始化顺序按照定义的顺序进行初始化

四、static代码块优化

  • static块能够用来优化程序性能,是由于它的特性:只会在类加载的时候执行一次

五、构造器实际上不是静态方法this

  • 在thinking in java中,第96页提到,“即便没有显示地使用static关键字,构造器实际上也是静态方法“
  • 一篇大神的博客中获得了答案,那就是构造器不是静态方法
  • Java的实例构造器只负责初始化,不负责建立对象
  • new指令专门用于建立对象实例,而调用实例构造器则使用invokespecial指令
  • this是做为实例构造器的第一个实际参数传入的
  • 静态方法中不能使用this,而构造器中可使用this关键字

六、Java中的static关键字不会影响到变量或者方法的做用域3d

  • Java中可以影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字

七、能经过this访问静态成员变量code

  • this表明当前对象
  • static变量是被对象所享有的

八、static是不容许用来修饰局部变量(Java语法的规定)对象

九、静态内部类:blog

  • 普通类是不容许声明为静态的,只有内部类才能够

  • 要建立嵌套类的对象,并不须要其外围类的对象(可是仍是会执行外部类的构造方法

  • 内部静态类不须要有指向外部类的引用,但非静态内部类须要持有对外部类的引用
  • 非静态内部类可以访问外部类的静态和非静态成员,静态类不能访问外部类的非静态成员

十、静态导入继承

  • 可使被导入类的静态变量静态方法在当前类直接可见,用这些静态成员无需再给出他们的类名

 import static 包名.类名.静态成员变量; 

 import static 包名.类名.静态成员函数; 

十一、代码执行结果 

public class Test extends Base{
 
    static{
        System.out.println("test static");
    }
     
    public Test(){
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new Test();
    }
}
 
class Base{
     
    static{
        System.out.println("base static");
    }
     
    public Base(){
        System.out.println("base constructor");
    }
}

代码执行结果:

public class Test {
    Person person = new Person("Test");
    static{
        System.out.println("test static");
    }
     
    public Test() {
        System.out.println("test constructor");
    }
     
    public static void main(String[] args) {
        new MyClass();
    }
}
 
class Person{
    static{
        System.out.println("person static");
    }
    public Person(String str) {
        System.out.println("person "+str);
    }
}
 
 
class MyClass extends Test {
    Person person = new Person("MyClass");
    static{
        System.out.println("myclass static");
    }
     
    public MyClass() {
        System.out.println("myclass constructor");
    }
}
  • 首先加载Test类,所以会执行Test类中的static块
  • main所在类会被优先加载
  • 以类为标准进行加载,尽管在一个文件
  • 接着执行new MyClass(),而MyClass类尚未被加载,所以须要加载MyClass类
  • 加载MyClass类的时候,发现MyClass类继承自Test类,可是因为Test类已经被加载了,因此只须要加载MyClass类
  • 就会执行MyClass类的中的static块

代码执行结果:

public class Test {
     
    static{
        System.out.println("test static 1");
    }
    public static void main(String[] args) {
         
    }
     
    static{
        System.out.println("test static 2");
    }
}
  • static块能够出现类中的任何地方(只要不是方法内部,记住,任何方法内部都不行)
  • 而且执行是按照static块的顺序执行的

相关文章
相关标签/搜索