java子父类顺序问题

qq_17015691 2017-11-20 02:23:55

程序及运行结果如图 请问为什么输出结果第二行为什么不是 A print而是 B print
...全文
1037 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
stacksoverflow 2018-07-25
  • 打赏
  • 举报
回复
print()方法被重写了,所以调用重写后的print();
youyouke 2018-01-14
  • 打赏
  • 举报
回复
class A{ public A(){ System.out.println("父类的构造方法"); } static{ System.out.println("父类的静态代码块"); } { System.out.println("父类的普通代码块"); } public int j=printA(); public int printA(){ System.out.println("父类的方法 "); return 1; } } public class B extends A { public B(){ //super(); System.out.println("子类的构造方法"); } static { System.out.println("子类的静态代码块"); } { System.out.println("子类的普通代码块"); } public int k=print(); public int print(){ System.out.println("子类的方法"); return 2; } public static void main(String[] args) { System.out.println("main start"); new B(); } } 执行结果: 父类的静态代码块 子类的静态代码块 main start 父类的普通代码块 父类的方法 父类的构造方法 子类的普通代码块 子类的方法 子类的构造方法 ================================= class A{ public A(){ System.out.println("父类的构造方法"); } static{ System.out.println("父类的静态代码块"); } { System.out.println("父类的普通代码块"); } public int j=print();//因子类的方法覆盖了本父类的方法,故在父类的普通代码块执行后 //本应执行父类的方法确改为子类的方法 public int print(){ System.out.println("父类的方法 "); return 1; } } public class B extends A { public B(){ //super(); System.out.println("子类的构造方法"); } static { System.out.println("子类的静态代码块"); } { System.out.println("子类的普通代码块"); } public int k=print(); public int print(){ System.out.println("子类的方法"); return 2; } public static void main(String[] args) { System.out.println("main start"); new B(); } } 执行结果: 父类的静态代码块 子类的静态代码块 main start 父类的普通代码块 子类的方法 父类的构造方法 子类的普通代码块 子类的方法 子类的构造方法 ======================== class A{ public A(){ System.out.println("父类的构造方法"); } static{ System.out.println("父类的静态代码块"); } { System.out.println("父类的普通代码块"); } public static int j=print(); public static int print(){ System.out.println("父类的静态方法 "); return 1; } } public class B extends A { public B(){ //super(); System.out.println("子类的构造方法"); } static { System.out.println("子类的静态代码块"); } { System.out.println("子类的普通代码块"); } public static int k=print(); public static int print(){ System.out.println("子类的静态方法"); return 2; } public static void main(String[] args) { System.out.println("main start"); new B(); } } 执行结果: 父类的静态代码块 父类的静态方法 子类的静态代码块 子类的静态方法 main start 父类的普通代码块 父类的构造方法 子类的普通代码块 子类的构造方法 =============================== class A{ public A(){ System.out.println("父类的构造方法"); } static{ System.out.println("父类的静态代码块"); } { System.out.println("父类的普通代码块"); } public static int j=print(); public static int print(){ System.out.println("父类的静态方法 "); return 1; } public int m=show(); public int show(){ System.out.println("父类的普通方法"); return 1; } } public class B extends A { public B(){ //super(); System.out.println("子类的构造方法"); } static { System.out.println("子类的静态代码块"); } { System.out.println("子类的普通代码块"); } public static int k=print(); public static int print(){ System.out.println("子类的静态方法"); return 2; } public int n=show(); public int show(){ System.out.println("子类的普通方法"); return 2; } public static void main(String[] args) { System.out.println("main start"); new B(); } } 执行结果: 父类的静态代码块 父类的静态方法 子类的静态代码块 子类的静态方法 main start 父类的普通代码块 子类的普通方法(本应执行父类方法,但因子类重写了父类方法故执行子类的普通方法) 父类的构造方法 子类的普通代码块 子类的普通方法 子类的构造方法
linovce 2018-01-13
  • 打赏
  • 举报
回复
子类父类的调用顺序为先执行父类的代码块、再是弗雷德构造方法然后是子类的代码块、子类的构造方法、子类的方法。所以本应该先执行父类的print方法,但是你的子类重写了父类的方法,所以调用父类代码块的时候默认调用的是子类的方法。
云楼 2018-01-09
  • 打赏
  • 举报
回复
子类继承父类的成员变量,此过程中并没有将父类实例化,也就是不存在父类对象 int j=print(); 相当于 int j=this.print(); 这里this所指向的对象只能是子类B的对象
Lie_lei 2018-01-08
  • 打赏
  • 举报
回复
子类如有重写父类的方法,那默认调用的是子类重写过的方法,可以用super();调用父类的方法。
踏实,简单 2017-12-17
  • 打赏
  • 举报
回复
重写的话,优先调用子类
  • 打赏
  • 举报
回复
你说的print方法设置为静态的结果不一样,是因为静态方法在类加载时就别加载到方法区了,并且只会被加载一次,它在你创建这个类的实例之前
yzy6868 2017-11-21
  • 打赏
  • 举报
回复
子类覆盖了父类的方法 这叫方法的重载
qq_40407534 2017-11-20
  • 打赏
  • 举报
回复
子类的构造器中隐藏了super(); 也就是public B(){ super();//调用了父类构造器啊 ... }
  • 打赏
  • 举报
回复
因为print方法是复用了吧,调用的B的方法。
Clumsy__Cat 2017-11-20
  • 打赏
  • 举报
回复
子类重写了父类的方法当然要用子类的了,如果用父类的,那么子类重写的print方法有什么意义?
繁华终归落尽 2017-11-20
  • 打赏
  • 举报
回复
A中的print()换成this.print()
weixin_37456231 2017-11-20
  • 打赏
  • 举报
回复
静态是类的,不是对象的了,静态在new之前被调用
自由自在_Yu 2017-11-20
  • 打赏
  • 举报
回复
子类重写父类的方法,执行的是子类的方法, 不执行子类的方法的话,你重写这个print()就没有意义了
weixin_37456231 2017-11-20
  • 打赏
  • 举报
回复
可以把B看成this,在调用A里的print方法是,this.print()还是B在调用,它又重写了,所以走的是B的内容
qq_17015691 2017-11-20
  • 打赏
  • 举报
回复
引用 1 楼 weixin_37456231 的回复:
可以把B看成this,在调用A里的print方法是,this.print()还是B在调用,它又重写了,所以走的是B的内容
那为什么 把j k 两个print()都设置为静态, 输出就是 A print B print main start A的构造方法 Test1的构造方法
lcyzc 2017-11-20
  • 打赏
  • 举报
回复
子类重写父类的方法,调用的当然是父类的方法啦

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