java 静态方法与实例方法的区别_静态方法与实例方法的区分

Java系列之:看似简单的问题 静态方法和实例化方法的区别

Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储,引用存储在堆栈中,实体存储在堆中

最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。

方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要new就可以使用实例化方法需要new了以后才可以使用。。。。我们真的理解了吗?

从实际项目开发说起,这里有开发项目的三种方式:

开发项目中把BLL和DAL分开,在BLL调用DAL的代码。

一、在DAL中使用静态方法,不创建实例直接调用(大概有很多人都使用这种方式开发)

class DAL

{

public static string GetUserName(...);

}

在BLL中调用:DAL.GetUserName();

二、在DAL中使用实例方法,采用静态成员模式(或Singleton)通过实例来调用:class DAL

{

public static readonly DAL dal = new DAL();

public string GetUserName(...);

}

在BLL中调用:DAL.dal.GetUserName();

三、在DAL中使用实例方法,每次调用之前先创建DAL对象的实例:class DAL

{

public string GetUserName(...);

}

在BLL中调用:DAL dal = new DAL();

dal.GetUserName();

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

开发方式一:我以为在一些情况下(比如调用多个数据库、GetUserName(...)内部处理操作部分)会出现线程安全的嫌疑。这种开发方式不用New出对象,所以很普遍。

开发方式二:应该多是应用在cs模式下,DAL在整个项目只会有一个对象存在,如果出现在B/S

我想不能兼容多种问题情况。而且也有线程安全的问题。

开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。

