当前位置: 代码迷 >> J2SE >> Java继承有关问题求教
  详细解决方案

Java继承有关问题求教

热度:207   发布时间:2016-04-24 01:38:24.0
Java继承问题求教
关于类继承中的重写,我写了下面一段代码。类MostCommonDiv中的f()方法求的是两个数的最小公倍数。
类SubMostCommonDiv继承自MostCommonDiv,并重写了其f()方法。 程序运行时报错:
Exception in thread "main" java.lang.ClassCastException: chapter4.MostCommonDiv
at chapter4.Exam4_18.main(Exam4_18.java:68)
类转换出错,求高手简答..感激不尽
Java code
package chapter4;class MostCommonDiv{    private int m;    private int n;        public int f(int a, int b){        this.m = a;        this.n = b;                if(m<n){            int temp = 0;            temp = m;            m = n;            n = temp;        }                int start = n;        int div = 0;        for(int i=start; i>0; i--){            if((m%i == 0) && (n%i == 0)){                div = i;                break;            }        }        return div;    }}class SubMostCommonDiv extends MostCommonDiv{        protected static int resultOfSupper = 0;        public int f(int a, int b){        int m = super.f(a, b);        this.resultOfSupper = (a*b)/m;                if(a<b){            int temp = 0;            temp = a;            a = b;            b = temp;        }                int start = a;        int subdiv = 0;        while(start > 0){            if((start%a == 0) && (start%b ==0)){                subdiv = start;                break;            }else{                start ++;            }        }                return subdiv;    }}public class Exam4_18 {    public static void main(String[] args) {        MostCommonDiv test1 = new MostCommonDiv();        SubMostCommonDiv test2 = new SubMostCommonDiv();        int a = 32;        int b = 8;            System.out.println("f function in father:"+test1.f(a, b));        System.out.println("f function in son:"+((SubMostCommonDiv)test1).f(a, b));        System.out.println("add the result of (a*b)/m="+SubMostCommonDiv.resultOfSupper);                System.out.println("f function in son:"+test2.f(a, b));        System.out.println("add the result of (a*b)/m="+test2.resultOfSupper);        }}


------解决方案--------------------
你怎么可以把父类转换成子类呢,要转换也是子类转换成父类的
------解决方案--------------------
Java code
public class Exam4_18 {    public static void main(String[] args) {        MostCommonDiv test1 = new SubMostCommonDiv();        SubMostCommonDiv test2 = new SubMostCommonDiv();        int a = 32;        int b = 8;            System.out.println("f function in father:"+test1.f(a, b));        System.out.println("f function in son:"+((SubMostCommonDiv)test1).f(a, b));        System.out.println("add the result of (a*b)/m="+SubMostCommonDiv.resultOfSupper);                System.out.println("f function in son:"+test2.f(a, b));        System.out.println("add the result of (a*b)/m="+test2.resultOfSupper);        }}
------解决方案--------------------
MostCommonDiv test1 = new MostCommonDiv();
 test1 声明的是父类, 实现的是父类, 这样是不能强转成子类的.

只有多态的方式下,才能向下转型呢. 
比如:
MostCommonDiv test3=new SubMostCommonDiv();
这样可以用(SubMostCommonDiv)test3.

(但多态的情况下,自然调用的方法是子类覆写了的父类方法. 也不需要转型了.
只有调用子类新加的方法,才需要用向下转型后去调用.)
------解决方案--------------------
System.out.println("f function in son:"+((SubMostCommonDiv)test1).f(a, b));

错误很明显,父类对象不能强转成子类的

  相关解决方案