Java基础练习3(重载和重写)
1.(多选题)给定java代码如下所⽰,在1处新增下列()⽅法,是对show()⽅法的重载public class Test{
public void show(int x, int y, int z) { }
//1
}
A.public int show(int x,int y,float z){return 0;}
B.public int show(int x,int y,int z){return 0;}
C.public void show(int x,int z){}
D.public viod show(int z,int y,int x){}
答案:AC
解析:本题考查⽅法的重载规则
⽅法的重载必须满⾜⽅法名相同和参数不同(类型或个数)
选项AC满⾜重载的条件,正确
选项BD参数都与定义的⽅法参数相同,不是重载。
2.(单选题)类A、B和C的定义如下:
public class A {
public void f() {
System.out.println("A.f()");
}
}
public class B extends A {
public void f() {
System.out.println("B.f()");
}
}
public class C {
public void g(A a) {
System.out.println("g(A a)");
a.f();
}
public void g(B b) {
System.out.println("g(B b)");
b.f();
}
}
运⾏下列程序:
C c = new C();
A e = new B();
c.g(e);
输出的结果是()
A. g(A a)  A.f()
B. g(A a) B.f()
C. g(B b) A.f()
D. g(B b) B.f()
答案:B
解析:C类中的两个⽅法是重载的⽅法,编译器会在编译时根据签名的不同来绑定调⽤不同的⽅法
A e =new B(); 这句是⼀个向上造型,e是A类的引⽤,但是指向的是B类的对象,⽽重载看的是参数的引⽤类型,重写才是看的对象类型
因为c调⽤的g⽅法参数是A类型的,所以匹配的是g(A a)的⽅法,先输出"g(A a)",然后执⾏a.f();
    A类和B类是⽗⼦类关系,两个f()是重写的⽅法,执⾏哪个⽅法类的⽅法要看具体的对象
⽽e指向的对象是B对象,所以到B类中的f⽅法输出"B.f()"
也就是⼦类继承⽗类时,调⽤的⽅法都是⼦类重写后的⽅法
3.(多选题)请看下列代码
public class Tetromino {
protected int move(int x) {
return 0;
}
}
class T extends Tetromino {
<;插⼊代码>
}
在<;插⼊代码>处填⼊选项中的代码,使T类没有编译错误的是()
A.public int move(int x) { return 0; }
B.private int move(int x) { return 0; }
C.private int move(long x) { return 0; }
D.protected long move(int x) { return 0; }
答案:AC
解析:本题考查⽅法的重写和重载语法。
   注:⽅法的重写要遵循“两同两⼩⼀⼤”规则,“两同”即⽅法名相同,形参列表相同;“两⼩”指的是⼦类⽅法返回值类型应⽐⽗类⽅法返回值类型更⼩或相等;⼦类⽅法声明抛出的异常类应⽐⽗类⽅法声明抛出的异常类更⼩或相等;“⼀⼤”指的是⼦类⽅法的访问权限应⽐⽗类⽅法的访问范围更⼤或相等。
   选项A,符合重写的定义,A选项正确。
   选项B,不符合重写也不符合重载的语法(访问权限为private⼩于⽗类的protected,不满⾜重写;参数列表相同,不满⾜重载),B选项错误。
   选项C,符合重载的语法,⼦类T继承⽗类Tetromino的 protected int move(int x) ⽅法,⽽C选择属于对重写⽅法的重载,所以C选择正确。
   选项D,不符合重写也不符合重载的语法(返回值类型为long,与⽗类的int不同,不满⾜重写;参数列表相同,不满⾜重载),D选项错误
每⽇笔记:
重写和重载有什么区别?重写的两同两⼩⼀⼤规则是什么?
  Overload是重载的意思,Override是覆盖的意思,也就是重写。
  重载Overload表⽰同⼀个类中可以有多个名称相同的⽅法,但这些⽅法的参数列表各不相同(即参数个数或类型不同)。
  重写Override表⽰⼦类中的⽅法可以与⽗类中的某个⽅法的名称和参数完全相同,通过⼦类创建的实例对象调⽤这个⽅法时,将调⽤⼦类中的定义⽅法,这相当于把⽗类中定义的那个完全相同的⽅法给覆盖了,这也是⾯向对象编程的多态性的⼀种表现。
  重写要遵循"两同两⼩⼀⼤"原则:
  两同:1)⽅法名相同 2)参数列表相同
  两⼩: 1)⼦类⽅法的返回值类型⼩于或等于⽗类的
java重写和重载的区别
      1.1)void时必须相等
    1.2)基本类型时必须相等
    1.3)引⽤类型时⼩于或相等:⽗类⼤,⼦类⼩
    2)⼦类抛出的异常⼩于或等于⽗类的
  ⼀⼤:⼦类⽅法的访问权限⼤于或等于⽗类的