JAVA基础学习 Day018

本文探讨了Java编程中的多态性概念,详细解释了如何在方法中根据对象类型调用适当的getInfo()方法。同时,文章强调了继承成员变量与继承方法的区别,指出子类重写的方法会覆盖父类的同名方法,而实例变量不会被覆盖。最后,文章通过一道笔试题目阐述了在父类引用指向子类对象时,系统执行的是子类重写父类的方法,以及在方法重载中,确定参数个数的方法优先于可变参数个数的方法被调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. 当两个构成重载的同名方法中,一个有可变个数形参,另一个是确定个数形参时,优先调用确定个数形参的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值