关于如何在子类的构造方法中显示调用父类有参的构造方法?

来源:9-7 Java 中的 super 的使用

公子鸢3339632

2016-05-18 18:46

父类:
public class Animal {
	public int age = 20;
	public String name;
	public void eat(){
		System.out.println("动物具有吃东西的能力");
	}
	/*public Animal(){
		System.out.println("Animal类执行了");
	}*/
	public Animal(int age){
		this.age = age;
		System.out.println(age);
	}

}


子类:
public class Dog extends Animal {
	public static int age = 15;
	public void eat(){
		System.out.println("狗具有吃骨头的能力");
	}
	public Dog(){
		super(age);
		System.out.println("dog类执行了");
	}
	public void method(){
		super.eat();
	}
}
我在定义时为什么要在子类的age属性定义前加static?
既然是父类的age 为何我在调用method()时输出的age是15而不是父类的20?


写回答 关注

2回答

  • 旋律秋裤
    2016-05-18 19:43:21
    已采纳

    你子类构造方法中调用的age是Static的age,就是子类的age,首先回答static的问题,static是静态的意思,即未创建实例对象就可以使用被static声明的属性,如果你不加static,在创建Dog类时,1.首先进行父类的默认值初始化,就是age=20,2.然后调用父类构造函数,3.再进行子类默认值初始化,即age=15,4.再调用子类构造函数,在第二步时,发现父类构造方法需要传一个值(super(age);)这时候编译器找age,发现找不到age,因为这时候还没有进行到第三步啊,age没有初始化为15,报错,而将其声明为static,即使不创建对象age都是15,这就不必解释了,所以要加static

    第二个问题,就像之前所说的一样,加了static之后,进行第二步时,将age=15传给父类,修改了父类中的age值,导致父类和子类的age都是15,所以无论怎么输出都是15

    共 2 条回复 >

  • qq_随想之风_03202251
    2016-05-21 10:43:58

    http://img.mukewang.com/573fcb5d00017c9e12300414.jpg可以这样

    慕粉1555...

    你这个都没有用到构造方法,,,他想说的是用构造方法怎么样能得到父类的age

    2016-06-28 19:11:09

    共 1 条回复 >

Java入门第二季 升级版

课程升级!以终为始告别枯燥,在开发和重构中体会Java面向对象编程的奥妙

531184 学习 · 6326 问题

查看课程

相似问题