java多态——面试题

*判断程序输出是什么

 

补充知识点:java中的可变形参

1.JavaSE 5.0 中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。

//JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量

public static void test(int a ,String[] books);

//JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量

public static void test(int a ,String…books);

2.关于可变个数形参的说明

  1. 声明格式:方法名(参数的类型名 …参数名)
  2. 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
  3. 在一个类里面,方法名字相同,参数类型列表不相同,返回类型可以相同也可以不相同,称为方法重载。可变个数形参的方法与同名的方法之间,彼此构成重载。例如:public static void test(int a ,String…books);和public static void test(int a ,String books);重载
  4. 可变参数方法的使用与方法参数部分使用数组是一致的
  5. 方法的参数部分有可变形参,需要放在形参声明的最后
  6. 在一个方法的形参位置,最多只能声明一个可变个数形参
  7. 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。例如:public static void test(int a ,String…books);和public static void test(int a ,String[] books); 不重载,认为他们是一样的参数列表

 

1. 

package com.atguigu.exer;

//考查多态的笔试题目:
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

  • 判断子类Sub1的方法是否是其父类的重写,如果是重写,则base.add(1,2,3)调用的是子类的方法体,否则是调用父类的方法体。

  • 我们认为int... arr和int[] arr在参数列表中是一样的,所以方法名和参数列表都相同,构成重写

2.

package com.atguigu.exer;

//考查多态的笔试题目:
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
  • public void add(int a, int b, int c)与父类的public void add(int a, int... arr)不构成重写,但是public void add(int a, int[] arr)与父类的public void add(int a, int... arr)构成重写

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");
	}

}
  • Sub1 s = (Sub1)base;做了一个向下转型,把base强制转换成Sub1类
  • s.add(1,2,3);输出为:sub_2 。优先调用参数为确定个数的方法,若无public void add(int a, int b, int c),则调用public void add(int a, int[] arr) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值