*判断程序输出是什么
补充知识点: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.关于可变个数形参的说明
- 声明格式:方法名(参数的类型名 …参数名)
- 可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个
- 在一个类里面,方法名字相同,参数类型列表不相同,返回类型可以相同也可以不相同,称为方法重载。可变个数形参的方法与同名的方法之间,彼此构成重载。例如:public static void test(int a ,String…books);和public static void test(int a ,String books);重载
- 可变参数方法的使用与方法参数部分使用数组是一致的
- 方法的参数部分有可变形参,需要放在形参声明的最后
- 在一个方法的形参位置,最多只能声明一个可变个数形参
- 可变个数形参的方法与本类中方法名相同,形参类型也相同的数组之间不构成重载。例如: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)