黑马程序员技术交流社区

标题: 抽象的函数一定要在抽象类里面, [打印本页]

作者: 张小贝    时间: 2014-1-8 06:56
标题: 抽象的函数一定要在抽象类里面,
一个抽象类的子类也是一个抽象类可是抽象类又不能创建对象,我晕了abstract class Employee{
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();
}
abstract 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("manger work");
   }
  }
}
abstract 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 Day7{
public static void main(String[] args){
Pro p = new Pro("zhangsan","008",8000.00);
}
不会调了。。。


作者: 松毛    时间: 2014-1-8 08:36
我想你的代码中Employee应该是抽取出来的最终类吧。所以在代码中只有它使用abstract修饰成抽象类。所以该类是不能创建对象的。
而Manager、Employee是它的子类,继承了Employee,所以它们都得实现抽象类Employee中的抽象方法work。它们就可以成为普通类,所以是不需要用abstract修饰(你用abstract修饰了的话,它们就还是抽象类,所以是不能够创建对象的),可以直接创建对象并调用其方法。
  1. abstract class Employee{
  2.         private String name;
  3.         private String id;
  4.         private double pay;
  5.         Employee(String name,String id ,double pay){
  6.                 this.name = name;
  7.                 this.id = id;
  8.                 this.pay = pay;
  9.         }
  10.         public abstract void work();
  11. }

  12. class Manager  extends Employee{   //Manager不需要用abstract修饰,它的内部已经没有抽象方法了。
  13.         private int bonus;
  14.         Manager(String name ,String id ,double pay,int bonus){
  15.                 super(name,id,pay);
  16.                 this.bonus = bonus;
  17.         }
  18.         public void work(){
  19.                 System.out.println("manger work");
  20.    }
  21. }

  22. class Pro extends Employee {  //Pro也不需要用abstract修饰了;
  23.         public Pro(String name,String id, double pay){
  24.                 super(name, id , pay);
  25.         }
  26.         public void work(){
  27.                 System.out.println("pro work");
  28.         }
  29. }

  30. public class Test14{
  31.         public static void main(String[] args){
  32.                 Pro p = new Pro("zhangsan","008",8000.00); //创建对象;
  33.                 p.work();  //调用其方法。
  34.                 Manager man = new Manager("li", "007", 5000, 1000);
  35.                 man.work();
  36.                
  37.         }
  38. }
复制代码




作者: 浮出一个美    时间: 2014-1-8 08:37
子类一般不用再抽象了,直接把父类的方法实现即可。
作者: 贺利英    时间: 2014-1-8 09:23
父类是抽象的即可,因为父类是子类抽取出来的共同的功能,但是功能主体不同,所以父类用抽象的,但是子类就不用再抽象了,因为子类是具体实现这些功能的,即将父类中的函数进行复写,所以,子类不用用抽象了。
作者: 不冬眠的蚂蚁    时间: 2014-1-8 09:45
抽象类是不能创建对象 所以要调用就找他的实现非抽象子类 用子类来声明对象 然后再调用相应方法
作者: daoyua    时间: 2014-1-9 10:20
抽象类没法加建立对象,抽象类的子类,如果没实现所有的方法还是抽象类的话也没法建立对象,所以你可以弄个子类把所有方法实现了




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