方法重载练习

时间:2016-08-28 09:18:58

标签: java overloading

我在考试中练习了这个练习,但我找不到解决方法。所以我得到了这个:

public class X {
    public int f(A a, int n) {
        n = n + 1;
        return 1;
    }

    public int h(B b, int n) {
        try {
            n = n + 3;
            return f(b,n);
        } catch(Exception e) {
            return n * 4;
        }
    }
}

public class Y extends X {
    public int f(A b, int n) {
        return n + b.i();
    }

    public int f(B b, int n) {
        return 3*n - b.i();
    }
}

public class Z extends Y {
    public int f(B b, int n) {
        return f((A)b,n) + super.f(b,n);
    }
}

public class A {
    public int i() {
        return 7;
    }
}

public class B extends A {
    public int i() {
        return super.i() + 6;
    }
}

static class E extends RuntimeException {
}

我需要弄明白:

new Z().h(new B(), 3)

解决方案是19,但我不明白为什么使用类Y的f方法而不是类Z的f方法。

2 个答案:

答案 0 :(得分:4)

被调用方法的签名是在编译时确定的,而不是运行时。致f的电话在X' h

return f(b,n);

如果您查看X,则可以调用的唯一f就是f(A, int)。它无法访问f(B, int)。因此,它通过调用f(A, int)进行编译。 Y覆盖f(A, int)Z覆盖YZ个实例(包括Y个实例)将使用f(A, int) Y的版本。因此使用f(A, int)' s if($_SERVER['REQUEST_METHOD']=='POST') { $image = $_POST['image']; $name = $_POST['name']; $rId = $_POST['rId']; $path = "uploads/$rId.png"; $sql = "insert into room_info (r_id,url,name) VALUES ('$rId','$path','$name')"; if(mysqli_query($con,$sql)){ file_put_contents($path, base64_decode($image)); echo "Successfully Uploaded"; } mysqli_close($con); } else { echo "Error"; }

答案 1 :(得分:3)

这不简单,但你必须看到类X

f(A a, int n)

为此定义的唯一方法是public class Y extends X { public int f(A b, int n) { return n + b.i(); } } ,它将调用它(或使用此签名覆盖方法)。它是:

public int f(A a, int n)

Z类不会覆盖<?php $latlong[] = [1,2]; $latlong[] = [3,4]; $latlong[] = [5,6]; $latlong[] = [7,8]; $latlong[] = [9,10]; $latlong[] = [11,12]; $latlong[] = [19,110]; $latlong[] = [21,132]; $off = 3; for ($i=0; $i < count($latlong); $i+=$off){ if(count($latlong) - $i <= $off){ $last_element = end($latlong); } print_r( array_slice($latlong, $i,1)); } print_r($last_element); ?>