zoukankan      html  css  js  c++  java
  • Java 关键字 static

      关键字static作用如下:

      1. 为某个基本数据类型或对象分配单一的存储空间。

      2. 实现某个属性或方法与类关联。在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下面简称静态成员变量)。对象也可以做到。

      有4种使用情况:

      1. 静态属性即静态成员变量

      2. 静态方法

      3. 静态代码块

      4. 静态成员类

     

      静态方法

      因为静态方法不依赖于对象,所以静态方法内部不能使用this。因为非静态方法和非静态成员变量依赖于对象,所以静态方法内部不能调用非静态方法或者访问非静态成员变量。而非静态方法内部可以调用静态方法或者访问静态成员变量。静态方法只能定义在顶级类(不同于内部类)或者静态内部类里面。

      空对象调用静态方法:

     1 public class NullInvoker {
     2 
     3     public static void testNullInvoker(){
     4         System.out.println("in testNullInvoker");
     5     }
     6 
     7     public static void main(String[] args) {
     8         NullInvoker NULL = null; // 虽然这里是空指针,但是下面依然可以执行下去
     9         NULL.testNullInvoker(); // 正常运行
    10     }
    11 
    12 }

      结果:

    1 in testNullInvoker

      静态方法不能被重写:

     1 public class TestStaticMethod {
     2 
     3     public static void main(String[] args) {
     4         SubClass s = new SubClass();
     5         Parent p = s;
     6         p.testStatic(); // 打印父类方法
     7         s.testStatic(); // 打印子类方法
     8     }
     9 
    10 }
    11 
    12 class Parent {
    13 
    14     public static void testStatic() {
    15         System.out.println("父类方法");
    16     }
    17 
    18 }
    19 
    20 class SubClass extends Parent {
    21 
    22     public static void testStatic() {
    23         System.out.println("子类方法 ");
    24     }
    25 
    26 }

      结果:

    1 父类方法
    2 子类方法

      静态成员变量

      静态成员变量和非静态成员变量的区别是:静态成员变量被所有的对象所共享,在内存中只有一个副本,在类被加载时会被初始化。而非静态成员变量是单个对象所独有,在创建对象时被初始化,存在多个副本,各个对象拥有的副本互不影响。

      

      静态代码块

      仅在类被加载时会执行静态代码块。任何方法内部都不能使用静态代码块。

      

      注意:Java语法规定static不能修饰局部变量。

      

      笔试题

      这段代码的输出结果是什么?

     1 public class Test {
     2     Person person = new Person("Test");
     3     static{
     4         System.out.println("test static");
     5     }
     6      
     7     public Test() {
     8         System.out.println("test constructor");
     9     }
    10      
    11     public static void main(String[] args) {
    12         new MyClass();
    13     }
    14 }
    15  
    16 class Person{
    17     static{
    18         System.out.println("person static");
    19     }
    20     public Person(String str) {
    21         System.out.println("person "+str);
    22     }
    23 }
    24  
    25  
    26 class MyClass extends Test {
    27     Person person = new Person("MyClass");
    28     static{
    29         System.out.println("myclass static");
    30     }
    31      
    32     public MyClass() {
    33         System.out.println("myclass constructor");
    34     }
    35 }

      结果:

    1 test static
    2 myclass static
    3 person static
    4 person Test
    5 test constructor
    6 person MyClass
    7 myclass constructor

      创建当前类的对象过程:先初始化成员变量,再执行构造器。

     

      参考资料

      Java中的static关键字解析

      关于静态方法为什么不能被重写的一点思考以及overload的一些坑。

      Java 静态内部类作用?

      《 Java程序员面试笔试宝典》 P80-83

  • 相关阅读:
    linux下常见的网络相关参数简介
    nginx编译安装
    mysql主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
    mysql报错Do you already have another mysqld server running on socket
    php编译安装
    APP测试の: MonKeyRunner___录制与回放
    Python生成指定容量文本文档
    django 误人子弟快速上手
    curl 使用方法
    APP 自动化框架实现结构图
  • 原文地址:https://www.cnblogs.com/WJQ2017/p/7637313.html
Copyright © 2011-2022 走看看