面试题汇总--静态和非静态

Java静态和非静态的区别

这里的静态,指以static关键字修饰的,包括类,方法,块,字段。静态变量和静态方法都属于静态对象

非静态,指没有用static 修饰的。

 静态对象非静态对象
拥有属性是类共同拥有的是类各对象独立拥有的
内存分配内存空间上是固定的空间在各个附属类里面分配
分配顺序先分配静态对象的空间继而再对非静态对象分配空间,也就是初始化顺序是先静态再非静态.

静态有一些特点:

     1.全局唯一,任何一次的修改都是全局性的影响

     2.只加载一次,优先于非静态

     3.使用方式上不依赖于实例对象。直接用 类名.静态方法名  或者  类名.静态变量名就可引用并且直接可以修改其属性值,不用get和set方法。

     4.生命周期属于类级别,从JVM 加载开始到JVM卸载结束。

     5.static final用来修饰成员变量和成员方法,可简单理解为“全局常量”。对于变量,表示一旦给值就不可修改;对于方法,表示不可覆盖。

    6、静态方法和静态变量创建后始终使用同一块内存

    7、静态方法优点是效率高,缺点是不自动进行销毁

 

一、静态变量跟实例变量的区别:

     语法定义上:静态变量前要加static关键字,实例变量不用

     程序运行时:静态变量直接使用  类名.变量名 来引用,实例变量必须创建实例对象后才能使用

     运行表现结果:静态变量是所有对象公有,若有一个对象将其值改变,其他对象得到的为改变后的结果,

                              实例变量属于对象私有,某一个对象将其值改变,不影响其他对象


     1.静态变量:

          由static修饰,在JVM中,静态变量的加载顺序在对象之前,因此静态变量不依附于对象存在,可以在不实例化类的情况下直接使用静态变量。

          静态变量属于类,不属于类中任何一个对象,因此静态变量又叫做类变量,一个类不管创建多少个对象(对象是类的一个实例),静态变量在内存中有且仅有一个。

public class StaticTest { 
    static int a = 13;   //静态变量
    int b = 14;    //实例变量

    public static void main(String[] args) { 
        int c = StaticTest.a; //通过类名.静态变量名
        System.out.println(c);
     }
 }

     2.实例变量:

          必须依附于对象存在,只有实例化类后才可以使用此类中的实例变量。

public class StaticTest {
    static int a = 13;  //静态变量
    int b = 14; //实例变量

    public static void main(String[] args) {
         int d = new StaticTest().b;//实例化类后再使用此类中的实例变量
         System.out.println(d); 
    }


 }

二、静态方法跟实例方法的区别:

      (1)主要区别:

                 静态方法属于类所有,类实例化前(创建对象前)即可通过 类名.方法名 调用

                 实例方法必须通过new出来的对象调用

      (2)访问上:

                 静态方法只能访问类中的静态成员(即静态成员变量和静态方法)

                实例方法可以访问类中的任何成员

      (3)外部调用:

                 静态方法:可以使用  “类名.方法名”  或者  “对象名.方法名”  的方式调用(即可以无需创建对象)

                 实例方法:只能使用  “对象名.方法名”  的方式调用 


     1.静态方法:

          方法用static关键字修饰,静态方法与静态成员变量一样,属于类本身,在类装载的时候被装载到内存,不自动进行销毁,会一直存在于内存中,直到JVM关闭。使用时也是不需要实例化类,能够直接使用。静态方法无法被重写。

public class StaticTest {

    public static void MyStatic(){ 
        System.out.println("这是StaticTest的一个静态方法"); 
    } 

    public static void main(String[] args) { 
        StaticTest.MyStatic(); //直接通过  类名.静态方法名  调用
    } 
} 

          需要注意的是:在静态方法中只能访问类中的静态成员跟静态方法,不能直接访问类中的实例变量跟实例方法,原因是静态方法在JVM中的加载顺序也在对象之前,直接使用实例变量跟实例方法的话,可能实例变量跟实例方法所依附的对象并没有被创建,会导致无法找到所使用的实例变量跟实例方法。
要想使用实例变量跟实例方法可以采用如下方法:在静态方法中创建实例变量和实例方法所在的对象,通过这个对象来使用实例变量跟实例方法。

public class StaticTest { 

    int b = 14; //实例变量

    public void MyMethod(){   //实例方法

        System.out.println("这是StaticTest的一个实例方法"); 
    } 

    public static void MyStatic(){    //静态方法

        StaticTest st = new StaticTest();  //创建实例变量和实例方法所在的对象

        int e = st.b;  //通过新创建的对象来使用实例变量

        st.MyMethod();  //通过新创建的对象来使用实例方法
    } 
}

     2.实例化方法:

          属于实例对象,实例化后才会分配内存,必须通过类的实例来引用。不会常驻内存,当实例对象被JVM 回收之后,也跟着消失。

public class StaticTest { 

    public void MyMethod(){ 

        System.out.println("这是StaticTest的一个实例方法"); 

    } 

    public static void main(String[] args) { 

        new StaticTest().MyMethod();   //通过创建类的实例对象来使用实例方法

    } 

}

 

     3、线程安全上:

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

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

    4、如果静态方法在系统中定义太多,会占用大量的资源,最后造成内存溢出,所以静态方法不能滥用。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值