【码农每日一题】Java 变长参数相关题目

465 阅读3分钟
关注一下嘛,又不让你背锅!

问:Java 中一个方法可以存在多个变长参数吗?

答:一个方法只能有一个可变长参数,且这个可变长参数必须是该方法的最后一个参数,java 不允许存在一个方法具备多个变长参数或者变长参数不是方法的最后位置的情况。

问:找出下面程序存在的问题并只允许修改调用相关代码将其修复好?

  1. public class Demo {

  2.    public void print(String str, Integer... args) {}

  3.    public void print(String str, String... args) {}

  4. }

  5. //调用

  6. Demo demo = new Demo();

  7. demo.print("hello");

  8. demo.print("hello", null);

答:上面代码直接编译报错,因为调用处对于两个方法都能匹配,编译器不知道选哪个,所以报错了,故别让 null 值和空值威胁到变长方法调用,对于上面调用部分来说修改如下即可运行:

  1. Demo demo = new Demo();

  2. String[] strs = null;

  3. demo.print("hello", strs);

问:分别说说下面程序注释行有问题吗,为什么?

  1. class Base {

  2.    void print(String... args) {

  3.        System.out.println("Base print.");

  4.    }

  5. }

  6. class Sub extends Base {

  7.    @Override

  8.    void print(String[] args) {

  9.        System.out.println("Sub print.");

  10.    }

  11. }

  12. Base base = new Sub();

  13. base.print("hello");    //1

  14. Sub sub = new Sub();

  15. sub.print("hello");    //2

答:注释 1 能编译通过且打印为 Sub print.,因为 base 对象把子类对象 sub 做了向上转型,形参列表是由父类决定的,当然能通过。

注释 2 编译报错为传递的参数 String 类型与方法需要的 String[] 类型不匹配,因为这时编译器看到子类覆写了父类的 print 方法,所以会使用子类重新定义的 print 方法,尽管参数列表不匹配也不会再去父类匹配(因为找到了就不再找了),故有了类型不匹配的编译错误。

这段代码要特别注意上面子类重写父类的 print 是成立的,因为父类 Base 的 print 方法的 args 变长参数在编译成字节码后的表现是一个 String 数组类型的形参,而子类重写时正是 String[] 类型,所以自然就是重写而不是重载,故加上 @Override 也没有问题的。

主人,别嫌短,长了你肯定不会看完的,所以这就是码农每日一题的宗旨~

看完分享一波嘛,和你的小伙伴一起讨论才更加有意思~

看个笑话放松一下

今天中午吃饭前去洗手间,刚好看见老板从里面出来,顺口就问:“您吃了么?”

老板嘿嘿一笑,没答。

我猛然意识到自己说错话了。

然后去食堂吃饭,老板也在那排队打饭,为了弥补过失,我勇敢地主动打招呼道:“还没吃啊,还以为您吃过了呢”。

Take each man's censure, but reserve your judgment.

聆听他人之意见,但保留自己之判断。