求指导,方法重写的问题

catinthewater 2013-11-08 10:47:04
做练习的时候有道题目是这样的,
为什么第一题可以编译通过,而第二题不可以呢?
不是说在重写的时候参数返回值都要一致的吗?
不理解。。。求解答。。


代码如下:
第一题:

class Super {
public float getNum(){
return 3.0f;
}
}


public class Sub extends Super{
public double getNum(float d){
return 0.0d;
}
}



第二题:

class Parent {
public int change(){
return 0;
}
}

class Child extends Parent{
public double change(){
return 0;
}
}


...全文
451 20 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
catinthewater 2013-11-15
  • 打赏
  • 举报
回复
引用 19 楼 a15862986217 的回复:
[quote=引用 18 楼 a15862986217 的回复:] 继承重写条件 1.访问权限不能比父类大(比如父类protected,你子类不能为public) 2.重写要确保:返回类型,方法名,参数名要和被重写的方法一致 3.子类抛出的异常不能超过父类相应方法抛出的异常 你第一题里可以编译的原因: 子类:public double getNum(float d){。。。} 父类:public float getNum(){。。。} 编译器识别。 方法名一样,参数不一样 编译器不认为你在子类里重写了父类里面的方法,编译器认为是子类的特有方法。 你第二题里可以不能编译的原因: 子类: public int change(){。。。} 父类:public double change(){{。。。} 方法名一样,参数一样 编译器认为你在子类里重写了父类里面的方法,但是你的返回类型不一致,就报错了。
希望对你有用,哪些写的不好,请多多包涵[/quote] 你的讲解很详细,十分感谢!
南吴小平 2013-11-11
  • 打赏
  • 举报
回复
引用 18 楼 a15862986217 的回复:
继承重写条件 1.访问权限不能比父类大(比如父类protected,你子类不能为public) 2.重写要确保:返回类型,方法名,参数名要和被重写的方法一致 3.子类抛出的异常不能超过父类相应方法抛出的异常 你第一题里可以编译的原因: 子类:public double getNum(float d){。。。} 父类:public float getNum(){。。。} 编译器识别。 方法名一样,参数不一样 编译器不认为你在子类里重写了父类里面的方法,编译器认为是子类的特有方法。 你第二题里可以不能编译的原因: 子类: public int change(){。。。} 父类:public double change(){{。。。} 方法名一样,参数一样 编译器认为你在子类里重写了父类里面的方法,但是你的返回类型不一致,就报错了。
希望对你有用,哪些写的不好,请多多包涵
南吴小平 2013-11-11
  • 打赏
  • 举报
回复
继承重写条件 1.访问权限不能比父类大(比如父类protected,你子类不能为public) 2.重写要确保:返回类型,方法名,参数名要和被重写的方法一致 3.子类抛出的异常不能超过父类相应方法抛出的异常 你第一题里可以编译的原因: 子类:public double getNum(float d){。。。} 父类:public float getNum(){。。。} 编译器识别。 方法名一样,参数不一样 编译器不认为你在子类里重写了父类里面的方法,编译器认为是子类的特有方法。 你第二题里可以不能编译的原因: 子类: public int change(){。。。} 父类:public double change(){{。。。} 方法名一样,参数一样 编译器认为你在子类里重写了父类里面的方法,但是你的返回类型不一致,就报错了。
catinthewater 2013-11-09
  • 打赏
  • 举报
回复
引用 16 楼 zxcvbnm11920 的回复:
[quote=引用 14 楼 huxiweng 的回复:] 我擦,你还是去看下【重写】和【重载】的区别。你还没明白这两个的区别。
看你前面解释挺耐心的,到最后也不行了,崩溃了吧[/quote] 谁让我是新手呢
teemai 2013-11-08
  • 打赏
  • 举报
回复
引用 13 楼 alice_sg 的回复:
[quote=引用 11 楼 huxiweng 的回复:] [quote=引用 10 楼 alice_sg 的回复:] [quote=引用 9 楼 huxiweng 的回复:] [quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote]
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote] 那为什么第一题又可以编译通过呢?[/quote] 第一题参数不同啊!![/quote] 两道题不都是方法重写吗?为什么重写的方法可以允许参数不同[/quote] 我擦,你还是去看下【重写】和【重载】的区别。你还没明白这两个的区别。 简单的你记住重写就是覆盖的意思,你就理解子类覆盖了父类的方法,调用的话就直接调子类的方法。父类的不会调了。 重载是一个方法可以有多种参数,调用的时候根据你的参数不同调用不同的方法。 第一题, new Sub().getNum()//这是调用父类的方法 new Sub().getNum(1.0f)//这是调用子类的方法
catinthewater 2013-11-08
  • 打赏
  • 举报
回复
引用 11 楼 huxiweng 的回复:
[quote=引用 10 楼 alice_sg 的回复:] [quote=引用 9 楼 huxiweng 的回复:] [quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote]
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote] 那为什么第一题又可以编译通过呢?[/quote] 第一题参数不同啊!![/quote] 两道题不都是方法重写吗?为什么重写的方法可以允许参数不同
teemai 2013-11-08
  • 打赏
  • 举报
回复
引用 11 楼 huxiweng 的回复:
[quote=引用 10 楼 alice_sg 的回复:] [quote=引用 9 楼 huxiweng 的回复:] [quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote]
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote] 那为什么第一题又可以编译通过呢?[/quote] 第一题参数不同啊!![/quote] 第一题是重载,参数不一样和返回值没关系!
teemai 2013-11-08
  • 打赏
  • 举报
