文档章节

java 中的static关键字

Java搬砖工程师
 Java搬砖工程师
发布于 2018/06/14 10:42
字数 1045
阅读 14
收藏 0

1、方便在没有创建对象的情况下来进行调用(方法/变量)

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

2、static方法

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

3、static变量

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

4、static代码块

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

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

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

6、Java中的static关键字不会影响到变量或者方法的作用域

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

7、能通过this访问静态成员变量

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

8、static是不允许用来修饰局部变量(Java语法的规定)

9、静态内部类:

  • 普通类是不允许声明为静态的,只有内部类才可以

  • 要创建嵌套类的对象,并不需要其外围类的对象

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

10、静态导入

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

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

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

11、代码执行结果 

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块的顺序执行的

© 著作权归作者所有

共有 人打赏支持
Java搬砖工程师
粉丝 30
博文 344
码字总数 238645
作品 0
南京
程序员
私信 提问
java 同步块(Java Synchronized Blocks)

Java 同步块包括方法同步和代码块同步。java 同步可以避免资源竞争,避免死锁。 主题包括的主要内容: 关键字 Synchronized 实例方法 Synchronized static methods Synchronized blocks in i...

丁佳辉
2015/08/18
0
0
《Java从小白到大牛精简版》之第4章 Java语法基础

《Java从小白到大牛》纸质版已经上架了!! 本章主要为大家介绍Java的一些基本语法,其中包括标识符、关键字、保留字、常量、变量、表达式等内容。 4.1 标识符、关键字和保留字 任何一种计算...

tony关东升
2018/06/26
0
0
Java:关于Static静态关键字的那些小事

前言 在中,静态 关键字使用十分常见 本文全面 & 详细解析静态 关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 共用、共享 能有此作用的原因分析: Java...

Ala6
2018/10/27
0
0
《Kotlin 程序设计》第九章 Kotlin与Java混合调用

第九章 Kotlin与Java混合调用 正式上架:《Kotlin极简教程》Official on shelves: Kotlin Programming minimalist tutorial 京东JD:https://item.jd.com/12181725.html 天猫Tmall:https:/......

程序员诗人
2017/05/29
0
0
115个Java面试题及回答

解释下可用的线程状态. 在执行期间, 线程会处于以下状态中的一种: Runnable: 线程已准备就绪, 但没有立即运行. Running: 处理器正在执行的线程代码. Waiting: 处于阻塞状态的线程, 等待外部某...

Yamazaki
2014/04/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

开始看《Java学习笔记》

虽然书买了很久,但一直没看。这其中也写过一些Java程序,但都是基于IDE的帮助和对C#的理解来写的,感觉不踏实。 林信良的书写得蛮好的,能够帮助打好基础,看得出作者是比较用心的。 第1章概...

max佩恩
昨天
11
0
Redux 三大原则

1.单一数据源 在传统的MVC架构中,我们可以根据需要创建无数个Model,而Model之间可以互相监听、触发事件甚至循环或嵌套触发事件,这些在Redux中都是不被允许的。 因为在Redux的思想里,一个...

wenxingjun
昨天
7
0
跟我学Spring Cloud(Finchley版)-12-微服务容错三板斧

至此,我们已实现服务发现、负载均衡,同时,使用Feign也实现了良好的远程调用——我们的代码是可读、可维护的。理论上,我们现在已经能构建一个不错的分布式应用了,但微服务之间是通过网络...

周立_ITMuch
昨天
4
0
XML

学习目标  能够说出XML的作用  能够编写XML文档声明  能够编写符合语法的XML  能够通过DTD约束编写XML文档  能够通过Schema约束编写XML文档  能够通过Dom4j解析XML文档 第1章 xm...

stars永恒
昨天
2
0
RabbitMQ学习(2)

1. 生产者客户端 void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body) 1. 在生产者客户端发送消息时,首先......

江左煤郎
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部