黑马程序员技术交流社区

标题: 请教一个问题!! [打印本页]

作者: 胡宝林    时间: 2012-6-9 13:16
标题: 请教一个问题!!
public class D {
String s;
public D(String s){
  this.s=s;
}
}
class O extends D{
  String s="D";
public static void main(String[] args) {
  O o=new O();
System.out.println(s);
}
}
//编译报错,不知道错在哪里了
作者: 付信榕    时间: 2012-6-9 13:29
public class D {
String s;
public D(String s){
  this.s=s;
}
}
class O extends D{
  String s="D";
public static void main(String[] args) {
  
O o=new O();//此句有问题,O是D的子类,O在new对象时,隐式要调用super()父类的无参构造函数。而父类中只有有参数
                                                                           public D(String s{this.s=s;},而没有无参构造函数了。所以就初始化不成功就报错了。
System.out.println(s);
}
}
解决方法在:public class D {
String s;
public D( ){}//加上此句

public D(String s){
  this.s=s;
}
}

作者: 赵兵锋    时间: 2012-6-9 13:34
1.main方法应该在public class里。
2.System.out.println(s);这是在静态方法里访问非静态变量,会报错
3.父类中有个有参构造方法,子类应该实现自己的有参构造方法,public O(String s){super(s);}
4.系统一般会帮你在你定义的类里建一个无参构造方法,但当你自己写了有参构造方法后,那么无参构造方法就需要你自己写了。
5.同样,父类有无参构造方法,那么子类也应有自己的无参构造方法,并且在方法体中第一句就调用父类的无参构造方法。
作者: 杨天皓    时间: 2012-6-9 13:38
本帖最后由 杨天皓 于 2012-6-9 13:39 编辑

这里面一共两个问题。

首先你父类重写了构造函数,并且是有参数的。在子类new对象的时候,必须覆盖父类的带参构造函数。

第二个问题,你在主函数里面调用了非静态成员。 静态函数只能调用静态成员。
所以你要把String s = "D"  前面加上static
作者: 邓杰    时间: 2012-6-9 13:40
你把你的错误提示发出来啊。

作者: 安路凤    时间: 2012-6-9 13:44
你应该学会看异常按照你的写法 运行的时候会抛错误 Error
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Cannot make a static reference to the non-static field s
不能在静态方法里访问非静态的s
将s改为静态后又抛出另一个Error
Exception in thread "main" java.lang.Error: Unresolved compilation problem:   //未解决的编译问题
Implicit super constructor D() is undefined for default constructor. Must define an explicit constructor //意思就是你没有明确定义继承父类的构造方法
所以子类必须覆写父类的构造函数——因为子类对象在建立的时候需要查看父类是如何对这些数据初始化的
class O extends D {
public O(String s) {
  super(s);
}
static String s="D";

public static void main(String[] args) {
  // TODO Auto-generated method stub
  O o=new O("");
  System.out.println(s);
}
}
这样就正确了






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2