日期:2014-05-20  浏览次数:20553 次

Java 继承与重载问题
 public class Blip { 
protected int blipvert(int x) { return 0; } 

class Vert extends Blip { 
// insert code here 
}

在插入// insert code here的地方,
插入protected long blipvert(int x) { return 0; }编译通不过(返回类型不匹配)
插入protected long blipvert(long x) { return 0; }却编译通过,为什么

------解决方案--------------------
你父类当中要求输入int型,返回int型
子类当中
blipvert(int x)这个属于重写,因为输入参数一样
重写的话返回类型要求一样
blipvert(long x)这个属于重载,因为输入参数不一样
重载的话返回类型是可以不一样的。
------解决方案--------------------
重载:
   1. 方法名称要一样;
   2. 参数类型和参数个数要不一样;
   3. 返回值类型可以一样也可以不一样;
   4. 可以有不同的访问修饰符;
   5. 可以抛出不同的异常;
   重载Overloading是一个类中多态性的一种表现。
重写:
   1. 方法名称要一样
   2. 参数列表要一样
   3. 返回类型要一样
   4. 访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
   5. 重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
------解决方案--------------------
protected long blipvert(int x) 属于覆盖了父类的方法,所以返回值类型必须跟父类相同

protected long blipvert(long x)  属于方法重载,跟返回值类型就没关系了,所以第一个编译失败

/*
 这个例子主要讲解的是java方法重载的知识,所谓重载就是方法名相同result()
 但是参数列表不通,比如参数的顺序,类型,个数等 (就是括号里的东西)
 方法重载跟返回值类型和修饰符无关
  
 那么在执行时,你传给方法哪些参数,java虚拟机就会去找对应的方法执行(所以不用担心混乱)
*/
 
public class Sample {
     
    //这个是说,d1小于d2吗?小于返回d1 否则返回d2
    public double result(double d1,double d2)
    {
        return (d1<d2)?d1:d2;
    }
     
    //这个是说,d1大于d2吗?大于返回d1否则返回d2
    public double result(int d1,double d2)
    {
        return (d1>d2)?d1:d2;
    }
    //这个是说,返回一个int类型的 d2减去d1的值 
    public int result(int d1,int d2)
    {
        return d2 - d1;
    }
    //返回int类型的i的值
    private int result(int i)
    {
        return i;
    }


单纯的重载是不需要考虑返回值类型的,换句话说,一样也行,不一样也行

而继承过的子类要是复写父类的方法,返回值类型必须相同