关于继承输出的结果: Aufruf1 ,2 ,3,4,5对应输出结果是什么呀?如何理解括号中字母?

关于继承输出的结果: Aufruf1 ,2 ,3,4,5对应输出结果是什么呀?如何理解括号中字母?

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,对于同学描述的这部分“b.f()方法调用d对象为参数,由于D类继承C类,所以在f()方法中接收的参数可以是他的父类.结果为 B.f(c)

c.f()方法为非静态方法,调用子类D,因为B类是静态类且父类是A,所以调用父类A。结果 D.f(A)”是正确的。

c.g()理解的有点偏差,这里this表示当前对象的含义。因为b对象赋值给了a对象,所以当前对象的引用指向的是B对象。所以会调用C类的g方法的B类型的参数。所以最后输出“C.g(B)”

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

好帮手慕酷酷 2020-02-18 19:33:35

同学你好,这里老师以第一个为例,首先在main方法中分别创建4个类的对象,然后通过a对象调用A类的f()方法,并传入d对象为参数,由于D类继承C类,所以在f()方法中接收的参数可以是他的父类。然后在f方法中首先输出 信息 A.f(C),具体如下:

http://img1.sycdn.imooc.com//climg/5e4bc68c09970a2b04010062.jpg

然后由于D类继承C类,参数进行了向上转型,Java中规定,如果调用的方法是静态的他就会调用父类的静态方法。如果调用的方法是非静态的方法,它就会调用子类的对应普通方法。

所以由于f方法为普通方法,所以会调用子类D的f()方法,并将this当前对象传入,也就是A类的对象。所以输出D.f(A),具体如下:

http://img1.sycdn.imooc.com//climg/5e4bc76d09b2569a04000093.jpg

而g方法,是静态方法,方法是静态的他就会调用父类的静态方法,也就是C类中的g()方法。所以输出为C.g(A),具体如下:

http://img1.sycdn.imooc.com//climg/5e4bcb7c09f258e304290168.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 提问者 慕仙7354812 #1
    老师,那接下来的a.f(c)我可不可以这样理解: 通过对象a 调用f()的方法,传入c对象为参数。 但是A本身是一个父类,输出的结果为什么会出现在B子类当中呢?
    2020-02-18 19:48:28
  • 提问者 慕仙7354812 #2
    老师,我又重新想了想,你看对吗,但是最后C.g(B)我没想明白,我想的是C.g(A): Aufruf 3: b赋值给a d赋值给c a.f(c) 赋之后为 b.f(d) b.f()方法调用d对象为参数,由于D类继承C类,所以在f()方法中接收的参数可以是他的父类.结果为 B.f(c) c.f()方法为非静态方法,调用子类D,因为B类是静态类且父类是A,所以调用父类A。结果 D.f(A) c.g()为静态方法,调用父类C,B类是静态类且父类是A,所以调用父类A。结果 C.g(A)
    2020-02-19 02:53:09
好帮手慕酷酷 2020-02-18 14:32:36

同学你好,

1、第一个位置处代码的结果为:

A.f(C)

D.f(A)

C.g(A)

第二个位置处代码的结果为:

A.g()

第三个位置处代码的结果为:

B.f(C)

D.f(A)

C.g(B)

第四个位置处代码的结果为:

B.f(C)

D.f(A)

C.g(B)

第五个位置处代码的结果为:

B.f(C)

D.f(A)

C.g(B)

2、同学所询问的括号中的代码,是指的main方法中括号的内容吗?如果是的话,括号中代表调用方法传入对象。

3、同学的这个问题涉及到之后学习的面向对象、封装、继承等章节的内容,建议同学继续向后学习,才能理解这个代码的含义。具体如下:

http://img1.sycdn.imooc.com//climg/5e4b84f509d690fb12630378.jpg

4、老师将代码粘贴出来,等到同学学习完之后的内容,再来回顾这个代码,会更加利于理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
public class Poly {
    static class A {
        void f(C c) {
            System.out.println("A.f(C)");
            c.f(this);
            c.g(this);
        }
 
        static void g() {
            System.out.println("A.g()");
        }
    }
 
    static class extends A {
        void f(D d) {
            System.out.println("B.f(D)");
            d.f(this);
            ((C) d).g(this);
        }
 
        void f(C c) {
            System.out.println("B.f(C)");
            c.f(this);
            c.g(this);
        }
 
        static void g() {
            System.out.println("B.g()");
        }
    }
 
    static class C {
        void f(A a) {
            System.out.println("C.f(A)");
        }
 
        static void g(A a) {
            System.out.println("C.g(A)");
        }
 
        static void g(B b) {
            System.out.println("C.g(B)");
        }
    }
 
    static class extends C {
        void f(A a) {
            System.out.println("D.f(A)");
        }
 
        void f(B b) {
            System.out.println("D.f (B)");
        }
 
        static void g(A a) {
            System.out.println("D.g(A)");
        }
 
        static void g(B b) {
            System.out.println("D.g(B)");
        }
    }
 
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        C c = new C();
        D d = new D();
        a.f(d);// Aufruf 1
        System.out.println("=======");
        a.g();// Aufruf 2
        System.out.println("=======");
        a = b;
 
        c = d;
        a.f(c); // Aufruf 3
        System.out.println("=======");
        a.f(d); // Aufruf 4
        System.out.println("=======");
        b.f(c);// Aufruf 5
         
    }
}

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 慕仙7354812 #1
    老师我已经学过了,还是不大理解,能不能请你就几个例子简单解释下??
    2020-02-18 17:33:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码