java 类方法 static_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修饰符。可以直接用类名调用,也可以用对象调用,而且所

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

实例变量也叫对象变量,这种变量没有加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)的问题。

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

● 使用范围

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

●  总计

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

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

.主要优点:

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

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

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

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

.主要缺点:

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值