Categories
"Hey! White?" Lesson plans

Static methods and static properties

Not all of the dynamic

we all know,The method is put in the running instance。That is the result of the implementation of the method is based on the instance property came,The property is an example of the current state of change - we call it "dynamic"。

But really all it is dynamic? In fact, not,Some methods give results which will directly and according to your call,并不需要依据实例属性的变化来产生变动——也就是说它是无论如何都会产生确定的结果的我们称这样的方法为静态方法它是静态的

我们来举个栗子看看

这是一个普通的类和方法我们创建不同的 Gun 实例那么 fire() 方法的执行结果也会不同有的子弹打完了有的则没有打完

现在我在这个类里边插入了一个判断两个数字大小的方法这个方法无论实例在什么状态它都会返回确定的结果——哪个数字大就返回哪个和实例的状态——打了多少枪没有关系我们就说这个方法可以设置为静态方法(用 static 前缀标记出来)。As you can see,静态方法的调用不需要实例直接使用点运算符来调用

“一种不依靠实例变量也就不需要对象的行为。”

类型方法

我们使用 static 这个前缀来标记静态方法由于我们调用静态方法并不是从特定的实例中调用而是直接从类里调用我们也说这个方法是在“类”层面执行所以静态方法也就会被叫做“类型方法”。

同样的原因也会导致类型方法不针对特定的实例所以它不能访问到实例属性——类型方法不能访问动态属性它根本不在堆上自然找不到堆上的某个实例里的某个属性了!

所以再一次同样的原因类型方法也是不能调用动态方法的——动态方法在堆上在实例里边啊!

类型属性

我们说了类型方法不能访问动态的属性那自然就会有静态的属性出现啦!当然动态的方法也可以访问静态的属性的——考虑到静态又是类层面的所以它也会被称作“类型属性”。

同样的原因对同类的所有对象共享!

没错!同类下的对象互相通信就靠它呢!我们来举个栗子看看

我们增加了一个监控所有枪发射的子弹数量一共用三个实例开了五枪但 total 都记录了下来——也就是说类型属性对同类的实例来说是全局的它不属于某个对象而是属于这个类下所遇对象的!

实例属性——每个实例一个

类型属性——每个类一个!

静态和继承

如果你细心可能会发现类型属性和类型方法不能够被覆盖!如果你覆盖一个类型方法则会被提示你正在覆盖一个标记未 final 的方法!

So,如果需要能够被覆盖你需要使用 class 前缀而不是 static 来标记类型方法这样它就允许被子类覆盖掉了

Original article written by Gerber drop-off:R0uter's Blog » Static methods and static properties

Reproduced Please keep the source and description link:https://www.logcg.com/archives/1136.html

By R0uter's Blog

The non-declaration,I have written articles are original,Reproduced, please indicate the link on this page and my name。

Leave a Reply

Your email address will not be published. Required fields are marked *