回复
引用 10 楼 alice_sg 的回复:
[quote=引用 9 楼 huxiweng 的回复:] [quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote]
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote] 那为什么第一题又可以编译通过呢?[/quote] 第一题参数不同啊!!
catinthewater 2013-11-08
  • 打赏
  • 举报
回复
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote]
引用 9 楼 huxiweng 的回复:
[quote=引用 8 楼 alice_sg 的回复:] [quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int[/quote] 那为什么第一题又可以编译通过呢?
teemai 2013-11-08
  • 打赏
  • 举报
回复
引用 8 楼 alice_sg 的回复:
[quote=引用 3 楼 huxiweng 的回复:] 先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。[/quote] 第二题把double改成int
catinthewater 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

方法重写要求,子类和父类的方法名、参数列表、返回值类型都要一样; 方法重载要求,在同一个类中,方法名相同、参数列表、返回值不相同。
catinthewater 2013-11-08
  • 打赏
  • 举报
回复
引用 5 楼 l568646976 的回复:
你的第一题不是重写,是重载。因为父类并没有带参数的getNum(float d)方法。 第二题是重写父类Parent的方法,所以返回值必须相同。 重载与方法返回值无关。
在不同的类中还可以重载?
catinthewater 2013-11-08
  • 打赏
  • 举报
回复
引用 1 楼 fudongrifdr 的回复:
第一题你去掉参数float d?还会编译通过?
可以编译通过啊,只是第二题没有办法编译通过,
快乐的小呆 2013-11-08
  • 打赏
  • 举报
回复
你的第一题不是重写,是重载。因为父类并没有带参数的getNum(float d)方法。 第二题是重写父类Parent的方法,所以返回值必须相同。 重载与方法返回值无关。
tony4geek 2013-11-08
  • 打赏
  • 举报
回复
重写和重载 。你的方法名,参数名都一样返回至不一样。
teemai 2013-11-08
  • 打赏
  • 举报
回复
先搞清楚什么是重写,什么事重载。 子类重写父类的方法,所有东西必须一致。 而重载的话参数类型或者个数要不同 第二题


class Parent {
	public int change(){
		return 0;
	}
}

class Child extends Parent{
	public int change(){
		return 0;
	}
}

MiceRice 2013-11-08
  • 打赏
  • 举报
回复
第一题是:重载(参数不一样),不是重写。 第二题是:重写(参数完全一样),重写不允许改变返回值类型。
末日哥 2013-11-08
  • 打赏
  • 举报
回复
第一题你去掉参数float d?还会编译通过?
骑士的崛起 2013-11-08
  • 打赏
  • 举报
回复
引用 14 楼 huxiweng 的回复:
我擦,你还是去看下【重写】和【重载】的区别。你还没明白这两个的区别。
看你前面解释挺耐心的,到最后也不行了,崩溃了吧
快乐的小呆 2013-11-08
  • 打赏
  • 举报
回复
引用 7 楼 alice_sg 的回复:
[quote=引用 5 楼 l568646976 的回复:] 你的第一题不是重写,是重载。因为父类并没有带参数的getNum(float d)方法。 第二题是重写父类Parent的方法,所以返回值必须相同。 重载与方法返回值无关。
在不同的类中还可以重载?[/quote]只是给你打个比方。其实你第一题的确切的说,子类根本不是重写父类的方法,而是重新写了个方法,和父类没半毛钱关系。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