黑马程序员技术交流社区

标题: 大家帮我看看这个例子里的抽象方法有啥用? [打印本页]

作者: 欧阳才志    时间: 2012-4-12 13:34
标题: 大家帮我看看这个例子里的抽象方法有啥用?
/*
功能:
假如我们在开发一个系统时需要对员工进行建模,员工包括三个属性
姓名  工号 及工资  经理也是员工 除了包含员工的属性外,还有一个奖金属性
时间:2012.4.12
*/
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();//父类这里先定义了一个抽象方法
}
class manager extends employee
{
private int bunus;
    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  
{
public static void main(String[] args)
{
  System.out.println("Hello World!");
}
}
问题已经用红字标识出来了。
作者: 邓斌    时间: 2012-4-12 14:01
这段代码看起来时没啥用的。
视频中是用一个列子来讲述抽象类。进一步讲接口。
后面毕老师上课 蓝屏。冒烟。你大概就会慢慢懂了
现在新手。说以看起来定义的接口和类都没什么必要。
等你看到多线程后就知道了。继承与实现。

就像PCI接口一样。
需要一个规则。这个规则来定义。使程序实现与继承他。
作者: 王硕'    时间: 2012-4-12 14:03
有作用:强迫子类去做去些事情,老毕原话。
我定义了一个抽象的方法work,子类想要创建对象,必须复写这个方法,不复写,子类还是个抽象类。
顺说一句话,成员你方法有抽象的,这个类肯定也是个抽象类, employee少了个修饰符abstract
作者: 石好强    时间: 2012-4-12 14:06
因为 work 是工作这个属性,而员工和经理都同时具有这个属性。是不断向上抽取,抽取到最后的一个共性。

但是 工作的内容是 员工和经理,工作内容是不同的,所以不写内容,等到哪个对象继承的时候,才会去复写具体的工作内容。

这个 抽象出来的 work 父类只不过是一种共性的体现,在一个体系里是必要的,只有存在这样不断抽取出来的共性,一个体系才能建立、


在java中这种体系是很有用的,在查阅API的时候,楼主可以看到,很多都是通过体系最顶层的共性,来了解底层子类的。
作者: 刘占月    时间: 2012-4-12 14:21
你写的这些代码也可以不用抽象类,但毕老师讲这个例子是为了让你可以更好的理解下面的内容。
其实,抽象类比较显著的应用效果就是毕老师讲到得:模版方法设计模式

abstract class GetTime
{
        public final void getTime()
        {
                long start = System.currentTimeMillis();

                runcode();

                long end = System.currentTimeMillis();

                System.out.println("毫秒:"+(end-start));
        }
        public abstract void runcode();

}


class SubTime extends GetTime
{

        public void runcode()
        {
               
                for(int x=0; x<4000; x++)
                {
                        System.out.print(x);
                }
        }
}


class  TemplateDemo
{
        public static void main(String[] args)
        {
               
                SubTime gt = new SubTime();
                gt.getTime();
        }
}
如果换一个运行程序的话,只需要再写一个子类就OK了。通过子类的覆写更好的优化程序,这样就很好的避免了我们去改写源代码.
class SubTime2 extends GetTime
{
       public void runcode(){}
}  
作者: 高铭    时间: 2012-4-12 17:59
java的抽象和接口其实都是为了更好的实现多态。抽象方法只是强迫子类必须实现这个方法而已,你的两个类都要有work方法。我打个比喻:小明(manager类)和他的爸爸(employee类),小明从小明的爸爸那里继承了所有的遗产,包括他爸爸的自行车(work方法),小明不会骑自行车(work方法),但是他的爸爸已经把自行车给他了,又不让他扔了(work方法必须继承,因为是抽象方法),只会骑三轮车(重写的work方法),而且小明也会改造自行车(重写work方法),所以他把自行车改造成了三轮车。还有楼主的employee类必须是抽象的,因为:有抽象方法的类一定是抽象类,抽象类不一定有抽象方法。
作者: 武庆东    时间: 2012-4-12 19:02
抽象类里面定义的抽象方法(其中一种用法)就是用于定义一个现在不实现(无法实现或者不必要实现),但强制子类必须实现的方法。
举个简单的例子:
例如定义一个抽象类   Shape,它有子类Circle和Square。我们为Shape设定一个抽象方法计算面积double   getArea()。
凡是Shape的子类一定要实现这个方法,因此调这个方法就可以获得面积。但是你如果要再父类里实现,显然是不可能的--你还不知道具体是什么形状呢。
作者: 陈坚    时间: 2012-4-12 19:50
不是没有用,抽象类和接口能够使软件达到高内聚低耦合的作用,能够使软件更容易维护




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