查看: 1349|回复: 4
打印 上一主题 下一主题

[其他] 关于静态变量

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-8-29 03:39:03 |只看该作者 |倒序浏览

     1. 静态变量:是由静态修饰符static来修饰的,是类的变量,但是不属于任何一个类的具体对象,也就是说,也就是说,对于该类的任何一个具体的对象来说,静态变量是一个公共的存储单元,任何一个类的对象在访问这个存储单元时,都会获得一个同样的数值,同样,任何一个类在修改这个存储单元时,也都会完成相同的操作。这样我们就可以理解成对象共享了静态变量。

     2. 静态方法也是由static修饰符来修饰的,静态方法是属于整个类的方法T>:

          首先,调用静态方法时,应该是使用类名做前缀进行调用,而不是用  类名  c=new 类名();创建对象名来调用,因为静态方法属于整个类的方法。

          其次,非静态的方法属于某个对象的方法,是在这个对象在被创建时,系统为对象的方法在内存中分配单独的专用空间;而静态的方法则是属于整个内的方法,它随着类的定义而在内存中进行分配,不属于任何一个对象。

     最后,静态方法属于整个类的,因此它不能对某个对象的成员进行操作和处理,而只能对某个类的成员变量进行操作和处理,也就是说,静态方法只能处理静态数据T>。

     3. 静态方法中没有this引用,不能在静态方法中访问非静态的成员和方法

     4. 在同一个类中,静态的方法不能调用非静态的方法,但是在非静态方法中能调用静态的方法;

实例如下:

     定义了两个类TestStatic和StaticBlock

StaticBlock类:

class StaticBlock

{

      static String a="static的用法!";

      //创建一个非静态的变量

      int sum=0;

      //静态方法中只能引用,静态的方法和变量

      static void speak()

      {

            System.out.println("a="+a);

            //在静态方法中不能用this关键字

            //this.speak1();

            //在静态方法中调用静态方法

            speak1();

  

            

            //调用错误,不能在静态方法中调用非静态的方法

            //sum1();

}

void sum1()

{

       int a=1;

       int b=2;

       sum=a+b;

       System.out.println("sum="+sum);

  //调用正确,在非静态的方法中能调用静态的方法

       this.speak();

}

static void speak1()

{

       System.out.println("a="+a);

  

      

       //调用错误,不能在静态方法中调用非静态的方法

       //sum1();

}

}

TestStatic类:

class TestStatic

{

public static void main(String[] args)

{

       System.out.println("我喜欢学习java");

  

      

       //类名,直接调用StaticBlock中的静态方法

  StaticBlock.speak();

}

}

/****************************************************************************************************************/

静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量。
static变量在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。
静态函数的实现里不能使用非静态成员
C#静态方法及属性在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的

C#静态方法/数据成员是属于类的,不是属于某一个对象的,因而调用它不需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象所共有,因而在需要共享数据时,定义这种类型时很好的选择。 一但定义一个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序启动,就装入内存,没有定义该类时它不会载入内存) 静态成员的作用域与它所属的类的作用域相同

这东西意味着你的程序运行完毕.即使没有实例化对象.在内存中也是存在这些内容的.
所以对于运行速度上有很大的影响(大项目如果全用这个)
所以.并不经常用


静态方法
1. 是一种特殊的成员方法,不属于类的某一个具体的实例,它属于类本身。
2. (不能访问什么)静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等
3. (能访问什么)静态成员函数仅能访问静态的数据成员,不能访问非静态的数据成员,也不能访问非静态的成员函数,这是由于静态的成员函数没有this指针。
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

hyui    

1

主题

2

听众

6671

积分

高级设计师

Rank: 6Rank: 6

纳金币
2715
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-8-29 04:08:18 |只看该作者
Good to know !
回复

使用道具 举报

0

主题

2

听众

4092

积分

中级设计师

Rank: 5Rank: 5

纳金币
530
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

板凳
发表于 2014-8-29 06:59:54 |只看该作者
Thanks for sharing !
回复

使用道具 举报

0

主题

1

听众

364

积分

设计实习生

Rank: 2

纳金币
1
精华
0

最佳新人

地板
发表于 2014-8-29 08:56:00 |只看该作者
不明觉厉
回复

使用道具 举报

33

主题

1

听众

2680

积分

中级设计师

Rank: 5Rank: 5

纳金币
559
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-8-29 09:06:44 |只看该作者
不明觉厉
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 16:53 , Processed in 0.130916 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部