谈到java中的继承。很多小伙伴们太熟悉不过了,但是在这里小编想和大家一起分享一下继承中的工作原理:
首先创建一个动物父类
package com.imooc.blog;
/**
* 首先创建一个Animal父类
* @author daitianle
*
*/
public class Animal {
/*
* 定义其属性
*/
public String name;
public int age;
/*
* 无参构造方法
*/
public Animal(){
System.out.println("这是动物类的无参构造方法哦!");
}
/*
* 定义其方法
*/
public void animalEat(){
System.out.println("动物具有吃的本能!");
}
}
然后创建一个子类Dog类:
package com.imooc.blog;
/**
* 创建一个Dog类,并继承父类Animal
* @author admin
*
*/
public class Dog extends Animal {
//首先在这里什么也不写
}
然后创建一个测试类:
package com.imooc.blog;
/**
* 创建一个测试类
* @author daitianle
*
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
//创建子类对象
Dog dog=new Dog();
}
}
执行程序结果为:这是动物类的无参构造方法哦!
很显然,我们在测试类只创建了子类对象,但是子类里面什么也没有写,为什么会输出“这是动物类的无参构造方法哦!”呢?
当然部分小伙伴会说。因为我们继承了父类啊!那么问题来了,父类里面有两个方法啊,为什么就是执行了一个呢?当然聪明的小伙伴又来了,因为在继承中子类创建对象时,默认先执行父类的无参构造方法啊!然后再执行子类的构造方法。很对
那么小编今天遇到一个错误就是这样的,在父类中只有一个有参的构造方法,这时我在创建子类对象时会发现报错了!!!
如下:
package com.imooc.blog;
/**
* 首先创建一个Animal父类
* @author daitianle
*
*/
public class Animal {
/*
* 定义其属性
*/
public String name;
public int age;
/*
* 无参构造方法
*/
public Animal(String name,int age){
this.name=name;
this.age=age;
System.out.println("我是动物类,我叫:"+name+","+"我的今年"+age+"岁!");
}
/*
* 定义其方法
*/
public void animalEat(){
System.out.println("动物具有吃的本能!");
}
}
此时,Dog类便会报错,提示父类没有默认的无参构造方法,
package com.imooc.blog;
/**
* 创建一个Dog类,并继承父类Animal
* @author admin
*
*/
public class Dog extends Animal {
//首先在这里什么也不写
public Dog(){
}
}
然后小伙伴们第一想法就是在,父类里面加一个无参的构造方法就完事了。说得非常好,但是小编想说的是另外一种方法:
继承关系中子类中的方法必须调用父类的构造方法。如果父类中只有一个有参的构造方法,在子类的构造方法必须调用,而且是子类的构造方法第一句话必须是调用父类的有参构造方法,否则编译器会提示错误的。如果父类中有无参的构造方法,没有写的话,会自动调用的,也就不会报错
如下:
package com.imooc.blog;
/**
* 创建一个Dog类,并继承父类Animal
* @author admin
*
*/
public class Dog extends Animal {
//首先在这里什么也不写
public Dog(){
super("汪星人",88);
}
}
这样便也不会报错,当然要注意super此时必须写在方法第一行的位置!!!