java中的static关键字再学习,静态成员内存理解,静态常量应用,静态修饰成员在多态调用中的问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33322074/article/details/86137955

一、static的启用原因

1、假设一个Student类,包含三个属性,姓名,年龄,学校。姓名,年龄不同,但是学校都相同,当实例化这个类时都会对这三个属性赋初值。由于学校都相同,new的次数越多,就会形成了巨大的浪费。

为了杜绝这种浪费,设置了一个共享数据方法,即static关键字。

这就是static的由来,用于共享数据,和方法,减少资源浪费。

也就是说,对象的特有数据用非静态修饰,对象的特有数据用静态static修饰。

静态调用方式和非静态调用方式的区别:

非静态调用成员变量时,只能用对象的引用来调用。

静态的调用成员变量时,不仅可以用对象引用来调用,还可以用类名来调用。

二、static修饰的变量属于共享变量

static修饰的变量,多个对象共享该变量。

三、静态方法的内存理解

1、类进入方法区,首先将静态方法放到静态区,由于静态方法属于类的,类也进入了静态区。当开始运行时,jvm将main方法复制一份到栈内存压栈执行。此时静态变量已经运行,要早于 非静态存在的。

非静态是在new实例化以后才开始运行。才开始存在,而静态在实例化之前就已经存在了。静态变量在内存中只有一份。

四、静态static的注意事项

1、静态中不能调用非静态

因为生命周期不同,即:静态在内存中存在的早,而非静态在内存中存在的晚。如果非静态还未存在,你调用个屁?

同理,非静态可以调用静态。

2、静态内容不能用this/super关键字。

因为:this是本类对象引用,属于后人调用前人,如果没有创建对象,怎么用this,this是创建对象后的事,而静态先于创建对象前。这个的关键问题是:在没有创建对象的情况下用this调用了,这显然是不对的。

即;静态方法先于对象,this,就是对象,当在静态方法中用this时,对象还未创建,报错。

同理super,属于父类对象引用。如下图

3、同一个类中,静态调用静态成员。

静态内存问题很重要,main方法一直都是静态的。

五、静态的调用

1、成员变量什么时候用静态修饰呢?看情况,如果成员变量是共享数据,那么就加static修饰。

2、成员方法什么时候用静态修饰呢?看成员变量而行,若变量都是静态,那么方法也应当是静态,若变量含有非静态,那方法就是非静态的。

总结:如果方法没有调用过非静态成员,将方法定义为静态。

六、静态在多态中的问题

多态:编译看父类,父类有就编译成功,父类没有就编译失败。

运行,对于静态方法,运行父类静态方法。因为:静态属于类,不属于对象。静态和对象无关。用父类应用调用静态方法,必然调用父类静态方法。记住:静态和对象无关。

对于非静态方法,运行子类的重写方法。

对于成员变量,编译运行全是父类。

七、定义静态常量

public static final修饰静态常量。

2、静态常量在接口中的应用

猜你喜欢

转载自blog.csdn.net/qq_33322074/article/details/86137955
今日推荐