A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡宝林 中级黑马   /  2012-6-9 13:16  /  2095 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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);
}
}
//编译报错,不知道错在哪里了

5 个回复

倒序浏览
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;
}
}
回复 使用道具 举报
1.main方法应该在public class里。
2.System.out.println(s);这是在静态方法里访问非静态变量,会报错
3.父类中有个有参构造方法,子类应该实现自己的有参构造方法,public O(String s){super(s);}
4.系统一般会帮你在你定义的类里建一个无参构造方法,但当你自己写了有参构造方法后,那么无参构造方法就需要你自己写了。
5.同样,父类有无参构造方法,那么子类也应有自己的无参构造方法,并且在方法体中第一句就调用父类的无参构造方法。
回复 使用道具 举报
本帖最后由 杨天皓 于 2012-6-9 13:39 编辑

这里面一共两个问题。

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

第二个问题,你在主函数里面调用了非静态成员。 静态函数只能调用静态成员。
所以你要把String s = "D"  前面加上static
回复 使用道具 举报
你把你的错误提示发出来啊。
回复 使用道具 举报
你应该学会看异常按照你的写法 运行的时候会抛错误 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);
}
}
这样就正确了

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马