zoukankan      html  css  js  c++  java
  • 面向对象之static关键字

    前言

    二胖学习完static关键字之后,综合了老师讲的内容,自己也查阅了一些文档之后想总结下相关的知识点方便自己后续的复习与巩固

    正文

    JVM眼中的static?

    二胖从"Hello World程序"开始就知道了Java源文件是由一个一个的类组成的,他查阅了有关类加载过程的文档,知道了:在类加载阶段,虚拟机就会将静态存储结构转化为方法区的运行时数据结构。二胖又查询了有关方法区的文档,知道了:Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。方法区就是这些区域中二胖没见过的,不过二胖通过文档知道了方法区是各个线程共享的数据区域,它用于存储已被虚拟机加载的类信息、常量、静态变量...这些区域中也有二胖眼熟的:程序计数器、栈、堆... ...二胖还在google上看到了一张虚拟机内存图:

    二胖有种感觉,这张图对后续知识点的学习很重要,通过它,这些知识点可能并不是那么难。自己可得好好学这张图。

    我们眼中的static?

    有了上面知识点的铺垫,二胖总结了一下static关键字的特点:

    • 它是用于修饰成员的。

    • 它所修饰的成员可以被所有的对象共享。

    • 它所修饰的成员优先于对象存在。

    • 它所修饰的成员可被类名直接调用。

    被static修饰的变量与成员变量的区别?

    • 最本质的区别就是数据存储位置不同:前者存储在方法区中,而后者存储在堆内存中的对象中。

    • 生命周期不同:前者随着类的加载而存在,随着类的消失而消失;而后者随着对象的创建而存在,随着对象的被回收而释放。

    • 调用方式不同:前者可以被对象调用,还可以被类名直接调用;而后者只能被对象调用。

    • 别名不同:由于上述区别,前者通常被称为类变量;而后者通常被称为实例变量。

    static使用时的注意?

    二胖结合了上面和之前学的一些知识点,总结了几个使用static时的注意事项:

    • 被static修饰的方法也只能访问static的成员。

    • 被static修饰的方法不能使用this或者super关键字。

    • 二胖还发现了一个有趣的细节:从学习java开始已经写了无数遍的main函数也是static的。

    static的使用场景?

    二胖为了学以致用,所以他在思考这个static关键字到底怎么用呢?

    • 静态变量:根据static关键字的特点,二胖可以轻松推导出如果这个变量的数据值是需要被共享的,那么这个变量就可以被定义成static的

    • 静态方法:根据static关键字使用时的注意事项,二胖也可以轻松推导出如果这个方法需要访问一些非静态的成员变量,那么这个方法就不能被static所修饰。二胖还惊奇地发现:如果类中的方法不访问非静态的成员变量又不定义为static的,那么访问这个方法还需要去创建一个对象,单单为了调用一个方法就创建出一个对象未免有点没有效率,所以这样的方法最好还是定义成static的吧

    main函数与静态代码块?

    二胖发现已经写了无数次的main函数也是static的,学习了static关键字之后,二胖发现这一点也不稀奇。老师讲过:main函数是被虚拟机调用的,很明显,这个时候还没有创建对象嘛,所以只能用类名去调用这个方法。不过二胖记得老师还说过:main方法是程序的入口方法,在程序加载时,最先加载的就是main方法。二胖学习静态代码块时,他在书上看到了这样一段代码:

    
    public class Test {
        static {
            System.out.println("Hello World1");
        }
    
        public static void main(String[] args) {
            System.out.println("Hello World2");
        }
    }
    
    

    二胖顿时傻眼了,这输出啥啊?编译运行了代码后,二胖明白了main方法不一定是程序运行时第一个执行的模块。二胖不禁感叹:世界之大,无奇不有。

  • 相关阅读:
    众皓网络(T 面试)
    骑芯供应链(T 面试)
    骑芯供应链(W 笔试)
    面试问题_一拉到底
    Java后端学习路线_备战
    docker 容器
    技术展望
    索引 命令
    索引 概念原理
    面试技能更新
  • 原文地址:https://www.cnblogs.com/syhyfh/p/12451545.html
Copyright © 2011-2022 走看看