黑马程序员技术交流社区

标题: 关于抽象类练习,为什么不能编译通过? [打印本页]

作者: 黑马-王鹏    时间: 2013-3-15 15:31
标题: 关于抽象类练习,为什么不能编译通过?
本帖最后由 黑马-王鹏 于 2013-3-15 15:53 编辑

/*假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方
法进行属性访问。
员工类:name id pay
经理类:继承了员工,并有自己特有的bonus。
*/
  1. [code]class Employee
  2. {
  3. private String name;
  4. private String id;
  5. private double pay;
  6. Employee(String name,String id,double pay)
  7. {
  8. this.name = name;
  9. this.id = id;
  10. this.pay = pay;
  11. }
  12. public abstract void work();//抽象方法
  13. }
  14. class Manager extends Employee
  15. {
  16. private int bonus;
  17. Manager(String name,String id,double pay,int bonus)
  18. {
  19. super(name,id,pay);
  20. this.bonus = bonus;
  21. }
  22. public void work()
  23. {
  24. System.out.println("manager work");
  25. }
  26. }
  27. class Pro extends Employee
  28. {
  29. Pro(String name,String id,double pay)
  30. {
  31. super(name,id,pay);
  32. }
  33. public void work()
  34. {
  35. System.out.println("pro work");
  36. }
  37. }
  38. class AbstractTest
  39. {
  40. public static void main(String[] args)
  41. {
  42. Manager m = new Manager("wp","as",1.10,1);
  43. m.work();
  44. }
  45. }
复制代码
[img]file:///C:/Documents%20and%20Settings/wangpeng/Application%20Data/Tencent/Users/1198571320/QQ/WinTemp/RichOle/A_%7B%7DGZ[13U%60B47@QDGVFC)V.jpg[/img]
为什么编译不能通过?该怎么改代码才可以实现输出预定结果呢?

作者: itserious    时间: 2013-3-15 15:47
package mypack1;
abstract class Employee        //前面加上 abstract 因為你的类中有抽象方法,所以你的类也必须是抽象的。

{
        private String name;

        private String id;

        private double pay;

        Employee(String name, String id, double pay)

        {
                this.name = name;

                this.id = id;

                this.pay = pay;

        }

        public abstract void work();// 抽象方法

}

class Manager extends Employee

{

        private int bonus;

        Manager(String name, String id, double pay, int bonus)

        {

                super(name, id, pay);

                this.bonus = bonus;

        }

        public void work()

        {

                System.out.println("manager work");

        }

}

class Pro extends Employee

{

        Pro(String name, String id, double pay)

        {

                super(name, id, pay);

        }

        public void work()

        {

                System.out.println("pro work");

        }

}

public class AbstractTest //前面加上 public

{

        public static void main(String[] args)

        {

                Manager m = new Manager("wp", "as", 1.10, 1);

                m.work();

        }

}

作者: 何仕映    时间: 2013-3-15 15:47
在你的Employee类中有一个抽象的方法,因此需要在类上面声明。另外经理应该继承的是Pro而不是Employee。具体的请看代码,看了你就明白了
  1. abstract class Employee        //内中有抽象方法,必须要在类上声明。
  2. {
  3.         private String name;
  4.         private String id;
  5.         private double pay;

  6.         Employee(String name,String id,double pay)
  7.         {
  8.                 this.name = name;
  9.                 this.id = id;
  10.                 this.pay = pay;
  11.         }

  12.         public abstract void work();//抽象方法
  13. }

  14. class Manager extends Pro        //经理应该继承的是员工,不是雇员。
  15. {
  16.         private int bonus;

  17.         Manager(String name,String id,double pay,int bonus)
  18.         {
  19.                 super(name,id,pay);
  20.                 this.bonus = bonus;
  21.         }

  22.         public void work()
  23.         {
  24.                 System.out.println("manager work");
  25.         }
  26. }
  27. class Pro extends Employee
  28. {
  29.         Pro(String name,String id,double pay)
  30.         {
  31.                 super(name,id,pay);
  32.         }

  33.         public void work()
  34.         {
  35.                 System.out.println("pro work");
  36.         }
  37. }
  38. class AbstractTest
  39. {
  40.         public static void main(String[] args)
  41.         {
  42.                 Manager m = new Manager("wp","as",1.10,1);
  43.                 m.work();
  44.         }
  45. }
复制代码

作者: HM刘俊    时间: 2013-3-15 15:56
  1. [code]abstract class Employee //这里应该把类定义为抽象类

  2. {

  3. private String name;

  4. private String id;

  5. private double pay;

  6. Employee(String name,String id,double pay)

  7. {

  8. this.name = name;

  9. this.id = id;

  10. this.pay = pay;

  11. }

  12. public abstract void work();//抽象方法

  13. }

  14. class Manager extends Employee

  15. {

  16. private int bonus;

  17. Manager(String name,String id,double pay,int bonus)

  18. {

  19. super(name,id,pay);

  20. this.bonus = bonus;

  21. }

  22. public void work()

  23. {

  24. System.out.println("manager work");

  25. }

  26. }

  27. class Pro extends Employee

  28. {

  29. Pro(String name,String id,double pay)

  30. {

  31. super(name,id,pay);

  32. }

  33. public void work()

  34. {

  35. System.out.println("pro work");

  36. }

  37. }

  38. class AbstractTest

  39. {

  40. public static void main(String[] args)

  41. {

  42. Manager m = new Manager("wp","as",1.10,1);

  43. m.work();

  44. }

复制代码
现在你就可以运行了。因为类中有抽象方法,所以其所在的类必须为抽象类。
作者: 李思杰    时间: 2013-3-15 15:57
因为你在Employee类中有一个抽象方法
  1. public abstract void work();//抽象方法
复制代码
所以要在Employee类前加上abstract,写成abstract class Employee就行了。





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