为何使用嵌套成员函数?Java类中非静态方法调用疑问
示例代码
class Nested { int a,b,c; double s,ar; public void getdata() { a = 2; b = 3; c = 4; } public double semiperimeter() //semiperimeter()是area()的嵌套方法 { double t = (a+b+c)/2; return(t); } public void area() { s = semiperimeter(); ar = Math.sqrt(s*(s-a)*(s-b)*(s-c)); } void display() { System.out.println("Area of triangle"+ar); } public static void main() { Nested ob = new Nested(); ob.getdata(); ob.area(); ob.display(); } }
问题1:在上述代码中,为何要在area()方法内部调用semiperimeter()方法?嵌套成员方法有哪些优势?
哈哈,这个问题问到点子上了!咱们先拆解一下:计算三角形面积用的是海伦公式,而海伦公式的第一步必须算出半周长。把半周长的计算单独抽成semiperimeter()方法,再在area()里调用它,核心是为了让代码更模块化、逻辑更清晰。
至于这类类内部方法调用的优势,我整理了几个实用点:
- 代码复用:如果以后类里还有其他方法需要用到半周长计算,直接调用
semiperimeter()就行,不用重复写(a+b+c)/2这段代码,避免冗余。 - 可读性拉满:
area()里写s = semiperimeter(),任何人一看就知道这是在算半周长,比直接把公式怼进去要直观得多,代码逻辑一目了然。 - 维护成本降低:万一哪天半周长的计算逻辑要调整(比如为了避免整数溢出,改成
(double)(a+b+c)/2),只需要修改semiperimeter()这一个地方,不用在所有用到这个公式的地方挨个改,省心太多。 - 职责单一:每个方法只干一件事——
semiperimeter()专门算半周长,area()专门算面积,符合单一职责原则,代码更整洁。
问题2:为何同一类的成员方法内部可直接用方法名调用另一成员方法,无需对象及点运算符?而通常调用非静态方法需用“对象名.方法名()”形式,原因是什么?
这个其实是Java的语法糖在起作用!咱们得先搞清楚非静态方法的本质:非静态方法是属于对象实例的,不是属于类的,所以调用的时候必须依赖一个对象。
那为什么在成员方法内部可以直接调用呢?因为当你调用一个非静态方法的时候,Java会自动给你传递一个隐含的this引用——这个this就是当前调用该方法的对象实例。所以你在area()里写semiperimeter(),其实底层是this.semiperimeter(),只是Java允许你把this省略掉,写起来更简洁。
那为什么在类外部(比如main方法里)必须用对象名.方法名()呢?因为在类外部,你没有当前对象的上下文,Java不知道你要调用哪个对象的方法,所以必须显式指定对象实例,告诉它“我要调用这个对象的方法”。比如main里的ob.area(),就是明确指定调用ob这个对象的area()方法。
举个例子,如果你在类里创建了两个Nested对象ob1和ob2,它们的a、b、c值不同,调用ob1.area()的时候,this就指向ob1,调用semiperimeter()用的是ob1的属性;调用ob2.area()的时候,this指向ob2,用的是ob2的属性——这就是this的作用,只是Java帮你隐式处理了。
内容的提问来源于stack exchange,提问作者Manjeet Singh

