2-7选择题,我的疑问

2-7选择题,我的疑问

我对题目的理解:父类先定义一个多参的bar方法,然后又对这个方法进行单参的方法重载。子类再对这个单参方法进行重写。

A、public void bar(int x){}  //直接调用父类重载的方法。正确

B、private void bar(int x){}  //修饰符权限比父类小,无法调用父类方法。错误

C、public void bar(int x,int y){}  //参数不同,因为不在同一个类,无法重载。错误

D、public Alpha bar(int x){}  //返回值类型不同,方法重写对返回值没有限制,但方法体相同。错误

E、public void bar(String x){return 1}  //参数类型不同,方法体不同,不在同一个类,无法重载。错误

F、public int bar(int x){return x}  //返回值类型不同,参数相同,方法体不同,属于方法重写。正确

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

5回答
heiantus 2018-09-06 00:35:40

重写:方法名 返回类型 参数列表相同

重载:方法名相同 返回类型可以不同 参数列表必须不同

A、public void bar(int x){}  //直接调用父类重载的方法。正确   (并不是调用父类重载,而是在子类方法重写,格式是正确的,所以A正确)

B、private void bar(int x){}  //修饰符权限比父类小,无法调用父类方法。错误(方法重写的时候,访问修饰符需要比被重写方法更广泛,所以错误)

C、public void bar(int x,int y){}  //参数不同,因为不在同一个类,无法重载。错误(这里注意返回值类型 方法名都很好理解,参数列表这里与int...x相对应 int x,int y可以看成是赋值了两次的int...x所以正确  是方法重写)

D、public Alpha bar(int x){}  //返回值类型不同,方法重写对返回值没有限制,但方法体相同。错误(注意这里返回值类型不同,所以肯定不是方法重写,那么判断是否为方法重载,发现并没有和他一样的返回值类型,所以为方法重载,这里错误的原因是没有返回值 需要返回一个Alpha类型的值)

E、public void bar(String x){return 1}  //参数类型不同,方法体不同,不在同一个类,无法重载。错误(首先括号内参数列表不同,肯定不是方法重写,判断是不是方法重载,发现与父类参数列表不同,返回类型相同,所以是正确的,为方法重载)

F、public int bar(int x){return x}  //返回值类型不同,参数相同,方法体不同,属于方法重写。正确(首先 返回值类型不同,所以不是方法重写,再判断是不是方法重载,由于参数列表int型与父类相同,所以肯定就不正确啦)

提问者出错的原因是一直判断答案是不是方法重写 而题目问的是哪些会造成编译错误 所以需要把视野扩大。

慕田峪8152788 2018-09-01 15:47:46
package com.imooc.question;

public class Alpha {
	public void bar(int...x) {
		System.out.println("dad is here with a int ... parameters");
	}
	public void bar(int x) {
		System.out.println("dad is here with a int parameters");
	}
}

以及子类Beta

public class Beta extends Alpha {
	public void bar(int x , int y) {
		System.out.println("son is here with two int parameters");
	}
	public static void main(String [] args) {
		Beta myBeta = new Beta();
		myBeta.bar(1,2);
	}
	
}

首先通过上面的两段代码明确继承关系中,是存在重载这种方法的,虽然老师上课时没有说明

然后下面是我自己做错这道题的小结,希望能帮到你:

这是一道做错了的题:

class Alpha{

   public void bar(int ... x){

   

   }

   

   public void bar(int x){

   

   }

}


public class Beta extends Alpha{

    //write sth

}


multiple choice:


选出下面的3项填入后可以正确编译


A.private void bar(int x){}


错误信息:can not reduce the visibility of the inherited method from Alpha


应使子类的方法访问修饰符规定的权限大于或者至少等于父类的权限



√B.public void bar(int x ,int y){}(正确的重载)



C.public Alpha bar(int x){}(错误的重写)


错误信息:the return type is incompatible with Alpha.bar(int)


应该使子类的重写的方法(overrides)的返回值类型与父类同名方法相同或者返回父类返回值类型的子类型(基本数据类型没有子类型)即此处的Alpha应该改为void(因为在父类的对应方法中返回值类型是void)


√D.public void bar(int x){}(正确的重写,子类自定义的方法)


E.public int bar(int x){return x;}(错误的重写)


错误信息:the return type is incompatible with Alpha.bar(int),系统能识别这是一种overrides的写法,但是不符合规范


应该将子类的返回值类型改为void类型,当然,将父类方法中的返回值类型由void改为int也是可以的,但是在选择题当中仅有选择子类中的方法怎么写的选项,没有对父类的修改的选项


√F.public int bar(String x){return 1;}(重载)