我特意以“你怎么理解并使用静态方法和实例化方法的?”这样的问题询问了多位程序员,他们开发的语言也不尽相同(c

、c++、java、c#)

以下是他们的回答:

张伟说:几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量。

萧远山说:静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。

张新波说:静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。

向详说:静态就是类的,实例就是对象的。静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。

winson_张林说:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存

showlover说:

静态方法与实例方法各有自己的用处...

是定义成静态方法,还是定义成实例方法,还要看具体情况,比如方法本身与类型没有太大的关系,可以定义成静态方法..

用实例方法,当然需要你先创建实例,才能调用实例方法,而静态方法则不需要..

从性能上说,静态方法效率要稍微高一些,但是它会常驻内存...

一些情况下使用静态方法是有好处的,因为对于静态方法无论你有多少个实例,内存中要维护的一份拷贝。同时,某些方法,确实使用静态是比较恰当的..

Q.yuhen说:

这个问题牵扯到的东西比较多,诸如设计模式等等。简单点说,静态方法用来执行无状态的一个完整操作,实例方法则相反,它通常是一个完整逻辑的一部分,并且需要维护一定的状态值。如果用内存和效率来区分使用Static Method、Instance Method

就回到过去结构化编程了。使用那种方法的根本出发点还是围绕面向对象来进行的。

陈亮说:

静态方法和全局函数差不多的,实例方法是一个类里面的方法。

如果从线程安全、性能、兼容性上来看也是选用实例化方法为宜。

我们为什么要把方法区分为:静态方法和实例化方法?

如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

拿别人一个例子说事:

比如说“人”这个类,每个人都有姓名、年龄、性别、身高等,这些属性就应该是非静态的,因为每个人都的这些属性都不相同;但人在生物学上属于哪个门哪个纲哪个目等,这个属性是属于整个人类,所以就应该是静态的——它不依赖与某个特定的人,不会有某个人是“脊椎动物门哺乳动物纲灵长目”而某个人却是“偶蹄目”的。

Java静态初始化,实例初始化以及构造方法首先有三个概念需要了解:

一.静态初始化:是指执行静态初始化块里面的内容。

二.实例初始化:是指执行实例初始化块里面的内容。

三.构造方法:一个名称跟类的名称一样的方法,特殊在于不带返回值。

我们先来看一段程序结果:

9e26b86bb36186d91b7933cb0388746f.png

执行结果:

this is static method~

this is static block

如果把

65db5002eea606b03dc904c96f881f2a.png

的注释去掉的话,运行结果为:

this is static method~

this is static block

初始化块:0

this is Book's constructor~

执行顺序:(优先级从高到低。)静态代码块>main方法>实例初始化块>构造代码块>构造方法。”

总结:

仅从代码执行的角度来探讨Java加载类、创建对象的过程,并没有深入到JVM的机制中去。

1.一个对象第一次被创建时,先要加载该对象所属的类,即对应的.class文件,当然如果类已经加载,再次创建该类的对象时,就不再需要重新加载类了。而一个类加载的时候,有三个部分需要加载,一个是静态变量,再然后是静态方法,然后是静态初始化块。(见到第一次执行结果就知道了,由于没有创建实例所以初始化块不执行)

2.然后开始创建该类的实例了,当然如果静态方法跟静态初始化对象中有对象的创建时,就继续加载该对象的类,当然已经加载了该对象的类的话就不需要再次加载了。那么对象实例的创建过程是什么呢?首先是成员变量的引入,然后是实例初始化块,之后才是构造方法,构造方法执行完成之后才算把这个对象给创建出来了。

在这个过程中,真正可以编写执行代码的地方有三个,静态初始化、实例初始化以及构造方法。从以上的分析中我们可以看到,这三个代码块的执行顺序是先类的静态初始化,再实例初始化,最后执行构造方法。也就是说,静态初始化是属于类加载的过程,所以它只执行一次,而实例初始化是每个对象创建时都会执行一次,而构造方法跟实例初始化其实也差不多,不过它在实例初始化之后执行,而且构造方法可以重载多个,执行哪个构造方法是根据你的选择来的。

可以把main () 函数加一条语句看看:

a0ae54468f9b4df6f7dfb965d868d1f1.png

此时执行结果为:

this is static method~

this is static block

初始化块:0

this is Book's constructor~

初始化块:1

this is Book's constructor~

这说明实例初始化是每个对象创建时都会执行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360183.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用wrapper将java程序注册程windows服务后不生效

使用wrapper将java程序注册程windows服务后不生效 使用add.bat或test***.bat测试通过了, 然后使用install***.bat注册后cmd显示注册成功。 但是程序到了运行时间就是不运行!! 解决办法 控制面板 ---> 管理工具 ---> 服务,找…

有简历,为何还要自我介绍?

有简历,为何还要自我介绍? 一个常规的面试,寒暄之后考官提出的第一个面试问题几乎千篇一律:“请你简单地做一下自我介绍”。有些被面试者都会问:简历中情况已经写得很清楚了,这是否多此一举? 要…

java aio聊天_JAVA aio简单使用

使用aio,实现客户端和服务器 对一个数进行轮流累加//服务器端public class Server {private static ExecutorService executorService Executors.newFixedThreadPool(4);public static void main(String[] args) {try {AsynchronousChannelGroup groupAsynchronous…

使用jOOQ的MockDataProvider破解简单的JDBC ResultSet缓存

某些查询不应该一直访问数据库。 例如,当您查询主数据 (例如系统设置,语言,翻译等)时,您可能希望避免一直通过网络发送相同的愚蠢查询(和结果)。 例如: SELECT * FROM l…

ASP.NET内置对象

Request[从浏览器获取信息] QueryString:获取HTTP查询字符串变量集合 Path:获取当前请求的虚拟路径 UserHostAddress:获取远程客户端的IP主机地址 Browser:获取有关正在请求的客户端浏览器功能的信息 Form:获取窗体变量的集合 Url:获取当前请求的URL信息 MapPath():返回与Web服…

java爬虫新闻网站_java爬虫 之 搜狐新闻爬虫(一)

最近开始学习java爬虫,网上很多教程,自己找的时候花了好久的时间去理解别人的思路。打算将自己最近的学习进度稍作整理,理清思路。主要工具使用jsoup:具体用法看http://blog.csdn.net/u012315428/article/details/51135640下面是获…

easyui源码翻译1.32--ValidateBox(验证框)

前言 使用$.fn.validatebox.defaults重写默认值对象。下载该插件翻译源码 validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效。如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警告图标和提示信息。该验证框可以结合form(表单…

java静态方法获取对象_JavaPowerMockito模拟单个静态方法和返回对象

小编典典你想要做的是1的一部分和2的全部的组合。你需要使用PowerMockito.mockStatic为类的所有静态方法启用静态模拟。这意味着可以使用when-thenReturn语法对它们进行存根。但是,当你调用尚未在模拟实例上显式存根的方法时,你正在使用的2个参数的mathS…

从战中反弹:将Git提交信息作为JSON返回

在某些情况下,我们必须知道部署到远程服务器的Web应用程序的确切版本。 例如,客户可能想知道我们是否已经在服务器X上部署了错误修复程序。 当然,我们可以尝试使用“传统”方法找到该问题的答案。 问题是: 没有人不记得是谁更新…

在论坛中出现的各种疑难问题:日志收缩问题

最近,在论坛中,遇到了不少疑难的问题,在此特别记录,同时也感谢发帖人的分享、以及其他网友的热心回答。 1、日志暴大,无法收缩,谁来挑战一下! http://bbs.csdn.net/topics/390674731?page1#pos…

学java前要学css_教你一招:学习Java必须学会的CSS用法

一:CSS概述什么是CSSCSS就是层叠样式表(Casading Style Sheets),通常称为CSS样式表,或者是级联样式表。主要用于设置HTML中的文本,内容(字体,大小,对齐),图片外形(宽高,边框样式&…

标准I/O库之缓冲

标准I/O库提供缓冲的目的是尽可能减少使用read和write调用的次数。它也对每个I/O流自动地进行缓冲管理,从而避免了应用程序需要考虑这一点所带来的麻烦。 标准I/O提供了三种类型的缓冲: (1)全缓冲。这种情况下,在填满标…

java如何写安卓接口文档_android、java制作sdk以及自动生成文档

最近一直在做android开发,昨天经理让我写个接口SDK做个接口文档,以便后面的开发。这让我很焦灼,SDK怎么做?要是只有敲代码还好。可是那个接口文档!!!文档这东西最讨厌了,头都大了后来…

[转载]jquery cookie的用法

原文地址:http://www.cnblogs.com/qiantuwuliang/archive/2009/07/19/1526663.html jQuery cookie是个很好的cookie插件,大概的使用方法如下 example $.cookie(’name’, ‘value’); 设置cookie的值,把name变量的值设为value example $.cookie(’name’…

21世纪的设计模式:抽象工厂模式

这是我的演讲的第二部分,“ 21世纪的设计模式” 。 此模式在Java代码中到处都有使用,尤其是在更多“企业”代码库中。 它涉及一个接口和一个实现。 该界面如下所示: public interface Bakery {Pastry bakePastry(Topping topping);Cake bak…

java textfield类方法_java.awt.TextField类

java.awt.TextField是一个文本框组件1.构造方法TextField():创建一个默认长度为一个机器字符长的文本框TextField(int n):创建一个指定长度为n个机器字符长的文本框TextField(String s):创建一个文本框,该文本框的初始字符串为sTe…

广东金融学院java实验报告_《大学计算机Ⅰ》实验报告实验三

广东金融学院实验报告课程名称:大学计算机Ⅰ实验编号 及实验名称 姓 名 实验地点 指导教师蔡文璇 12-204课室 伍春晖博士实验三 中文Excel 2007实验系 别 班 级 实验时数 成 绩财经传媒系 经济秘书(2)班6学 号 实验日期 同组其他成员111602242 2011年 12 月07 日无一…

Markdown会干掉Html吗?

Markdown会干掉Html吗? 很明显,MarkDown正在已一种比病毒还快的速度传播着,量子的机器人语言也是深受其启发,当然了,在这个东西没搞出来之前,MarkDown就能干很多事情,比如在线编辑。 有了它&…

java动态变量名反射_Java动态性—反射 - Eclipse666的个人空间 - OSCHINA - 中文开源技术交流社区...

1.什么是动态语言?程序运行时,可以改变程序的结构或者变量类型;如Python,javaScriptfunction(){var s"var a3;var b4;" evals(s);}在执行javascript代码的的过程中,可以改变变量的值或插入语句改变结构。但J…

java中的module是什么意思_Angular - 组件中module.id的含义是什么?

Update for (2017-03-13) :删除了所有提及的moduleId . “组件相对路径”cookbook已删除我们在我们推荐的SystemJS配置中添加了一个新的SystemJS插件(systemjs-angular-loader.js) . 此插件动态地将templateUrl和styleUrls中的“组件相对”路径转换为“绝对路径” .…