javajava 静态方法法与非java 静态方法法有什么区别

Java系列之:看似简单的问题 静态方法和实例化方法的区别
今天看书时一直没真正弄明白静态方法和实例方法的区别,就在网上搜索,找到一篇很好的文章,和大家分享一下:
这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。
方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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 我想不能兼容多种问题情况。而且也有线程安全的问题。
开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
特别说明一下:在MS的pet3.0以前的版本 都采用了方式二,而到pet3.0和以后的版本 都采用了方式三,而且特别在开发说明文档中明确的解释了一下。我想应该是从兼容性上考虑的,从性能上方式二并不比方式三真正的高多少。
-------------------------------------------------------------------------
我特意以&你怎么理解并使用静态方法和实例化方法的?&这样的问题询问了多位程序员,他们开发的语言也不尽相同(c 、c++、java、c#)
以下是他们的回答:
公用的方法,而且是一些零散的 一般用静态方法
张伟说:几乎没有区别,如果不需要实例化,就用静态方法;如果为了稳妥,就用实例方法,这样才可调用其他实例方法和变量 。
萧远山说:静态方法比较少用,因为他在一启动就实例化了,比较占资源,当然,,配合单例模式还是比较好用的比较多的用在数据连接上,我避免使用的原则就是减少资源消耗。
张新波说:静态方法意味着我在调用前不需要进行对其所属的类进行new操作,我主要会在工具类里面用到静态方法。
向详说:静态就是类的,实例就是对象的。静态方法和实例方法的区别之处还有一个地方:静态方法不需要依赖类当中的属性,能在这个方法中封闭的完成一个功能。实例方法更多的会使用到类当中的属性。
winson_张林说:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以
分享这篇日志的人也喜欢
MerryChristmas??
圣诞节快乐
圣诞节快乐
找个有趣的人一起过圣诞
平安夜快乐
?MerryChristmas?
热门日志推荐
人人最热标签
北京千橡网景科技发展有限公司:
文网文[号··京公网安备号·甲测资字
文化部监督电子邮箱:wlwh@··
文明办网文明上网举报电话: 举报邮箱:&&&&&&&&&&&&
请输入手机号,完成注册
请输入验证码
密码必须由6-20个字符组成
下载人人客户端
品评校花校草,体验校园广场JAVA静态方法和非静态方法的区别和实例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
JAVA静态方法和非静态方法的区别和实例
&&Static的疑问
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢java synchronized同步静态方法和同步非静态方法的异同
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了java synchronized同步静态方法和同步非静态方法的异同的相关资料,需要的朋友可以参考下
java synchronized 详解
synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对象变量,你也可以通synchronizedl来同步类中的静态方法和非静态方法。
synchronized块的语法如下:
public void method()
synchronized(表达式)
public void method()
synchronized(表达式)
第一种:非静态方法的同步
从Java相关语法可以知道使用synchronized关键字来定义方法就会锁定类中所用使用synchroniezd关键字定义的静态方法和非静态方法,但是这有点不好理解,如果要synchronized块,来达到这样的效果,就不难理解为什么会产生这种效果了,如果使用synchronized来锁定类中所有的同步非静态方法,只需要使用this作为synchronized块的参数传入synchronized块中,代码如下:
& 通过synchronized块来同步非静态方法
在上面的代码中的method1使用了synchronized块,method2方法是用了synchronized关键字来定义方法,如果使用同一个Test实例时,这两个方法只要有一个在执行,其他的方法都会因未获得同步锁而被堵塞。除了使用this作为synchronized块的参数,也可以使用Test.this作为synchronized块的参数来达到同样的效果。
public class Test
public void method1()
synchronized(this)
public synchronized void method2()
public class Test
public void method1()
synchronized(this)
public synchronized void method2()
&在内类中使用synchronized块中,this只表示内类,和外类(OuterClass)没有关系。但是内类中的非静态方法和外类的非静态方法也可以同步。如果在内类中加个方法method3也可以使和Test里面的2个方法同步,代码如下:
public class Test
class InnerClass
public void method3()
synchronized(Test.this){
public class Test
class InnerClass
public void method3()
synchronized(Test.this){
上面InnerClass的method3方法与Test的method1和method2方法在同一时间内只能有一个方法执行。
synchronized块不管是正确执行完,还是因为程序出错因异常退出synchronized块,当前的synchronized块所持有的同步锁都会自动释放,因此在使用synchronized块不必担心同步锁的问题。
二、静态方法的同步
由于在调用静态方法时,对象实例不一定被创建,因此,就不能使用this来同步静态方法,而必须使用Class对象来同步静态方法。代码如下:
public class Test{
pubic static void method1(){
synchronized(Test.class){
public static synchronized void method2(){
public class Test{
pubic static void method1(){
synchronized(Test.class){
public static synchronized void method2(){
在同步静态方法时可以使用类的静态字段class来得到class对象,在上例中method1和method2方法只有一个方法执行,除了使用class字段可以得到class对象,还可以通过实例的getClass()方法获取class对象,代码如下:
public class Test{
public static T
public Test(){
public static void method1(){
synchronized(test.getClass()){
public class Test{
public static T
public Test(){
public static void method1(){
synchronized(test.getClass()){
在上面的代码中,我们通过一个public的静态对象得到Test的一个实例,并通过这个实例的getClass方法获取一个class对象(注意一个类的所有实例通过getClass方法得到的都是同一个Class对象)。我们也可以通过class使不同类的静态方法同步,代码如下:
Test类中的方法和Test1类中方法同步。
public class Test1{
public static void method1(){
synchronized(Test.class){
public class Test1{
public static void method1(){
synchronized(Test.class){
注意:在使用synchronized块来同步方法时,非静态方法可以通过this来同步,而静态方法必须使用class对象来同步,但是非静态方法也可以通过使用class来同步静态方法。但是静态方法中不能使用this来同步非静态方法。这点在使用synchronized块需要注意。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具分享给朋友:通用代码: <input id="link4" type="text" class="form_input form_input_s" value="" />复 制flash地址: 复 制html代码: <input type="text" class="form_input form_input_s" id="link3" value="" />复 制58.Java_非静态方法与静态方法的差别下载至电脑扫码用手机看用或微信扫码在手机上继续观看二维码2小时内有效58.Java_非静态方法与静态方法的差别扫码用手机继续看用或微信扫码在手机上继续观看二维码2小时内有效,扫码后可分享给好友没有优酷APP?立即下载请根据您的设备选择下载版本
药品服务许可证(京)-经营- 请使用者仔细阅读优酷、、、、和Copyright(C)2017 优酷
版权所有不良信息举报电话:博客分类:
java中经常有一些静态块,这是用来在生成类之前进行的初始化,无论java还C++语言中的static,都是最先初始化好的。结构如下:
静态语句代码块
非静态语句代码块
相同点:都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,一般在代码块中对一些static变量进行赋
不同点:静态代码块在非静态代码块之前执行(静态代码块--》非静态代码块--》构造方法)。
静态代码块只在第一次new执行一次,之后不在执行,而非静态代码块在每new一次就执行一次。非静态代码块可以
在普通方法中定义(个人感觉作用不大);而静态代码块不行。
package com.sample.
public class Test {
System.out.println("Test Static 静态语句块");
public Test() {
System.out.println("Test 默认无参构造器");
System.out.println("Test 非静态");
package com.sample.
public class Test1 extends Test {
System.out.println("Test1 Static 静态语句块");
public Test1 () {
System.out.println("Test1 默认无参构造器");
System.out.println("Test1 非静态");
public static void main(String[] args) {
Test1 t = new Test1();
输出结果如下:
Test Static 静态语句块
Test1 Static 静态语句块
Test 非静态
Test 默认无参构造器
Test1 非静态
Test1 默认无参构造器
1、静态代码块是在类加载时自动执行的,非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造方法。
2、在静态方法里面只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后方可使用,而静态方法在使用前不用创建任何对象。
3、如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,此时代码是被动执行的。
区别:静态代码块是自动执行的;
静态方法是被调用的时候才执行的;
作用:静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。
浏览: 306097 次
来自: 上海
你的onlyMoney这个方法好像不太好用
例如有两个线程同时执行(没有synchronized)一个线程 ...
楼主你这例子里边的SampleResource实体没有额?
[flash=200,200][url][url][img][ ...
官网全是一堆工程,而且不是web工程,对新手极不友好
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 java反射调用静态方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信