个人的疑惑:

0.这个题目中为什么可以有方法的重载,java中的方法重载不是要求在同一个类中吗?


解答:java中的不仅可以是一个类中的,在子类和父类的继承关系中也有重载的方法


1.重写和重载系统究竟是怎么判断的?


解答:根据参数列表进行判断的,只要参数列表跟父类当中的某一个相同(因为父类中可能对某一个方法进行了重载,有多个同名方法)那么系统就会按照重写的标准去检查,否则(没有一个相同)就会按照重载的标准去检查,值得注意的是,在方法的重写中,子类的方法的访问权限必须大于或者等于父类的访问权限




对于上面的补充知识:

在java中的4中访问权限:

由访问权限由低到高排序:


1.private: Java语言中对访问权限限制的最窄的修饰符,一般称之为“私有的”。被其修饰的属性以及方法只能被该类的对象访问,其子类不能访问,更不能允许跨包访问。


2.default:即不加任何访问修饰符,通常称为“默认访问权限“或者“包访问权限”。该模式下,只允许在同一个包中进行访问。


3.protected: 介于public 和 private 之间的一种访问修饰符,一般称之为“保护访问权限”。被其修饰的属性以及方法只能被类本身的方法及子类访问,即使子类在不同的包中也可以访问。


4.public: Java语言中访问限制最宽的修饰符,一般称之为“公共的”。被其修饰的类、属性以及方法不仅可以跨类访问,而且允许跨包访问。


注意:


参数列表不同(参数顺序,类型,个数)会被判断为重载

否则系统会按照重写的标准去检验方法的合法性(修饰符权限不降级,参数列表中仅有形参名可以不同,其他全部一样)


易错的地方是重载的标准只有一条,就是在方法名相同的情况下看

参数列表是否相同,与返回值类型,修饰符均无关


好帮手慕阿莹 2018-06-11 11:17:29

同学可以试一下,如下所示,如果只是返回值不同,会提示报错。因为它的方法名,参数一致,在调用的时候,程序无法判断你要调用的是父类中的方法还是子类中的方法,所以它不可以做子类自己的方法:

http://img1.sycdn.imooc.com//climg/5b1de7ff00012e6605060149.jpg

http://img1.sycdn.imooc.com//climg/5b1de7f20001af8604460194.jpg

好帮手慕阿莹 2018-06-09 18:29:59

1,首先非常抱歉,第一条public void bar(int x,int y){}是子类中自己的方法,就像你说的,重载只能在本类,而要想重写父类的多参方法,参数,返回值,方法名都需要一致。

父类:

http://img1.sycdn.imooc.com//climg/5b1baa9d0001780b05380235.jpg

子类:

要重写父类的多参方法也是可以的,但方法名,返回值,参数类型,个数,顺序必须一致。

http://img1.sycdn.imooc.com//climg/5b1baabb00013f9205340215.jpg

如果参数不一致,即是子类自己的方法,例如加上重写的注解会报错:

http://img1.sycdn.imooc.com//climg/5b1bab630001ec4006170158.jpg

但是去掉重写的注解就不会报错,是子类自己的方法

http://img1.sycdn.imooc.com//climg/5b1babd50001ef3604970221.jpg

好帮手慕阿莹 2018-06-08 19:06:32

1、public void bar(int x,int y){}这个是正确的,因为父类中 public void bar(int... x){}方法参数可以传多个int类型的参数。所以public void bar(int x,int y){}也是重载了父类中的方法。

2、F、public int bar(int x){return x}  是错误的,返回值不同,并不是重写,重写父类的方法要返回值,方法名,参数全部相同。

3、E、public void bar(String x){return 1}  这个我看到的是:public int bar(String x){return 1} 

参数不同,返回值无所谓,是子类自己的独有的方法,并不是重写的父类的方法。所以public int bar(String x){return 1}是正确的。

4、A、public void bar(int x){}  是父类方法的重写。

同学可以自己写一个父类,再写一个子类继承它,实践出真知。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 KABOKUO #1
    您回复的第一条:1、方法重载不是要在同一个类里吗?子类为什么可以重载父类方法呢?2、父类里单参方法已经重载了上面的多参方法,子类中的方法重写不应该也是以单参方法为标准重写吗?
    2018-06-09 00:32:29
  • 提问者 KABOKUO #2
    public int bar(int x){return x}这条选项因为返回值不同所以不是重写的方法,但是为什么不能看作是子类自己单独的方法呢?
    2018-06-11 10:55:39
  • 好帮手慕雪 回复 提问者 KABOKUO #3
    只通过返回值类型不同是无法构成重载的。
    2018-06-11 11:23:38
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师