1、static修饰属性:与具体对象无关,是和类相关的内容
(1)static修饰属性,则该属性为静态变量,直接通过类名称来调用,存储在JVM的方法区,该类的所有对象共享此变量。类中的有些属性是类本身所具备的属性,和具体的某个对象无关,该类中的所有对象这个属性值都是相同的。
(2)举例说明
· 对于"日本人"类,有"姓名,年龄,国籍"等属性,而且国籍这个属性是和国家(类)密切相关的,所有该国的人员(对象)国籍值都是相同的。当有一天日本成为中国的一个省,那一个一个改国籍很麻烦。因此,country这种与具体对象无关的属性应当设置为类属性在成员变量前,使用static修饰时,该变量就成为了类属性,和具体对象无关,直接通过类来访问,该类所有对象共享此变量(只要有一个对象改了该属性值,对其他对象都是可见的)。这样直接修改日本人类中的static国籍属性,那所有对象的国籍都会变成"中国人"
(3)静态变量的说明
①static变量只存在于类之中,方法中千万不能定义静态变量!!!!!!!!!!!
②静态属性直接通过类名称来访问(推荐的),没有任何该类对象,这个属性也是存在的。System.out.println(Japanese.country);
③当引用值为null时,使用该引用访问属性或方法就会抛出NPE异常。但是访问static静态变量就不会异常。
④成员变量必须通过对象来访问,静态变量通过类来访问
(4)关于静态变量的存储:静态变量存储在JVM的方法区,所有该类对象共享
当类中有静态变量,则会直接在方法区中记录。当实例化时,会在栈中记录引用,堆中新增对象,栈中不同引用会指向堆中不同对象,但他们都指向方法区中同一个静态变量(不需要每次实例化都新建静态变量,因为他们都一样)
2、static修饰方法:
(1)static修饰方法称为类方法/静态方法,和具体对象无关,通过类名称直接访问
(2)一般工具/公用方法都设置为静态方法,直接通过类名称来访问,不需要产生对象
3、注意
(1)看见static关键字,与对象无关,直接通过类名称访问。static修饰的属性/方法都称为类的静态域,静态域没有该类对象就能访问,通过类名称来访问
(2)在类中,不加static关键字定义的属性或方法称为成员域(必须有对象才能访问)
(3)问题:
①在静态方法中能否访问成员域?在静态方法中访问一个成员变量,成员域必须有对象才能访问(有对象成员域才有意义),静态方法的使用不需要对象,没对象成员域就没意义,所以不对
②在成员域中能否访问静态域?在一个成员方法中访问一个静态变量,有对象成员域就有意义,此时当然可以访问不需要对象就有意义的静态域
③能否使用static修饰一个类?不能,类定义出来是为了产生对象,static若修饰类,没对象也行,则自相矛盾!但是static可以修饰内部类
④能否在静态方法中使用this关键字?不能,this关键字修饰当前对象的属性/方法,是成员域的一部分,没对象的话,静态方法中使用this关键字没有意义
快速了解Java的static关键字
于 2023-04-04 19:01:45 首次发布
static关键字用于修饰属性和方法,使其成为类变量和类方法。静态变量存储在方法区,所有对象共享,可以直接通过类名访问。静态方法与对象无关,通常用于工具或公用功能。在静态方法中不能访问非静态成员,因为静态方法不依赖于对象。
摘要由CSDN通过智能技术生成