java中类的继承问题

class Animal{
String type;
String name;
int age;
int weight;
void eat(){
System.out.println("动物爱吃饭");
}
void breath(){
System.out.println("动物呼吸");
}
void sleep(){
System.out.println("动物在睡觉");
}
}
//Tiger类继承Animal类
class Tiger extends Animal{
String tigerType;
String from;
//Tiger自己的方法
void tigerRun(){
System.out.println("老虎在奔跑");
}
void breath(){
System.out.println("老虎是用肺呼吸的");
}
}
//Fish继承Animal类
class Fish extends Animal{
String fishType;
//Fish自己的方法
void swim(){
System.out.println("鱼在游泳");
}
void breath(){
System.out.println("鱼是用鳃呼吸");
}
}
class Dog extends Animal{

}
public class HumanDemo
{
public static void main(String[] args){
Tiger tiger=new Tiger();
Fish fish=new Fish();
Dog dog=new Dog();
tiger.breath();
fish.breath();
dog.breath();
}
}
这段代码运行结果:

老虎是用肺呼吸的
鱼是用鳃呼吸
动物呼吸

问题:子类对象在实例化时不应该先去调用父类中的无参构造方法么?运行结果不应该是:
动物爱吃饭
动物呼吸
动物爱睡觉
老虎是用肺呼吸的
鱼是用鳃呼吸
动物呼吸

我是新手,问题比较水,请大家帮忙解答

新手没关系哈。都是新手过来的。
这个问题并不是你说的那样的。

因为我们注意到,在此例所写的几个子类里面,并没有显示的构造器(也就是你没有自己写构造器),那么编译的时候,就会为你自动写一个无参数的公有构造器(这个构造器并不是继承于你的直接父类)。因此不存在说实例化的时候会调用父类的构造器。

其次呢,你说的
动物爱吃饭
动物呼吸
动物爱睡觉
这三个的方法我们可以看到,他们也不是构造器,而是普通方法,也就是说必须显示地进行调用,才会执行,如 tiger.eat(); 要有这么一句他才会执行。
而上述代码里,只是分别调用了三个实例的breath()方法,当然不会有eat和sleep啦。

再次,如果你要实现比如tiger.breath();而输出是:
动物在呼吸。
老虎是用肺呼吸的。
这样的话,你在tiger中代码就需要写成:
void breath(){
super.breath();
System.out.println("老虎是用肺呼吸的");
}
super.breath();这句话是指,调用父类的breath()方法。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-07-07

继承类的一般初始化过程:静态变量初始化、按照级别高低的顺序运行父类的构造方法、实例变量初始化、运行继承类的构造方法。

你的父类Animal没有写构造方法,那么就是默认的无参构造方法:

public Animal(){
        
    }

所以你的程序里没有输出任何内容,你可以在Animal添加如下内容在试试:

public Animal(){
        System.out.println("Animal 类 构造方法 执行");
    }

eat()、breath()、sleep()为成员方法,子类可以重写或者使用这些成员方法,但是在调用子类的同名方法时,父类的这些方法并不会执行。


欢迎追问

追问

构造方法是不是前面一定要有 public
构造方法和一般方法区别在哪里
这个程序里面void eat(){};是不是一般方法

追答

不写也可以,会有默认值吧,最好是写一个public,规范

构造最主要的是在创建对象的时候会自动执行,构造方法可以重载,自动执行的时候根据参数类型匹配。

构造方法和成员方法一个明显的区别在于定义的时候 无返回值类型,而且方法名和类名一致。
即public 类名(){}
而成员方法一般要添加返回值类型 void、int、String等等

void eat(){} 有返回值类型 void, 方法名也和类名不一样,所以为一般成员方法。

本回答被提问者采纳
第2个回答  2013-07-07
你也说了子类对象在实例化时先去调用父类中的无参构造方法(而不是成员方法),你的eat,sleep,breathe是成员方法不是构造方法,你可以这样写public Animal{输出一句话},然后new子类的时候这样new:Animal tiger = new Tiger(),此时才会执行父类的构造方法。
第3个回答  2013-07-07
只是构造出了父类的对象,如果你构造方法写了这些System.out.println("动物爱吃饭");
等,就如你所说了;而这里程序运行是对的...
第4个回答  2013-07-07
当父类与子类中方法名一样时,使用的是子类的方法
相似回答