关于继承输出的结果: 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、老师将代码粘贴出来,等到同学学习完之后的内容,再来回顾这个代码,会更加利于理解。

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 B 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 D 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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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