1,
public Foo(int i){
this.i=i;
}
构造函数没有public
2,
public Bar(int i,int j){
super(i);
this.j=j;
}
同上
3,
System.out.println(f1.value());
输出的是INT不是string要转型

解决方案 »

  1.   

    一楼没一个说对的
    1.父类没有无参的构造方法,所以public Bar(){}会出错
    2.return i+2.0; i是父类的private属性,无法直接访问
    3.f1.value() f1已经上溯成为Foo的实例,无法访问子类的value方法
      

  2.   

    怎么看也找不出第四个了莫非没有使用java.io包但是import了这个warning也算一个?
      

  3.   

    三个错误吧,第一个,你的Foo类没有定义默认的构造函数(如果你的Foo类中没有其它的构造函数,那么编译环境会自动的为Foo添加public Foo(){}构造函数,但是你的Foo定义了public Foo(int i)构造函数,那么编译环境就不会自动的为Foo添加public Foo()构造函数,而你在其子类Bar中的public Bar(){}构造函数首先要调用Foo的public Foo()构造函数,却不存在这个默认的构造函数,所以在编译Bar的时候告诉你:Bar.java:6: 找不到符号
    符号: 构造函数 Foo()
    位置: 类 Foo
    public Bar(){});
    第二个,你的Foo中的i成员变量是private的,这样的成员是不能被子类继承的,而你在子类Bar中却引用了(public double getI(){
    return i+2.0;
    }),这会给你一个编译期的错误;
    第三个,你的Foo类没有定义value()方法,但是你在你的main函数中却引用了这个方法,会引起一个找不到符号的编译器错误。虽然你的f1在构建的时候是用Bar类构建的(Bar中存在value()函数,但是因为你进行了类型转换,转换为了Foo类,所以在引用的时候要按照Foo类的对象规则引用,也就是在转换的时候f1已经把Bar特有的信息抛弃了,而变成一个Foo类实例了)
    至于第四个语法、语义上的错误我没找到,但是如果你把上面的代码存储到一个java文件中(比如叫Bar.java),那么你就需要把Foo类前面的public去掉,因为一个java文件中只能存在一个public class,但是这个我觉得不是一个明确的错误,因为没告诉你是否两段代码存储到一个java源文件中。