课时13:声明 Static 方法
摘要:本次分享的主题是声明 Static 方法。
Static 关键字可以用于定义方法。 Static 方法的主要特点在于,它可以直接通过类名称在没有实例化对象的情况下进行调用。Static 属性可以在没有实例化对象时通过类名称调用。同样, Static 方法也是如此。 Static 方法与普通方法的区别在于, Static 方法不需要实例化对象即可调用,这一点与 Static 属性相同。
例如,我们现在定义一个 Static 方法。我们需要定义一个方法,因为之前的代码没有进行封装,而封装是必要的。因此,我们现在需要对代码进行封装。
Class Person { // 创建所有同一个国家的类 private string name ; private int age ; private statie string country = "中华民国”; // 国家 public Person(String name,int age) { this.name= name; this.age = age ; } public static void setCountry(String c) { // static方法 this.country=c: } // setter、getter略 public string getInfo() { return "姓名:"+ this.name + "、年龄:"+ this.age +"、国家 } public class JavaDemo { public static void main(String args[]) { Person.setCountry("中华人民共和国" Person per = new Person("张三",10); System.out.println(per.getInfo()); } } }
封装之后,我们在过程中找到 Set 方法。关于 Set 方法中的 Country 参数,我们习惯的写法应该是 String Country ,并将 This . Country 设置为 Country 。但是现在不能这么做,我暂时将参数名改为 C ,后面会解释原因。
这是 Static 方法的一个重要特征。Static 方法可以通过类名称调用。因此可以这样写: Person . SetCountry ,这样 SetCountry 方法就被调用了。现在正常实例化对象并输出结果,结果应该与之前完全相同。
关于这一点, This 关键字稍后再讨论,这里不能添加。刚才只修改了后面的部分,却忘记了修改前面的部分,因此这次不要添加。我们将代码放在这里进行编译和执行,同学们可以观察结果是否一致,结果是一样的。因此我们实际上相当于调用了 Static 方法。
在整个操作过程中,是否与我之前所说的一样,没有实例化对象?完成之后,这个地方可以通过类名直接调用,这就是 Static 方法。但是在这个地方我们需要加以注意。
此时,对于我们的程序而言,方法就有了两种: Static 方法、非 Static 方法。这两种方法在调用上存在限制,Static 方法只允许调用 Static 属性或 Static 方法。
编译一下,这里显示无法从静态上下文中引用非静态变量 Name ,这是不允许的。再看下面, Get info 是 Face Static ?于是我们再次编译,同样出现从静态上下文中引用非静态方法 Get info 的错误。现在我们发现第一个过程成立,这里可能只能调用静态的内容。
第二个过程。非 Static 的方法允许调用 Static 属性或 Static 方法。这一点需要注意,Face Static ,调用一个名为 Set country 的方法,随便传入一个值xxx。于是我们将代码放在这里,再次编译并执行。是否修改成功?修改是不允许的。
我们需要讨论这个问题,这是语法行为的定义,但我们要思考一下,为什么会有这种定义?最重要的特征是所有 Static 定义的属性和方法都可以在没有实例化对象的情况下使用。而所有非 Static 定义的属性和方法,必须在有实例化对象的情况下才能使用。我们在 Static 中为什么不能使用 This ?什么是当前对象? Static 能在没有实例化对象的情况下访问吗?那么使用 This 是否会产生冲突?
但是反过来,我们在非 Static 中能否使用 This . Country ?因为Country 是 Static ? Static 本来就可以通过对象访问,所以这是它的使用限制。如果现在能够理解这个限制,那么对于之前的方法定义就可以得出新的结论。
最早讲解方法定义时强调过,当前定义的方法都是在主类中定义的,并且由主方法直接调用,方法格式: Public Static Void ,我们跟上 Print 、Out . Print 、在整个代码中跟上 M2D 到3。当时是在主方法中都加上了 Public Static 。现在这个地方是可以直接调用。
然而,我们现在需要解释的是,为什么在这个地方我们必须添加Static ,这是 Static 方法,这是什么非 Static 方法? Static 方法能直接调用非 Static 方法吗?
不能。
如果非要调用,可以在这儿通过对象来调用。因为我们知道只有实例化 Java Demo 为对象之后,才能调用普通方法。于是咱们编译再一次执行,对于这种操作形式,希望大家能够去记住。当然写代码时,是不是还要去考虑这个主位,严格来讲这个主位之中,我们不会写特别多的代码。
所以对于 Static ,我们现在至少对它有一个认识,可以说Static 定义的方法或者是属性都不是在设计代码编写之初所需要考虑的内容中,只有在回避实例化对象调用并且描述公共属性的情况下,才会考虑使用 Static 定义的方法或者是属性。