我有一个代码而且我无法理解输出为什么" Radial Tire with long"。有人帮我理解这段代码吗?
class Tyre {
public void front() throws RuntimeException {
System.out.println("Tire");
}
public void front(long a) {
System.out.println("Radial Tire with long");
}
}
class TestSolution extends Tyre {
public void front() {
System.out.println("Radial Tire");
}
public void front(int a) throws RuntimeException {
System.out.println("Radial Tire with int");
}
public static void main(String... args) {
Tyre t = new TestSolution();
int a = 10;
t.front(a);
}
}
答案 0 :(得分:4)
front
未在TestSolution
中被重写,重载。
您可以将重载函数视为完全不同的函数,例如具有不同名称的函数。
因此t.front(a)
会调用Tyre
中的a
,long
隐式转换为byte[]
。
答案 1 :(得分:1)
所以如果我们选择定义
重载意味着具有相同名称但具有不同数量或参数顺序的方法。
覆盖意味着具有相同名称且具有相同参数数量的方法以及提及的规则here
因此,在您的情况下front
方法在Tyre
和TestSolution
front()
类的方法Tyre
在类TestSolution
中被覆盖。
如果方法front(long a)
和front(int a)
没有覆盖。
答案 2 :(得分:0)
main
中没有压倒一切。
t
的静态(编译时)类型为Tyre
,因此,由于方法重载决策由实例的编译时类型决定,因此{{1}可供编译器选择的方法是在基类front
中声明的方法:
Tyre
只有后者(public void front()
public void front(long a)
)匹配调用public void front(long a)
的参数,并且该方法不会被子类覆盖。因此显示t.front(a)
。
调用Radial Tire with long
会调用子类的方法 - ((TestSolution)t).front(a);
。
答案 3 :(得分:0)
一般规则:如果我有一个类的变量,我只能访问该类中定义的方法和组件。
唯一的特例是:
在这些情况下,您可以遵循以下规则:
如前所述,方法未被覆盖,因此您无法应用最后一条规则。
答案 4 :(得分:0)
让我们了解overloading和overriding
之间的区别重载:
Java编程语言支持重载方法,Java可以区分具有不同方法签名的方法。这意味着如果类中的方法具有不同的参数列表
,则它们可以具有相同的名称
重写:
具有相同签名(名称,加上其参数的数量和类型)的子类中的实例方法以及作为超类中的实例方法的返回类型将覆盖超类的方法。
Tyre
声明front()
方法,long
作为参数。
TyreSolution
声明front()
方法,int
作为参数。
由于方法签名不同,TyreSolution
重载Tyre
' front()
方法
如果您更改front()
中TyreSolution
的签名以接受long
值作为输入参数而不是int
,则TyreSolution
会覆盖Tyre's
front()
方法。
e.g。 TestSolution
方法的front()
类定义
public void front(long a) throws RuntimeException {
System.out.println("Radial Tire with long in TestSolution");
}
输出:
Radial Tire with long in TestSolution