向上转型问题(100分)

  • 主题发起人 主题发起人 wanderhouse
  • 开始时间 开始时间
W

wanderhouse

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我写了几个类,实现某一接口,声明了接口数组,实行向上转型,编译报错,请问是否不能将类向上转型到接口?代码如下:
Interface为接口。A1,A2,A3为其派生类。
class Mainclass{
public static void main(String[] args){
Interface[] dd = new Interface[3];
dd[1] = new A1();

dd[2] = new A2();

dd[3] = new A3();

}
}
编译时报错,请问高手为什么,Thinking in java 讲这样向上转型可以。
开发环境:jdk1.4
 
怎么没人回答,base class 改为class 可以成功,为什么interface不行?
 
>>Interface为接口。A1,A2,A3为其派生类。
用Interface做接口名,容易与关键字interface混淆。
A1,A2,A3是继承A接口的接口,还是实现A接口的类?应该是后者吧?
如: public interface A1 extends A{...}
还是:public class A1 implement A{...}
>>dd[1] = new A1();

应该是从0开始吧。
接口类型变量可以引用任何实现该接口类(包括其派生类)的对象
你这样写试试:
Interface[] dd ={
new A1(),
new A2(),
new A3()};
.....
 
不行,不能解决,这是按照我的写法的编译错误。
java.lang.ClassFormatError: untitled4/Percussion (Code attribute is absent in method that is not abstract or native)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:502)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:250)
at java.net.URLClassLoader.access$100(URLClassLoader.java:54)
at java.net.URLClassLoader$1.run(URLClassLoader.java:193)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:315)
at untitled4.Music5.main(Music5.java:85)
Exception in thread "main"
 
向上转型应该是同一派生层次结构的类才可成立的。
你是怎么向上转型的呢?
 
import java.util.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author not attributable
* @version 1.0
*/
interface Instrument{
int i=5;
void play();
String what();
void adjust();
}
class Wind implements Instrument{
public void play(){
System.out.println("Wind.play()");
}
public String what(){
return "wind";
}
public void adjust(){
}
}
class Percussion implements Instrument{
public void play(){
System.out.println("Percussion.play()");
}
public String what(){
return "Percussion";
}
public void adjust();
}
class Stringed implements Instrument{
public void play(){
System.out.println("Stringed.play()");
}
public String what(){
return "Stringed";
}
public void adjust();
}
class Brass extends Wind{
public void play(){
System.out.println("Brass.play()");
}
public void adjust(){
System.out.println("Brass.adjust()");
}
}
class WoodWind extends Wind{
public void play(){
System.out.println("WoodWind.play()");
}
public String what(){
return "WoodWind";
}
}
public class Music5 {
public Music5(){
}
static void tune(Instrument i){
i.play();
}
static void tuneAll(Instrument[] e){
for (int i = 0 ;i<e.length;i++)
tune(e);
}
public static void main(String[] args){
int i = 0;
Instrument[] orcheetra = new Instrument[5];
orcheetra[i++] = new Wind();
orcheetra[i++] = new Percussion();
orcheetra[i++] = new Stringed();
orcheetra[i++] = new Brass();
orcheetra[i++] = new WoodWind();
tuneAll(orcheetra);
}
}
这是原文件你看有什么错误!
 
还有一个关于inner class 的问题:
public class parce16{
public contents cont(){
return new contents(){
private int i = 11;
public int value(){ return i}
}
}
public static void main(String[] args){
parce16 p = new parce16();
contents c=p.cont();
}
}
这样会不会出错?
 
Instrument
| | |
Wind Percussion Stringed
||
Brass WoodWind
类的层次结构如上(如果用JB可自动生成UML图更好看些),
class Music5中并没有用到转型,只是接口变量对实现该接口类的对象
的引用,执行相应对象的方法,我修改了一下,可以执行正确:
class Percussion implements Instrument{
public void play(){
System.out.println("Percussion.play()");
}
public String what(){
return "Percussion";
}
//public void adjust();
//这里是不是你写错了? 如果直接这样些的话那么Percussion 是抽象类
public void adjust(){};
//改成这样
}
class Stringed implements Instrument{
public void play(){
System.out.println("Stringed.play()");
}
public String what(){
return "Stringed";
}
//public void adjust();这里同上理由
public void adjust(){};
}
执行结果:
Wind.play()
Percussion.play()
Stringed.play()
Brass.play()
WoodWind.play()
 
至于嵌套类的问题,在嵌套类为非静态类情况,
如果你想生成一个类型为嵌套类的对象,就必须使用嵌套类名做限定词引用
这个嵌套类的类型,嵌套类对象是在外层类parce16的环境中生成的。
如果是静态嵌套类(static)就直接 contents c=new content();
你的程序应改为如下:
public class parce16{
public class contents{
private int i = 11;
public int value(){return i;}
public contents cont(){
return new contents(){};
}
}
public static void main(String[] args){
parce16 p = new parce16();
parce16.contents c=p.new contents();
c.cont();
}
}
 
我的意思是,在实现inner class时,将class 名隐藏!
 
我按照你说的该了,第一个问题成功!
 
每人回答我揭帖了
 
后退
顶部