1.建立InstanceTest 类,在类中定义方法method(Person e);
在method中:
(1)根据e的类型调用相应类的getInfo()方法。
(2)根据e的类型执行:
如果e为Person类的对象,输出:
“a person”;
如果e为Student类的对象,输出:
“a student”
“a person ”
如果e为Graduate类的对象,输出:
“a graduated student”
“a student”
“a person”
public class InstanceTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
InstanceTest it = new InstanceTest();
it.method(new Graduate());
}
public void method(Person e) {
if(e instanceof Graduate) {
System.out.println("a graduatedstudent");
}
if(e instanceof Student) {
System.out.println("a student");
}
if(e instanceof Person) {
System.out.println("a person");
}
}
}
class Person {
protected String name = "person";
protected int age = 50;
public String getInfo() {
return "Name: " + name + "\n" + "age: " + age;
}
}
class Student extends Person {
protected String school = "pku";
public String getInfo() {
return "Name: " + name + "\nage: " + age + "\nschool: " + school;
}
}
class Graduate extends Student {
public String major = "IT";
public String getInfo() {
return "Name: " + name + "\nage: " + age + "\nschool: " + school + "\nmajor:" + major;
}
}
注意:要先从范围小的开始写起。
2. 练习题:继承成员变量和继承方法的区别
public class FieldMethodTest {
public static void main(String[] args){
Sub s = new Sub();
System.out.println(s.count);
s.display();//
Base b = s;
System.out.println(b == s);
System.out.println(b.count);//
b.display();//
}
}
class Sub extends Base {
int count = 20;
public void display() {
System.out.println(this.count);
}
}
class Base {
int count = 10;
public void display() {
System.out.println(this.count);
}
}
//20
//20
//true
//10
//20
① 若子类重写了父类方法,就意味着子类里定义的方法彻底覆盖了父类里的同名方法。系统将不可能把父类里的方法转移到子类中。
② 对于实例变量则不存在这样的现象,即使子类里定义了与父类完全相同的实例变量,这个实例变量依然不可能覆盖父类中定义的实例变量。
3. 考查多态的笔试题目
public class InterviewTest1 {
public static void main(String[] args) {
Base1 base = new Sub1();
base.add(1, 2, 3);//
Sub1 s = (Sub1)base;
s.add(1,2,3);//
}
}
class Base1 {
public void add(int a, int... arr) {
System.out.println("base1");
}
}
class Sub1 extends Base1 {
public void add(int a, int[] arr) {
System.out.println("sub_1");
}
public void add(int a, int b, int c) {
System.out.println("sub_2");
}
}
//sub_1
//sub_2
1. 父类引用指向子类对象时,执行的是子类重写父类的方法(Sub1中的三参add()方法不是子类重写父类的方法,因为父类中是可变个数形参,而该方法有确定的3个参数)。
2. 当两个构成重载的同名方法中,一个有可变个数形参,另一个是确定个数形参时,优先调用确定个数形参的方法。