静态类和非静态类的主要区别:
主要区别在于静态类不能实例化,静态类编译器能够执行检查确保不是偶然的添加实例成员,C#编译器会自动把它标记为sealed,静态类中不能创建非静态的方法,即静态方法中只能创建静态方法,但在非静态类中可以调用静态方法。
静态类的主要特性:
1:仅包含静态成员。
2:无法实例化。
3:是密封的。
4:不能包含实例构造函数。
5:非静态类可以包含静态的方法、字段、属性或事件;
6:静态方法和属性不能访问其包含类型中的非静态字段和事件
7:静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;
8:C# 不支持静态局部变量(在方法内部定义静态变量)。
非静态类在使用时必须要实例化,每次使用时都要进行实例化,一般情况下使用比较频繁的类,可以使用静态类,比如LogClass,ConfigClass等等。
Java中只有 静态方法,没有静态类的概念吧! 静态方法无需实例化当前类,可以直接用类名调用静态方法。非静态方法 必须要new对象 然后才能访问类中的方法。
静态类不能实例化,类的成员都要是静态成员和静态方法,
非静态类一般需要实例化后才可以操作,不过接口和抽像类不能直接实例化。
通俗的说
静态类是static的 不需要new对象就可以访问类中的方法
非静态类 必须要new对象 然后才能访问类中的方法
1、从内存的角度分析用静态修饰和非静态的区别
用static修饰的成员变量一般情况下我们成为成员变量,其值存放的地址是方法区的常量池,其执行的顺序为在加载类的时候就将static修饰的变量名或者方法存放到常量池了,级别有限与构造函数和自定义函数
非静态修饰的变量:A、成员变量 B、局部变量
成员变量随对象存放的地址一样,因为它属于类的一部分,其地址在堆中
局部变量一般情况下在方法中申明,其存放的地址在栈中
(这里注解一下,所有的非变量名存放的地址在栈中,因为这里是局部变量)
2、从运行的机制出发
在源码被编译器编译成.class字节码文件的时候,一旦类被加载,用了static修饰的块/变量/方法就会马上存放到方法区,与此同时非静态的块/变量/方法,还没有编译,一旦将非静态的变量存放到静态方法里面,程序计数器指示到局部变量的时候就会报错,因为这个时候根本还没有编译到局部变量这一块。