【发布时间】:2019-10-14 08:23:41
【问题描述】:
我有以下代码:
package testapp;
class Calculation {
public Calculation(){}
public void addition(int x, int y) { }
public void Subtraction(int x, int y) { }
}
class My_Calculation extends Calculation {
public My_Calculation(){}
public void multiplication(int x, int y) { }
}
public class TestApp {
public static void main(String[] args) {
int a = 20, b = 10;
My_Calculation demo = new My_Calculation();
demo.addition(a, b);
demo.Subtraction(a, b);
demo.multiplication(a, b);
System.out.println(demo.getClass().getName());
Calculation d = new Calculation();
d.Subtraction(b, b);
d.addition(b, b);
// no multiplication
System.out.println(d.getClass().getName());
Calculation d2 = new My_Calculation();
d2.Subtraction(b, b);
d2.addition(b, b);
// no multiplication
System.out.println(d2.getClass().getName());
}
}
输出是这样的:
demo = testapp.My_Calculation
d = testapp.Calculation
d2 = testapp.My_Calculation
以下语句是一个声明,将变量名称 d2 引用到对象类型 Calculation:
Calculation d2;
以下语句是调用 My_Calculation 构造函数的初始化。
Calculation d2 = new My_Calculation();
当我运行以下代码时,输出表明 d2 属于 My_Calculation 类类型,但可以访问 Calculation 类 中的方法.
System.out.println(d2.getClass().getName());
输出:testapp.My_Calculation
访问:加法;减法
现在,我的理解告诉我,如果调用 My_Calculation 构造函数,我应该:
1.只能使用乘法,或
2。访问加法、减法和乘法。
但是,我实际上得到了相反的结果:只能访问加法和减法。因此,我认为这是违反直觉的。
有人可以向我解释这里发生的事情,让我对为什么 type: My_Calculation 的对象无法访问其自己的方法,而是访问只有超类方法。
【问题讨论】:
-
设身处地为编译器着想:你需要编译一个方法
foo(Calculation c) { ... }。在这种方法中接受对c.multiplication()的调用是否安全? -
无关:阅读有关 java 命名约定的信息。方法名称总是使用 camelCase(),并且它们应该包含一个动词,例如
multiply()。并且:不要在正常名称中使用 _,它们只会进入 SOME_CONSTANT。
标签: java methods constructor initialization new-operator