错题回顾:
1.运行如下代码:
class COne {
public void f() {
System.out.println("COne.f");
}
}
class CTwo extends COne{
public void f() {
System.out.println("CTwo.f");
}
}
class CThree {
public void g(COne one) {
System.out.println("g(Cone)");
one.f();
}
public void g(CTwo two) {
System.out.println("g(Ctwo)");
two.f();
}
}
public class Main {
public static void main(String[] args) {
COne one = new CTwo();
CThree three = new CThree();
three.g(one);
}
}
我选的是D,正确答案为A,首先分析一下题,定义了一个COne类,定义了一个CTwo类继承COne类并且重写了COne类中的f方法,定义了一个CThree类,里面有重载的方法g,带不同类型的参数,测试类运用的多态,因为多态遵循编译看左边,运行看右边,编译与父类一致,运行和子类一致,所以在测试类中对象调用g带参数(one)的方法,会先进入方法g(COne one)输出,并且优先输出子类重写的方法,如果子类没有重写方法再找父类的方法,所以选A
2.下面各选项可以在A的子类中使用的是
class A {
protected int method (int a, int b) {
return 0;
}
}
A. public int method (int a, int b) { return 0; }
B. private int method(int a, int b) { return 0; }
C. private int method(int a, long b) { return 0; }
D. public short method(int a, int b) { return 0; }
源于对知识点掌握的不够,我选的是错误的B。解析:子类重写方法的访问权限必须大于等于父类,所以排除BC,又因为子类的返回值类型不能大于父类的返回值类型,所以排除D,选A。
3.下列代码执行的结果是:
class Base{
void test() {
System.out.println("Base.test()");
}
}
public class Child extends Base {
void test() {
System.out.println("Child.test()");
}
public static void main(String[] a) {
Child anObj = new Child();
Base baseObj = anObj;
baseObj.test();
}
}
这里也是运用了多态,只不过这里将多态实例化部分分开写的,迷惑了,所以我选错了,正确答案为D,也是编译看左边,运行看右边,输出子类重写的方法。
4.请看如下代码
class Person {
private int a;
public int change(int m){return m;}
}
public class Teacher extends Person{
public int b;
public static void main(String arg[]){
Person p = new Person();
Teacher t = new Teacher();
int i;
// point x
}
}
我选的是A,是错误的,因为i在静态方法内只能调用静态的变量。静态方法可以调用静态方法和静态变量,那静态方法可以调用非静态方法和非静态变量吗?我们浅测一下,发现静态方法可以通过实例化对象的方法调用到非静态方法和非静态变量。
5.Person类和Test类的代码如下所示,则代码中的错误语句是
public class Person {
public String name;
public Person(String name) {
this.name = name;
}
}
public class Test {
public static void main(String[] args) {
final Person person = new Person("欧欧");
person.name = "美美";
person = new Person("亚亚");
}
}
答案选C,因为Person实例化对象后被final修饰,已知被final关键字修饰的变量或者方法其他的都不能被修改,有人会说,B里面person不也是被final修饰了吗,为什么不会报错呢?因为这里是person.name,是对person下的变量进行重新赋值,所以可以修改,但是如果把name也final修饰,那么person.name重新赋值就会报错;C选项person已经被final修饰了,所以不能继续给它重新赋值了,所以这题选C.