如何在静态方法中调用非静态变量调用和方法

&&&&&&&&&&&&&
来源本人CSDN博客:
欢迎您莅临指导,共同交流,共同进步。
&问题来源:昨天给八期的师弟辅导机房收费系统的时候,发现一个有意思的问题。就是Bll和Dal层,D层是静态方法,B层调用D层的方法的时候,直接调用。
& & & & & &当时我看到这个问题,感觉按照常规的思维来想这个问题,肯定是先new一下D层,然后再调用。这个问题仔细想想还真有点不知所措。
& & & & &&&经过一番了解:
& & & & & &一、方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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 我想不能兼容多种问题情况。而且也有线程安全的问题。
& & & & & & & & & 开发方式三:应该是普遍使用的,能够兼容各种问题,也不会有线程不安全的嫌疑出现。
从内存分析
& & & & 因为上面的问题一起下面的问题,当程序运行了一会,报Connection超过了最大连接数。这个问题是怎么回事?
& & & & 原因:最大的区别在于内存。静态方法在程序开始时生成内存,实例方法在程序运行中生成内存,所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存。
& & & & 任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的,只是实现方法不同。静态内存是连续的,因为是在程序开始时就生成了,而实例申请的是离散的空间,所以当然没有静态方法快,而且静态内存是有限制的,太多了程序会启动不了。 &
& & & & 静态方法和非静态方法对比总结:
& & & &①静态成员属于类所有,非静态成员属于类的实例所有。
  ②每创建一个类的实例,都会在内存中为非静态成员新分配一块存储;
  非静态成员属于类所有,为各个类的实例所公用,无论类创建了多少实例,类的静态成员在内存中只占同一块区域。 
