Java使用static的方法和类与不使用的区别

一、静态变量与实例变量的区别(对于常量和变量而言):

1. 局部变量:

局部变量是类的方法中的变量;

2. 实例变量:

实例变量也是类中独立于方法之外的变量,不过没有static修饰,也叫 对象变量

3. 类变量(静态变量):

类变量是类中独立于方法之外的变量,用static 修饰,也叫 静态变量

 

package static_study;

/**
 * Created by Taoyongpan on 2017/5/3.
 */
public class Test {
    static String ss ;//类变量、静态变量
    String s;//实例变量
    public static void main(String[] args)
    {
        String is ;//局部变量
    }
}

 4.实例变量与静态变量的区别:

       静态变量也叫类变量,这种变量前加了static修饰符。可以直接用类名调用,也可以用对象调用,而且所

 

扫描二维码关注公众号,回复: 407136 查看本文章

有对象的同一个类变量 都是共享同一块内存空间。

 

        实例变量也叫对象变量,这种变量没有加static修饰符。只能通过对象调用, 而且所有对象的同一个实例

 

变量是共享不同的内存空间的。

 

       静态变量是所有对象共有的,某一个对象将它的值改变了,其他对象再去获取它的值,得到的是改变后

 

的值;

       实例变量则是每一个对象私有的,某一个对象将它的值改变了,不影响其他对象取值的结果,其他对象

 

仍会得到实例变量一开始就被赋予的值。

package static_study;

/**
 * Created by Taoyongpan on 2017/5/3.
 */
public class Test02 {
    static int a = 0;
    int b = 0;
}

class test03{
    public static void main(String[] args){
        Test02 t1 = new Test02();
        Test02 t2 = new Test02();
        t1.a = 2;
        t1.b = 3;
        System.out.println(t2.a);//输出结果是2,静态变量是针对所有对象的,所以a1改变a,a2的a也改变
        System.out.println(t2.b);//输出结果是0,实例只改变自身的,所以a1对象的b改变,不影响对象a2的b变量
    }
}

        解释(一) :  在创建实例对象的时候,内存中会为每一个实例对象的每一个非静态成员变量开辟一段内

 

存空间,用来存储这个对象所有的非静态成员变量值。即使两个不同的实例对象是属于同一个类,它们的同

 

名非静态成员变量在内存中占用的空间是不同的。 

 

       静态成员变量有所不同。所有的实例对象都共用一个静态变量,内存中只有同一处空间存放这个静态变

 

量值的。因此,如果一个对象把静态变量值改了,另外一个对象再取静态变量值就是改过之后的值了。

     

      解释(二):类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态

 

变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命

 

周期。

       

       而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于

 

堆区中,其生命周期取决于实例的生命周期。

 

二、静态方法和非静态方法的区别(对于方法而言):

● 生命周期(Lifecycle):

     静态方法(Static Method)与静态成员变量一样,属于类本身,在类装载的时候被装载到内存(Memory),不自动进行销毁,会一直存在于内存中,直到JVM关闭。

     非静态方法(Non-Static Method)又叫实例化方法,属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。 

 

● 在内存中存储位置

     静态方法和静态变量创建后始终使用同一块内存,是连续的。

     非静态方法会存在于内存的多个地方,是离散的。

● 效率

      静态方法的使用效率比非静态方法的效率高。

● 线程安全

     静态方法是共享代码段,静态变量是共享数据段。既然是“共享”就有并发(Concurrence)的问题。

非静态方法是针对确定的一个对象的,所以不会存在线程安全的问题。

● 使用范围

     静态方法:⒈ 有静态属性的类,一般会定义静态方法。⒉ 没有属性的类,一般会定义静态方法。⒊ 如果一个方法与他所在类的实例对象无关,那么它就应该是静态的。静态方法可以被继承但是不能被覆盖

●  总计

     如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。如果从线程安全、性能、兼容性上来看,选用实例化方法为宜。

三、静态工厂和构造器(对于类而言):

 

.主要优点:

①静态工厂方法与构造器不同的第一大优势在于,他们有名称。

②静态工厂方法与构造器不同的第二大优势在于,不必每次调用他们的时候都创建一个新对象。

③静态工厂方法与构造器不同的第三大优势在于,他们可以返回类型的任何子类型的对象。

④静态工厂方法与构造器不同的第四大优势在于,在创建参数化类型实例的 时候,他们使代码变得更加简洁。

 

.主要缺点:

①类如果不含共有的或者受保护的构造器,就不能被子类化;

②他们与 其他的静态方法实际上没有任何区别。 

 

猜你喜欢

转载自taoyongpan.iteye.com/blog/2372414