2016-07-07 31 views
2

我有一个代码,我无法得到为什么输出将是“径向轮胎很长”。有人能帮我理解这个代码吗?它是超载还是超载?

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

这里没有压倒一切的。 – EJP

+3

如果您可以将'@ Override'添加到方法中,而不会导致编译器错误,那么您正在重写该方法。请注意,添加该注释当然是一个好主意。 –

+0

这不是压倒性的:) –

回答

0

main没有压倒一切的发生。

t的静态(编译时间)类型为Tyre,因此,由于方法重载分辨率由实例的编译时类型确定的,可用于编译器的唯一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);将调用子类的方法 - public void front(int a)

+0

谢谢伊兰,但是TestSolution确实包含一个重写的前端(int a),那么为什么它会在超类中定义的呢? – Arzoo

+0

@Arzoo'void front(int a)'不会覆盖基类中的任何方法,因为基类没有这种签名的方法。因此'void front(int a)'不会被覆盖。如果你在基类中有一个'void front(int a)'方法,TestSolution中的'void front(int a)'方法将被执行,因为覆盖。 – Eran

+0

好吧,你是对的我错过了那一分钟的细节,谢谢Eran :-) – Arzoo

4

frontTestSolution中重写,它是重载

您可以将重载的函数视为完全不同的函数,如具有不同名称的函数。

因此,t.front(a)将调用Tyre中的一个,a隐式转换为long

+0

谢谢,但有一件事TestSolution延伸Tire以及那么它不会是一个重写的情况呢? – Arzoo

+0

否。*重写*函数必须具有相同的*签名*。这意味着函数名称和参数类型必须完全匹配。返回类型允许有一些灵活性,但这超出了问题范围。 – Bathsheba

1

因此,如果我们用定义去

重载意味着相同的名字,但有不同数量或参数的顺序方法。

重写意味着方法与相同数量的参数与规则一起提到here

所以你的情况front方法在两个类TyreTestSolution

方法front()Tyre类重写重载同名在类TestSolution

在方法front(long a)front(int a)的情况下不超越。

+0

这让我很清楚。谢谢 ! – Arzoo

0

一般规则:如果我有一个类的变量,我只能访问该类中定义的方法和组件。

唯一特定的情况下是:

  1. 你同时在超类和子类(上位)
  2. 的组件或方法必须超类的变量和的一个目的子类(你的情况)

在这些情况下,您可以遵循以下规则:

  1. ˚F或变量的类型决定哪些组件使用
  2. 的方法的对象的类型不(后期绑定)

在你的情况下,表示没有覆盖的方法之前,所以你不能应用最后一条规则。

0

让我们了解overloadingoverriding

重载之间的区别:

Java编程语言的支持重载方法,和Java可以用不同的方法签名的方法加以区分。这意味着,一个类中的方法可以有相同的名字,如果他们有不同的参数列表

重写:

在子类的实例方法具有相同签名(名称,加上数量和它的参数类型)以及作为超类中的实例方法的返回类型将覆盖超类的方法。

Tyre宣布为front()方法与long作为参数。

TyreSolution宣称为front()方法与int作为参数。

由于该方法的签名是不同的,TyreSolution重载Tyrefront()方法

如果更改的TyreSolutionfront()签名接受long值作为输入参数,而不是int,然后TyreSolution覆盖Tyre'sfront()方法。

例如front()方法TestSolution类定义

public void front(long a) throws RuntimeException { 
    System.out.println("Radial Tire with long in TestSolution"); 
} 

输出:

Radial Tire with long in TestSolution