先看下面的程序:class Person {
public Person () { func(); }
public void func() { System.out.println("1, "); }
}public class Person_A extends Person {
public Person_A(){super();}
public Person_A(int a){System.out.println(a);}
public void func(){System.out.println("2,");}
public static void main(String[] args) {
Person_A pa = new Person_A();
Person_A pb = new Person_A(3); }}
运行结果:2,
2,
3请问为什么会是这样的结果???我的理解是:先调用父类的缺省构造方法,但是父类的构造方法中有个func()方法,这个方法到底调用父类的,还是调用子类的???根据结果来看,是调用子类中的func(),但是不知道为什么会是这样?
public Person () { func(); }
public void func() { System.out.println("1, "); }
}public class Person_A extends Person {
public Person_A(){super();}
public Person_A(int a){System.out.println(a);}
public void func(){System.out.println("2,");}
public static void main(String[] args) {
Person_A pa = new Person_A();
Person_A pb = new Person_A(3); }}
运行结果:2,
2,
3请问为什么会是这样的结果???我的理解是:先调用父类的缺省构造方法,但是父类的构造方法中有个func()方法,这个方法到底调用父类的,还是调用子类的???根据结果来看,是调用子类中的func(),但是不知道为什么会是这样?
解决方案 »
- 急需权限管理系统,jsp做的
- [javascript求助] event的cancelBubble属性问题
- 关与JTree的个问题!请高手帮忙!先谢谢了哈。
- 数据报表问题
- 用HttpURLConnection做了一个下载程序如何获得下载速度呀比如 每秒/多少K 小弟求各位高手帮帮忙80分相送!
- 如何读取dbf文件中已被删除的数据?(100分了)
- createImage(width,heigth)方法出现空指针异常。
- 谁有Java编写的聊天室,能发一贴给小弟学习一下!!先谢谢了!!
- 关于applet访问数据库的问题
- 急需各位帮忙???送上100分!!!
- 结构转换
- 编译.java文件,出现“找不到符号”的错误
Person p1 = new Person_A();
Person p2 = new Person();
p1.func();
p2.func();
调用Person_A构造,创建子类的对象无论有参无参都会调父类的无参构造,执行func() 方法,这时this还在子类Person_A 中,又因为func()把父类的func()方法覆盖了所以这时候调用的是子类中的func()执行为2
Person_A pb = new Person_A(3);
调用Person_A(3)调用子类中 public Person_A(int a)
上面说了创建子类的对象无论有参无参都会调父类的无参构造,所以打2,之后调Person_A(int a)打出3
记得直接打出对象的时候就会打用
包@Object.父类.子类...........
首先会调用超类的默认构造函数,结果是打印了 2执行:Person_A pb = new Person_A(3);
首先会调用超类的默认构造函数,结果是打印了第二个 2
然后会调用 Person_A.func(2),结果是打印出 3所以,结果是:
2
2
3
创建事例时首先去父类中找符合条件的构造方法,有符合的就执行
然后继续在子类里找符合条件的构造方法,有符合的就执行Person_A pa=new Person_A();
那么先找父类的构造方法,这是一个无参的构造方法,父类里有,那么执行
func()
而子类又覆盖了这个方法,那么执行子类的func(),输出2然后在子类里找构造方法,也有,那么也执行
super()
执行的是父类的构造方法,那么再输出一个2Person_A pb=new Person_A(3);
父类里没有int参数的构造方法
那么找子类,有,执行
输出3
一时手快,写错了
然后又创建一个Person_A 对象,不过此时的构造方法是含有参数3的,还是调用父类的无参数构造方法,打印输出2又由于System.out.println(a)故打印输出3