& & & & 总括:实例化方法使用和稳妥,静态方法少使用
阅读(...) 评论()讨论下静态方法?非静态方法的区别,以及在什么时候使用
我的图书馆
讨论下静态方法?非静态方法的区别,以及在什么时候使用
讨论下静态方法 非静态方法的区别,以及在什么时候使用 这是一个经常被时时提出来的问题,很多时候我们以为理解了、懂了,但深究一下,我们却发现并不懂。方法是我们每天都在写得,很多程序员大多都使用实例化方法,而很少使用静态方法,问原因也说不出来所以然,或者简单的回答两者定义的区别,静态方法不需要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#静态函数及变量的一个精典例子与代码(1)用于对静态字段、只读字段等的初始化。              (2)添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。      (3)类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数(4)静态构造函数是不可继承的,而且不能被直接调用。            (5)如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。  (6)如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。&&什么是静态方法静态方法的1个特别作用就是不用创建类的对象,而直接用类里面的方法(public static 2个条件),例如: class A { public static void b() {..............} }可以这样直接用: A.b(); 那么在程序中如何可以利用静态字段和静态构造方法,通常适用于于一些不会经常变化而又频繁使用的数据,比如连接字符串,配置信息等,当满足上面所说的两点时,进行一次读取,以后就可以方便的使用了,同时也节约了托管资源,因为对于静态成员,一个静态字段只标识一个存储位置。对一个类无论创建了多少个实例,它的静态字段永远都只有一个副本。 static: 类变量(对象共享)可以用类名,对象名点取,间接使用。 类方法1)static方法中不能直接使用非静态成员, 因为非静态成员与实例相关,通过对象点取间接使用2)static方法中不能用this(与实例相关)3)非static方法中可以使用static成员静态方法有什么弊端?问:我翻看一些源码工程时看到几乎没有什么静态方法唯独Ms的SQLHelper中几乎全是静态方法 为什么呢?答1:在一些系统中使用非常频繁的方法都使用静态方法可以提高系统性能我是这么认为的 :)答2:本身不可升级, 重写 这要看一个软件产品的目的是什么了.答3:为了方便,不用实例化,但这样程序编译运行时就占用了系统资源答4:静态的属性和方法在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的答5:静态方法/数据成员是属于类的,不是属于某一个对象的,因而调用它不需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象所共有,因而在需要共享数据时,定义这种类型时很好的选择。一但定义一个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序启动,就装入内存,没有定义该类时它不会载入内存) 静态成员的作用域与它所属的类的作用域相同
TA的最新馆藏
喜欢该文的人也喜欢记住登录一个月发表随想还能输入:200字该用户最新代码编程随想&by by by by by by [java]代码库public class HelloWorld {
// 定义静态变量score1
static int score1 = 86;
// 定义静态变量score2
static int score2 = 92;
// 定义静态方法sum,计算成绩总分,并返回总分
public static int sum() {
return score1+score2;
public static void main(String[] args) {
// 调用静态方法sum并接收返回值
int allScore = HelloWorld.sum();
System.out.println("总分:" + allScore);
}分享到:更多发表评论:评论须知:1、评论每次加2分,每天上限为30;2、请文明用语,共同创建干净的技术交流环境;3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。2013年4月 总版技术专家分月排行榜第一2013年3月 总版技术专家分月排行榜第一
2013年4月 .NET技术大版内专家分月排行榜第一2013年3月 .NET技术大版内专家分月排行榜第一
2013年4月 总版技术专家分月排行榜第一2013年3月 总版技术专家分月排行榜第一
2013年4月 .NET技术大版内专家分月排行榜第一2013年3月 .NET技术大版内专家分月排行榜第一
2010年11月 总版技术专家分月排行榜第二2010年9月 总版技术专家分月排行榜第二2010年8月 总版技术专家分月排行榜第二
2010年7月 总版技术专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。java书上说“静态方法中不允许使用非静态方法”. 可是书上很多静态方法main()中都含有许多非静态方法啊。
拿以下代码为例,main()里有methodDemo.scopeDemo();methodDemo.setData(20);该怎么解释这个定律?
java书上说“静态方法中不允许使用非静态方法”. 可是书上很多静态方法main()中都含有许多非静态方法啊。
拿以下代码为例,main()里有methodDemo.scopeDemo();methodDemo.setData(20);该怎么解释这个定律?
class MethodDemo{
private int data=10;
public void scopeDemo(){
int data=100;
public int getData(){
public void setData(int data){
this.data=
}
}
public class MethodMember{
public static void main(String[] args){
MethodDemo methodDemo=new MethodDemo();
methodDemo.scopeDemo();
System.out.println(methodDemo.getData());
methodDemo.setData(20);
System.out.println(methodDemo.getData());
你的相关信息中静态方法main没有调用任何非静态方法,methodDemo.scopeDemo();你说的这个方法调用是MethodDemo类的成员方法而已,因为该类对象已经被创建,所以对象方法可以被合法调用
public class MethodMember{
public int getData(){
public static void main(String[] args){
System.out.println(getData());
如果代码改成这样,那就出错了,因为在static主函数中,直接调用了非静态方法,因为MethodMember类根本没有没创建,对上述进行修改,就可得以下两种合法的方法调用
public class MethodMember{
public static int getData(){
public static void main(String[] args){
System.out.println(getData(...
你的相关信息中静态方法main没有调用任何非静态方法,methodDemo.scopeDemo();你说的这个方法调用是MethodDemo类的成员方法而已,因为该类对象已经被创建,所以对象方法可以被合法调用
public class MethodMember{
public int getData(){
public static void main(String[] args){
System.out.println(getData());
如果代码改成这样,那就出错了,因为在static主函数中,直接调用了非静态方法,因为MethodMember类根本没有没创建,对上述进行修改,就可得以下两种合法的方法调用
public class MethodMember{
public static int getData(){
public static void main(String[] args){
System.out.println(getData());
静态化getData()方法
public class MethodMember{
public int getData(){
public static void main(String[] args){
System.out.println(new MethodMember().getData());
生成MethodMember对象,调用其成员方法
其他答案(共3个回答)
的void main没有直接使用非静态成员或方法,而是先生成了对象MethodDemo methodDemo=new MethodDemo(); 然后再调用其非静态方法methodDemo...
静态方法是各个类共用的,可以在不生成对象的情况下调用。一般用于类公共静态变量的赋值和输出处理。
非静态的方法是一定要生成对应的对象实例以后才可以用的,用于和个体数据成员的赋值输出及其他操作。
你的相关信息的void main没有直接使用非静态成员或方法,而是先生成了对象MethodDemo methodDemo=new MethodDemo(); 然后再调用其非静态方法methodDemo.scopeDemo(); ,这种方式是允许的。
如果没有生成对象就直接使用本类定义的非静态成员或方法,就是不对的。
----------
打个类比,非静态成员或方法就像是每个人随身带的口袋,静态成员或方法就像大家共用的抽屉,抽屉里发生的事和每个人的口袋没有直接关系。
如果抽屉要调用口袋,必须指明是谁(某个对象)的口袋(非静态成员或方法),否则突然说要用一个口袋,因为这个口袋是脱离抽屉存在的,抽屉不知道是指谁的,也就不可能用得来。
另外,没有人情况下,抽屉还是可以单独发生点事(比如抽屉清空)的;即没有生成对象情况下,调用静态方法。
你的main例子就像是发生了这样一件事:现在抽屉里凭空产生了一个新的人出来,抽屉可以“把握”得到他,就可以指明地调用他的口袋。
static方法内部不能直接调用非静态方法,可以在调用之前实例化非静态方法所在的类,再用类点方法来调用。例:非静态方法是className类里面的method(...
你好,我觉得最主要的原因是因为泛型擦除。class Demo {public void add(T t) {//...}}编译后通过反编译:D:\test&ja...
“局部变量、成员变量”我称为非静态成员变量。“全局变量”称为静态成员变量。非静态成员变量是在定义后,电脑随机给一个地址,当程序运行结束时,地址收回。而静态成员变...
是静态IP地址。你的电脑不是不能自动获取IP地址,而是很方便的自动获取的IP不能上网。网络使用静态IP还是动态IP是由管理你的局域网的网络运营商或网管决定的,尽...
类就一个.静态的不会出2个.同步不2同步没啥关系.这样理解对不对.你都试过了.哆啦A梦试的代码.class DualSynch {private Object ...
答: 想学达内的java,请问学java之前需要有什么基础吗???
答: 这个要设计到JNI的开发,就是用Java来调用C语言的函数库,还要编写缓冲器来解决传输问题,还有就是网络协议一定要了解,做的时候要用多线程来控制你所有的缓冲器,...
答: 所谓的网络编程,不论c还是java,本质上都是通过socket进行数据传输;一般情况下可以使用的传输协议有tcp、udp、ftp等等,这些协议为网络变成提供基本...
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区
相关问答:123456789101112131415

我要回帖

更多关于 java 调用静态变量 的文章

 

随机推荐