牛客网中的编程结果题

2019-05-02 22:14:23 五一,放假,躺尸中。。。迷茫!

记录下来,因为这是自己综合网上的答案和个人的感想,不想在某一年的某一个时候需要自己的“这种理解”的时候而找不到,也是方便对比是否有进步!

另外,记录生活的点滴,当某一天你学不动的时候,回首过去,自己已经努力了这么多了,不应该轻易放弃,再坚持,相信一切会好起来的!

package com.nepu;

public class NiuKeWangTest_01 {
	public static void main(String[] args) {
		System.out.println(new B().getValue());
		/**
		 * 首先读者应该清楚的知识是:new B();的作用,new是执行所new类中的构造方法,
		 * super是调用父类的构造方法,有参数则需要传递参数,this是调用当前运行的类
		 * 
		 * 第一步:先是new B(),则执行类B中的构造方法,即super(5),和setValue(getValue()-3);
		 *       (1)super(5),调用父类A中的构造方法,传入的参数是5,
		 *        之后A中的构造方法调用setValue(a),将传入的5给setValue()方法作为参数
		 *        因为B类中重写了A类的setValue()方法,所以执行的是子类B中的setValue()方法,执 
                 *行完成后value=value*2=10;
		 * 
		 *       (2)到此为止,super(5)执行完成,之后是执行B中构造方法的第二条语句。 
                 *setValue(getValue()-3);
		 *          即先是调用getValue()方法,B中没有过重写getValue()方法,所以执行其父类的 
                 *getValue()方法,
		 *          value=value+1,value变成11,保存在临时栈中,之后执行A类中的finally代码, 
                 *this.setValue(value),
		 *          this指的是当前运行类即B类中的setValue()方法,则value变成22并且返回输出22
		 *          接下来getValue()-3=11-3=8,传入B中的setValue()方法中value=2*value=16;
		 * 
		 *到此为止,new B()执行完成,
		 *        接下来是new B().getValue();B类中没有getValue(()方法,所以找其父类中的 
                 *getValue()方法,
		 *        try返回的是16+1=17 保存到临时栈中,然后执行finally中的this.setValue()方法, 
                 *则value=2*value=34;这是打印的第二个值到屏幕上去
		 * 最后,返回主函数,打印返回值17
		 * 
		 * */
	}
	static class A {
		protected int value;

		public A(int a) {
			setValue(a);
		}

		public void setValue(int a) {
			this.value = a;

		}

		public int getValue() {
			try {
				value++;
				return value;

			} catch (Exception e) {
				// TODO: handle exception
			} finally {
				this.setValue(value);
				System.out.print(value);
			}
			return value;

		}
	}
	static class B extends A {

		public B() {
		
			super(5);
			setValue(getValue() - 3);
		}
		public void setValue(int value) {
			super.setValue(2 * value);
		}
	}
}

  

posted @ 2019-05-02 22:15  null-sy  阅读(426)  评论(0编辑  收藏  举报