`
tanjiayqq
  • 浏览: 20407 次
文章分类
社区版块
存档分类
最新评论

Java里静态与非静态该什么情况下使用

阅读更多
文章为原创,转载请说明来源,谢谢。

作者:cha1R(tanjiayqq)


要搞清楚这个问题,我们需要清楚他们之间有什么区别,有什么优势和劣势。

首先看看静态与非静态方法的区别:

静态方法                    |  实例方法

1、静态方法可以通过“类.方法()”调用        | 要在对象实例化后使用对象调用

2、只能使用静态变量和局部变量        | 所有变量都可以使用

3、静态方法不能被子类重写          | 实例方法可以

4、接口不能定义静态方法             | 实例方法可以

从上面区别来看,静态方法只有一个优势,就是调用的时候不用实例化,其他情况下跟实例方法相比都是处于劣势。那么我们在什么情况下会使用到静态方法?相信大家第一时间会想到一样的东西,工具类Util。工具类给我们开发带来了大大的方便,归根到底是“不用实例化就能用”的功劳。这是静态方法的一个优势。

而静态方法的劣势也很明显,局限性很大,不能重写,不能引用普通变量,接口不能定义等等。。。可能还有很多我没列举出来。

那究竟什么时候该用静态方法?我们就要最大化利用其优势而避其缺点:

1、一个方法完成一个独立的功能,而且不会干扰到其他方法或变量,则即使删掉这个方法,对其他东西都没有任何影响。

2、不依赖构造方法,不依赖接口,不依赖继承。(这也是为什么越学面向对象,越会纠结这个问题)

举个例子:String类即使删掉 static valueOf(Object obj)方法,也不会影响实例方法chatAt(int index)的使用。当然它可能会影响其他重载的valueOf方法。

至于现在网上很多资料都有一个误区,就是说静态方法一开始加载,会占用内存,而实例方法不会。这个说话其实是错误的,它们都是一样一开始就会加载,而且只会占用一份内存。因为方法不是变量,它只需要有一份内存就够了。而变量则不一样

-----------------------------------------------------------------------------------------------------------------------------------------------------------

下面来看看静态变量与非静态变量

静态变量                    |  非静态变量

1、可以通过“类.变量”来引用。          | 只能通过实例对象来引用。

2、程序运行时分配内存            |  类实例化时分配内存。

3、只有一份内存被分配            |  有多少个类被实例化,就有多少个该类的变量那么多份内存被分配。

4、静态变量定义后必须声明初始化         | 非静态变量可以延迟初始化。

其他.....

很明显,静态变量拥有的优势不少,第一点不用说。第2、3点可以利用它来做一个整个程序的全局变量,因为任何修改都只会指向同一份内存。

而第3点优势恰好就是我们的“饿汉式单例模式”的一个最简单的实现。



我们也可以通过静态变量+静态方法的组合来封装一个完整的懒汉式单例模式。
       public class Singleton{
            private static Singleton singleton = null;
            public static Singleton getInstance(){
                 if(singleton==null){
            synchronized(Singleton.class){
              if(singleton==null){    
                         singleton = new Singleton();
              }
            }
                 }
                return singleton;
            }
       } 

在使用静态变量的时候,要注意一个线程问题,因为所有人都在操作它。
最后推荐一个学习的网站:http://gz.itcast.cn/
分享到:
评论

相关推荐

    java中静态与非静态的变量定义与使用

    这展示了如何在没有对象的情况下使用静态变量调用非静态方法,尽管这通常不是最佳实践,因为它可能引起混淆并隐藏对象实例的依赖关系。 总结起来,Java 中的静态变量与非静态变量之间的主要区别在于它们的生命周期...

    java中静态与非静态的区别

    ### Java中静态与非静态的区别 #### 一、静态类与非静态类 在Java中,**静态类**与**非静态类**有着明显的区别: 1. **成员组成**: - **静态类**只能包含**静态成员**和**静态方法**。这意味着你无法在静态类中...

    java无法从静态上下文中引用非静态一些错误

    java初学者在编写类,在调用方法,在静态方法与动态方法使用会出现的一些错误。 学习后 能初步了解自己的错误的原因 以及遇到这种错误的改正方法 避免下次踩坑

    java静态文件处理

    但这种方法通常效率较低,不推荐在大量静态文件的情况下使用。 4. **使用Nginx或Apache反向代理**:另一种常见策略是将静态文件托管在一个高性能的Web服务器(如Nginx或Apache)上,然后通过Java应用服务器(如...

    java 静态非静态 字段方法 子类父类构造_初始化顺序!

    java 静态_非静态 字段_方法_代码块 子类父类构造_初始化顺序! 三个class 让你清清楚楚 第一个class java代码如下: package initialOrder; class Parent { // 静态变量 public static String p_StaticField...

    java静态代码块与非静态代码块参照.pdf

    Java 静态代码块与非静态代码块详解 Java 中的代码块可以分为静态代码块和非静态代码块两种,两者的执行时机和作用域不同。本文将通过实例代码和详细解释,阐述 Java 静态代码块与非静态代码块的区别和应用场景。 ...

    java静态代码块与非静态代码块.doc

    Java 静态代码块与非静态代码块 Java 中的静态代码块和非静态代码块是两个重要的概念,它们在 Java 中的应用非常广泛。下面我们来详细介绍这两个概念。 静态代码块 静态代码块是 Java 中的一种特殊的代码块,它是...

    Java中静态方法和非静态方法的区别.docx

    这样我们就无法在不创建实例的情况下访问非静态方法。 六、覆盖 在静态方法中,由于它可以重写任何静态数据成员的值,因此静态方法可以覆盖静态变量的值。非静态方法也可以覆盖静态变量的值,但需要创建类对象。 ...

    java 静态内部类的使用规范

    Java语言中的静态内部类,也称为嵌套类,是内部类的一种特殊形式,它与非静态内部类(也称为成员内部类)相比有着独特的特点和使用场景。在深入探讨其使用规范之前,我们先理解静态内部类的基本概念。 静态内部类不...

    PHP中静态方法(static)与非静态方法的使用及区别.docx

    静态方法无法访问非静态属性或方法,因为它们在没有实例的情况下被调用,无法访问与特定对象相关的信息。 静态方法的另一个常见用途是创建工具类,其中包含一些辅助函数,这些函数不需要访问类的实例状态。例如,...

    static静态变量使用@Value注入方式.md

    通过上述分析和示例,我们可以看到,在Spring框架中,虽然不能直接使用`@Value`注解为静态变量注入值,但可以通过定义一个非静态方法并使用`@Value`注解来间接实现这一目标。这种方法不仅避免了潜在的警告和错误,还...

    JAVA静态方法和非静态方法的区别和实例.doc

    JAVA静态方法和非静态方法的区别和实例 静态方法和非静态方法是 Java 编程语言中两个基本概念,它们在编程实践中扮演着重要角色。了解它们的区别和使用场景对于编写高效、可维护的代码至关重要。 什么是静态方法?...

    静态方法同步 与 非静态方法同步

    本篇文章将深入探讨“静态方法同步”与“非静态方法同步”的差异、应用场景以及它们如何影响程序的并发性能。 首先,我们来了解什么是同步。在Java中,同步是通过`synchronized`关键字实现的,它用于确保同一时间...

    java静态内部类(嵌套类)

    ### Java静态内部类(嵌套类)详解 #### 一、静态内部类概念与特性 在Java编程语言中,静态内部类(也被称为嵌套类)是一种特殊的内部类形式,它通过`static`关键字来定义。与普通内部类相比,静态内部类具有以下...

    java代码静态检测规则

    ### Java代码静态检测规则概述 Java作为一种广泛应用的编程语言,在软件开发过程中,为了确保代码的质量、可维护性和安全性,采用代码静态检测工具是至关重要的。本文将详细介绍一系列针对Java代码的静态检测规则,...

    Java的静态代码块、非静态代码块、构造函数

    总结来说,Java的静态代码块、非静态代码块和构造函数都是在不同阶段和目的下进行对象初始化的工具。理解并熟练运用这些概念,能够帮助开发者编写出更加高效和健壮的代码。在Java学习和开发过程中,掌握这些基础知识...

    java类中静态域、块,非静态域、块,构造函数的初始化顺序

    ### Java 类中静态域、块,非静态域、块,构造函数的初始化顺序 #### 一、概述 在 Java 编程语言中,类的初始化顺序对于理解程序的行为至关重要。特别是当涉及到静态域(静态变量)、非静态域(实例变量)、静态块...

    Java static静态初始快

    1. **执行顺序**:静态初始化块在非静态初始化块之前执行。当类第一次被加载时,JVM会按照它们在源代码中的顺序执行静态初始化块。 2. **类加载机制**:Java类的加载是懒加载的,即只有在类被首次使用时,JVM才会...

    java程序 html静态页面

    在IT行业中,Java是一种广泛应用的编程语言,尤其在企业级应用开发中占据着主导地位。在本项目中,“java程序 html静态页面”指的是利用Java技术来处理或生成HTML静态页面,这通常涉及到Web开发领域。HTML(超文本...

    LINUX C调用JAVA的静态方法和非静态方法(实例方法)小实例

    在Linux环境中,C语言可以通过Java Native Interface (JNI) 来调用Java的静态和非静态方法,实现两者之间的交互。JNI是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,使得C/C++程序员可以编写...

Global site tag (gtag.js) - Google Analytics