static修饰成员变量与修饰成员方法的用法

static修饰成员变量

成员变量分类

类的成员变量按照有无static修饰分为两种:类变量和实例变量(对象的变量)

  • 类变量:有static修饰,属于类,在计算机中只有一份,会被类的全部对象共享
  • 实例变量:无static修饰,属于每个对象,每个实例化对象互不影响
/*
    作者:絮纸为花
*/
public class Student{
    //类变量,所有实例化对象都用这一个
    static String name;
    //实例变量,每个实例化对象都有自己的,互不影响
    int age;
}
  • 类名.类变量(使用这种调用方式,可以明显知道这个变量是类变量,因为实例变量只能用:对象.实例变量,来访问。实例方法同样。)
  • 对象.类变量(易混淆)

成员变量的执行原理

栈,堆,方法区,我们将内存看为这三份。

在执行main函数时,写好的类会被放在方法区执行,包含main函数这个类也会放在方法区执行,我们写好的这个类中的变量也一同在方法区,

如果有类变量则这个类变量会被放在堆区。

接下来执行main函数主体,我们创建的实例化对象会被放在栈区执行。

修改类变量

如果我们通过实例化对象来改变类变量,顺序是,

栈(实例化对象)->堆(有,但是实例化不能找到)->方法区(实例化对象报告在方法区的上级,上级有类变量在堆区的地址,找到,并修改)

如果通过类名来修改,则直接从方法区开始。

修改实例变量

栈(实例化对象)->堆(有,直接修改)

应用场景

某个数据只要一份,可共享,访问,修改,使用类变量

每个实例化对象都要有,使用实例变量。

static修饰成员方法

同样的,跟static修饰成员变量几乎一样。

不一样的就是类方法并不会放在堆区,而是和类一起放在方法区,方法区嘛,顾名思义,存放方法的内存分区。

故而通过实例对象来访问类方法的时候只用到方法区就可以找到。

细心一点就可以发现main方法也是类方法,运行时

java  类名——》类名.main来运行

main方法也是可以接受参数的,在cmd,编译后,运行时,java 类名  参数 ,此时这个参数就会传给main,你可以遍历那个String数组来访问你传的参数。

类方法应用场景:作为工具类(提前写好的方法,如某些算法,数据结构)

工具类:提高复用性,节约内存。

如果你写了一个工具类,你要把你的工具类构造器私有化,避免误操作创建对象。

static注意事项

  • 类方法可以直接访问类成员,不可以直接访问实例成员
  • 实例方法中既可以直接访问类成员,也可以直接访问实例成员
  • 实例方法中可以使用this关键字,类方法中不可以使用this关键字

主要思想:类是模版,实例是产品,先有模版后有产品

产品使用模版和自己,而模版不能使用产品,模版只能使用模版自己。

代码块

代码块是类的五大成分之一(成员变量,构造器,方法,代码块,内部类)

代码块分为两种:

静态代码块:

  • 格式:static{ }
  • 特点:类加载时自动执行,由于类只加载一次,故而静态代码块也执行一次
  • 作用:完成类的初始化,官方工具类初始化多用

实例代码块:

  • 格式:static{ }
  • 特点:每次创建对象时,执行实例代码块,并且在构造器前执行
  • 作用:和构造器作用一样,完成类的初始化,

猜你喜欢

转载自blog.csdn.net/weixin_62302176/article/details/132517444