黑马程序员技术交流社区

标题: 关于抽象类对象调用该类的构造函数的问题!!! [打印本页]

作者: 虎牛龙马    时间: 2014-9-17 21:21
标题: 关于抽象类对象调用该类的构造函数的问题!!!
abstract class Employee
{
        private String name;
        private String id;
        private int age;

        Employee(String name,String id,int age)
        {
                this.name = name;
                this.id = id;
                this.age = age;
        }

        public abstract void work();
}

class Manager extends Employee
{
        private int bonus;
        Manager(String name,String id,int age,int bonus)
        {
                super(name,id,age);
                this.bonus = bonus;
        }

        public void work()
        {
                System.out.println("manager work!");
        }
}

class Staff extends Employee
{
        Staff(String name,String id,int age)
        {
                super(name,id,age);
        }

        public void work()
        {
                System.out.println("staff work");
        }
}
抽象类是没有实力对象的,所以应该不能调用自己的构造函数才对!但是在Employee类的子类Manager和Staff中的构造函数都掉用到了父类构造函数!!
编译和运行都没有出错!这到底是怎么回事?哪位大侠知道????


作者: Fightin黑马    时间: 2014-9-17 22:11
抽象类没有自己的实例对象,里面的构造函数的作用就是让子类来调用的,即使你在子类没有去显示的调用,java也会自动的给你加上一个super
作者: 奋发吧小白    时间: 2014-9-17 22:12
本帖最后由 奋发吧小白 于 2014-9-17 22:14 编辑

你理解的有问题!首先子类如果全部实现抽象类的 抽象方法,是可以创建实例的!对于构造函数基本和抽象类没多大关系,子类的构造函数中只要没有this语句, 都会默认的访问父类的构造函数的空参数的构造函数,若是没有空参数的,这时就需要子类使用uper语句指定要访问父类的哪一个构造函数;首先你要清楚为什么子类在构造实例时要访问父类的构造函数,因为子类继承了父类的数据,需要只要这些数据是如何初始化的,所以要访问父类的构造函数。你上面说的两个子类已经把父类的抽象方法都实现了,编译和运行必须是正确的,若是不正确才见鬼了呢!
作者: 虎牛龙马    时间: 2014-9-18 13:23
奋发吧小白 发表于 2014-9-17 22:12
你理解的有问题!首先子类如果全部实现抽象类的 抽象方法,是可以创建实例的!对于构造函数基本和抽象类没 ...

受教了,谢谢~
作者: 虎牛龙马    时间: 2014-9-18 13:25
Fightin黑马 发表于 2014-9-17 22:11
抽象类没有自己的实例对象,里面的构造函数的作用就是让子类来调用的,即使你在子类没有去显示的调用,java也 ...

谢谢回答~!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2