静态变量 静态对象 静态函数和非静态函数的区别。(我的理解,大家看看对不对)

简介: 先明确一下 语言:asp.net C# 1、静态变量:static string str1 = "1234"; 2、静态对象static SqlConnection cn = new SqlConnection(); 3、静态函数class aa{    public static str...

先明确一下

语言:asp.net C#


1、静态变量:
static string str1 = "1234";

2、静态对象
static SqlConnection cn = new SqlConnection();

3、静态函数
class aa
{
    public static string test(string str)
    {
        return str & "111";
    }
}

调用

aa.test("123");


4、非静态函数(就是需要实例化的)
class aa
{
    public string test(string str)
    {
        return str & "111";
    }
}

调用
aa a1 = new aa();
a1.test("123");


其中静态变量和静态对象是比较好理解,也没有什么争论。争论最大的是静态函数这一块。

1、静态变量。在内存里是应该只有一份,不管是不是多线程,是不是多用户同时访问,静态变量只占用一份内存。

2、静态对象和静态变量也差不多,只有一份。

个人认为 SqlConnection 是不应该只用静态的,除非你的网站没有(或很少)并发访问的情况。
否则就很容易出现千军万马过独木桥的现象。挤不过去了就会瘫痪的。而且连接池也就无用武之地了。


3、非静态函数,就是在调用的时候必须先实例化,然后才能访问到。

实例化到底做了什么呢?是不是把整个类都“复制”了一份供调用者使用呢?
类的属性、函数的参数、返回值,这些应该是在实例化的时候产生一份,供调用者单独使用,其他的调用者是绝对访问不了的。
那么函数(或者说是类)呢?也又生成了一份吗?还没有弄清楚。


4、静态函数,直接调用不需要实例化,也没有“属性”

没有实例化,函数是一份的,多少人调用,都是这一份。那么函数用的参数和返回值呢?也是只有一份吗?

这个好像就不是了,应该有多份,有一个调用的就产生一份,return 后自动销毁。我想应该是这样的,要不然多线程的时候不就乱了吗?

当然函数内定义的变量、对象也应该是独立的(多份),有一个调用的就产生一份。

 

小结

静态函数和非静态函数最大的区别是,静态的不能访问所在类的属性和内的私有变量,其他的好像都一样了。

再有就是在调用的时候会不会“复制”一遍算法(函数本身)?(我感觉是都不会复制的)。

两者需要的参数,返回值应该是独立的,一个调用者一份,一个调用者不会访问到其它调用者的参数和返回值。


不知道我的看法对不对,请大家检查一下。

 

相关文章
|
6月前
|
C++
C++静态成员变量及函数
C++静态成员变量及函数
42 0
|
18天前
|
存储 Java
静态变量与实例变量的区别
【10月更文挑战第15天】总之,静态变量和实例变量在 Java 中具有不同的特性和用途。理解它们的区别对于正确设计和编写代码至关重要。
|
2天前
|
Java
静态变量和实例变量区别
静态变量: 静态变量由于不属于任何实例对象,属于类的,所以在内存中只会有一份,在类的加载过程中,JVM只为静态变量分配一次内存空间。 实例变量: 每次创建对象,都会为每个对象分配成员变量内存空间,实例变量是属于实例对象的,在内存中,创建几次对象,就有几份成员变量。
|
1月前
使用静态变量和方法
使用静态变量和方法
12 1
|
4月前
成员变量、局部变量和静态变量的区别
成员变量、局部变量和静态变量的区别
25 0
|
Java 编译器 C语言
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(2)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(1)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化(1)
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
|
存储
局部变量和成员变量的4个区别
定义位置不同、内存中的位置不同、周期不同、初始化不同。
120 0
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
使用final关键字修饰一个变量时,是指引用变量不能变,但是引用变量所指向的对象中的内容还是可以改变的。
408 0
使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
静态变量和实例变量的区别
静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。
1298 0