[code=java] public class test1 {
static class a {
int x = 999;
int y = 999;
{
System.out.println("a--父类非静态方法");
}
static {
System.out.println("a--父类静态方法");
}
public a() {
System.out.println("a--执行a类无参构造方法");
print();
}
public a(int x) {
System.out.println("a--执行父类有参构造方法");
}
public void print() {
System.out.println("a--我是父类的打印方法");
}
}
static class b extends a {
int x = 1;
int y;
{
System.out.println("b--子类非静态方法");
}
static {
System.out.println("b--子类静态方法");
}
public b() {
System.out.println("b--执行b类无参构造方法");
//y = -1;
}
public b(int x) {
System.out.println("b--执行子类有参构造方法");
}
public void print() {
System.out.println("b--在子类中调用父类的super方法");
super.print();
System.out.println("b--我是子类的打印方法");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int x = 0;
new b(x);
//a.print();
}
}
[/code]
[img=http://img.bbs.csdn.net/upload/201702/20/1487586057_405102.jpg][/img]
为什么创建一个有参数的子类对象时,一定要调用到父类的无参数构造方法?
当我把父类的无参数构造方法去掉时,编译器会报错,除了添加父类无参数构造方法解决,好像还可以用super这个解决,怎么解决?
为了保证正确初始化,Java 会自动在子类的构造方法插入对基类构造方法的调用,如果父类没有无参的构造方法,那么就必须显示的使用 super 关键字调用父类的构造方法,并配以适当的参数列表,如 super(xxx)。
print是public的,子类重写了,这是多态的表现。如果你把父类中的改为private会有不同的输出。
public class test1 { static class a { int x = 999; int y = 999; { System.out.println("a--父类非静态方法"); } static { System.out.println("a--父类静态方法"); } // public a() { // System.out.println("a--执行a类无参构造方法"); // print(); // } public a(int x) { System.out.println("a--执行父类有参构造方法"); } public void print() { System.out.println("a--我是父类的打印方法"); } } static class b extends a { int x = 1; int y; { System.out.println("b--子类非静态方法"); } static { System.out.println("b--子类静态方法"); } public b() { System.out.println("b--执行b类无参构造方法"); //y = -1; } public b(int x) { super(1); //不写是默认生成的super(),无参数的 System.out.println("b--执行子类有参构造方法"); } public void print() { System.out.println("b--在子类中调用父类的super方法"); super.print(); System.out.println("b--我是子类的打印方法"); } } public static void main(String[] args) { // TODO Auto-generated method stub int x = 0; // a a1 = new a(x); // a1.print(); System.out.println(); b b1 = new b(x); // a.print(); } }
我现在创建的子类有参对象,然后在子类构造super(1)声明的是调用父类的有参构造,我把父类的无参构造注释了之后,为什么还是会报错
@Z·Lawliet: public b() { b类无参构造方法,也得加一个super(int)},子类构造方法默认调用父类无参构造方法
@创心coder: 我创建的是有参的对象啊,构造方法不是只在创建对象的时候才会被调用吗,子类b的无参构造方法并没有被调用啊
@Z·Lawliet: 报什么错误?上面那个编译就通不过吧
@创心coder: 是 编译没有过
@Z·Lawliet: public b(){super(0);}加一句话。
@创心coder: 我知道 但是这个构造方法都没用到啊 我弄得打印调试语句说明这句话都没加载 函数都没有用到 还是报错吗
@Z·Lawliet: 编译器按照Java语言的规范把源码编译成字节码文件,然后JVM加载这个类,初始化等一系列操作调用它的main方法。所以说编译的时候会检查你的语法是否正确,不是说不用就检查了,编译时能发现的错误,不会拖延到运行时才知道。
@Z·Lawliet: 最好用一个集成开发环境,比如eclipse,发现错误比较及时
@创心coder: 哦哦 谢谢
你好,这个除了增加父类无参构造方法外,可以增加父类的有参数构造方法然后用super(加参数)调用,因为 在子类初始化的时候 子类的无参构造方法都会隐含着一个super()就是调用了父类的构造器。子类必须调用父类其中一个构造器。初始化父类
在a的无参构造方法中的print()为什么会调用子类的print方法
我这个new的是子类的有参对象啊,不会用到子类的无参构造方法吧