zoukankan      html  css  js  c++  java
  • Java学习笔记-问问题?-->静态方法

    "问问题"-->目的:以问问题的方式,希望可以在语言的学习中,独立的全面的了解一块知识.

    默认“方法”已经了解,本文主要目的介绍所谓的“静态”。

    一、含义源于语义:static。[参考:http://developer.51cto.com/art/201204/332155.htm]

    摘要:

    static语义: static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

    static作用: 被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。

    static使用: 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

    注:

    static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。

    static语法:(可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)

    1.类名.静态方法名(参数列表...)-->静态方法只能调用静态的,因为实例成员与特定的对象关联,而静态的直接与类关联。

    2.类名.静态变量名(

    一般在需要实现以下两个功能时使用静态变量:

    • 在对象之间共享值时
    • 方便访问变量时

    3.用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块

    注:

    static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!——》尽量使用final,static 的优势还是加载!

    对于变量,表示一旦给值就不可修改,并且通过类名可以访问。

    对于方法,表示不可覆盖,并且可以通过类名直接访问。

    二、静态方法与实例方法的区别[参考:http://www.cnblogs.com/shenliang123/archive/2011/10/27/2226923.html]

         我们可以想象一下,类包括变量和方法,初始化成为对象之后,对象就有了内容和方式(联系到现实中的对象,比如做得,它有什么?(变量)它干什么?(方法)。)而在实际上对于一个对象,内容的概念就可以包括了全部,因为方法表示的功能本身就可以理解为其本身的内容。我们可以这样理解类细化出来了变量和方法,而现在我们已经知道了静态方法和实例方法(普通的方法),那么我们就要问这样做的目的和好处何在呢?试着想象一下,现在没有椅子,而你要设计一个椅子,你有了一个草图,而没有实物出现,那么椅子本身的一个功能能不能从草图中出现?对,起码“被制造”这个功能,应该直接可以从草图中的到!没有对象而需要利用对象,我自己的理解,这是静态的意义。

         另外,有人的观点是:有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。我觉得这个想法出发的角度是从分析静态概念的角度出发的,而我的想法是从自然世界中对对象的概念出发的。

    三、从虚拟机看静态[参考:http://moto0421.iteye.com/blog/1431910]

         用 static的修饰的变量和方法,实际上是指定了这些变量和方法在内存中的“固定位置”-static storage。既然要有“固定位置”那么他们的 “大小”似乎就是固定的了,有了固定位置和固定大小的特征了,在栈中或堆中开辟空间那就是非常的方便了。静态表示的是内存的共享,就是它的每一个 实例都指向同一个内存地址。(静态初始化的控制权在Java中了,而非你自己控制的了,这样初始化次序会不会混乱呢,不安全)

    四、从应用看静态

         个人认为单例模式可以很好的了解静态方法。

      单例的特征:确保一个类只有一个实例,并提供一个全局访问点,这和静态的观点不谋而合。

     1 public class Singleton {
     2 
     3     private volatile static Singleton instance = null;
     4 
     5     private Singleton() {
     6     }
     7 
     8     public static Singleton getInstance() {
     9 
    10         if (instance == null) {
    11             synchronized (Singleton.class) {
    12                 if (instance == null) {
    13                     instance = new Singleton();
    14                 }
    15             }
    16         }
    17         return instance;
    18     }
    19 }

    http://www.cnblogs.com/lance-/p/3553659.html

     问题:由于初始化的权利全部由Java自行控制了,不同的类加载器仍然可能造成麻烦。[类加载概念https://www.ibm.com/developerworks/cn/java/j-lo-classloader/]

    总结:只要类加载即被创建,直接与类关联,与对象无关,无需初始化。(想想main函数)

    其他语言中的静态概念:

    http://blog.csdn.net/klyz1314/article/details/16845679

  • 相关阅读:
    opencv源码编译安装后使用时出现undefined reference cv::imwrite
    OPPO手机永久打开USB调试模式
    bash 顺序执行等待前一个脚本执行完成
    cpp
    多线程
    关于nvme下ubuntu无法识别硬盘的问题
    极限建站
    新生赛
    pc_mbed_fpga_communication
    color_sensor_mbed
  • 原文地址:https://www.cnblogs.com/lance-/p/3553082.html
Copyright © 2011-2022 走看看