A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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中的构造函数都掉用到了父类构造函数!!
编译和运行都没有出错!这到底是怎么回事?哪位大侠知道????

4 个回复

倒序浏览
抽象类没有自己的实例对象,里面的构造函数的作用就是让子类来调用的,即使你在子类没有去显示的调用,java也会自动的给你加上一个super
回复 使用道具 举报
本帖最后由 奋发吧小白 于 2014-9-17 22:14 编辑

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

受教了,谢谢~
回复 使用道具 举报
Fightin黑马 发表于 2014-9-17 22:11
抽象类没有自己的实例对象,里面的构造函数的作用就是让子类来调用的,即使你在子类没有去显示的调用,java也 ...

谢谢回答~!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马