Java面向对象_static修饰符
Posted sunNoI
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java面向对象_static修饰符相关的知识,希望对你有一定的参考价值。
2018-04-29
树欲静而风不止
static修饰符
static修饰符表示静态的,该修饰符可以修饰字段、方法、内部类。使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法。
static修饰符的特点:
1)static修饰的成员(字段/方法),随着所在类的加载而加载。
当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了。
2)优先于对象的存在。
对象是我们手动通过new关键字创建出来的。
3)satic修饰的成员被该类型的所有对象所共享。
根据该类创建出来的任何对象,都可以访问static成员。
分析:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译可以看到)。
4)直接使用类名访问static成员 。
因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。
类成员和实例成员的访问
1)类成员:使用static修饰的成员。
2)实例成员:没有使用static修饰的成员。
3)在static方法中,只能调用static成员。(无法从静态上下文中引用非静态变量)
4)非static方法,可以访问静态成员,也可以访问实例成员。
-----------------------------------------------------------------------------------
类成员只能访问类成员,实例成员只能访问实例成员
-----------------------------------------------------------------------------------
类成员直接属于类,可以通过类来访问static字段和static方法。
实例成员只属于对象,通过对象来访问非static字段和非static方法(对象其实可以访问类成员,但是底层依然使用类名访问的)。
静态与非静态的区别:
(1)
非静态成员变量又称为实例变量。
静态成员变量又称为类变量。
(2)
非静态成员变量,随着对象的创建而存在,随着对象的消失而消失。
静态成员变量,随着类的加载而存在,随着类的消失而消失。
(3)
非静态变量存在于对象堆内存中。
静态变量存在于方法区中。
(4)
非静态变量只能被对象所调用。
静态变量可以被类名调用,也可以被对象调用。
什么时候定义成static的字段和方法:
如果这个一个状态或行为属于整个事物(类),就直接使用static修饰,被所有对象所共享。 在开发中,往往把工具方法使用static修饰。如果不使用static修饰,则这些方法属于该类的对象,我们得先创建对象再调用方法,在开发中工具对象只需要一份即可,可能创建N个对象,此时我们往往把该类设计为单例的,但还是有点麻烦。所以,一般在开发中设计工具方法,为了调用简单,我们使用static修饰。
static成员在JVM中的存储:
代码举例:
1 class Person
2 {
3 String name;//名字
4 int age;//年纪
5
6 static int totalNum = 5;//人类总人数5
7
8 //构造函数
9 Person(String n, int a){
10 name = n;//将n赋给name
11 age = a;//将a赋给age
12 totalNum++;
13 }
14
15 void die(){
16 totalNum--;
17 System.out.println("死亡");
18 }
19
20 //只有人类才有毁灭
21 static void destory(){
22 totalNum = 0;
23 System.out.println("人类毁灭");
24 }
25 }
26
27
28 //演示static修饰符
29 class PersonDemo2
30 {
31
32 public static void main(String[] args)
33 {
34 System.out.println(Person.totalNum);
35 Person p1 = new Person("张三",10);
36 Person p2 = new Person("李四",5);
37 System.out.println(Person.totalNum);//使用类调用对象
38
39 p2.die();//p2死亡
40 System.out.println(Person.totalNum);
41
42 Person.destory();
43 System.out.println(Person.totalNum);
44 }
45 }
输出结果:
以上是关于Java面向对象_static修饰符的主要内容,如果未能解决你的问题,请参考以下文章
Java面向对象(OOP)--static修饰符(static变量static方法代码块和静态代码块创建和初始化对象的过程静态导入)
Java——面向对象进阶(final关键字,static关键字,匿名对象,内部类,包的声明与访问,四种访问修饰符,代码块)