关于类继承中的重写,我写了下面一段代码。类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));
错误很明显,父类对象不能强转成子类的