黑马程序员技术交流社区

标题: 第一个贴错了,抽象类的继承问题 [打印本页]

作者: yan    时间: 2013-8-4 19:13
标题: 第一个贴错了,抽象类的继承问题
本帖最后由 杨兴庭 于 2013-8-5 18:43 编辑

例:
abstract class Animal
{
        
        String name;
        String color;

        public void sleep()
        {
                System.out.println(name+"打呼噜.....");
        }
        public abstract void eat();
        
}
class Dog extends Animal
{
        public void eat()
        {
                System.out.println(name+"骨头.....");
        }
        public void lookHome()
        {
                System.out.println(name+"看家.....");
        }
        
}

class Cat extends Animal
{
        public void eat()
        {
                System.out.println(name+"鱼头.....");
        }
        public void catchMouse()
        {
                System.out.println(name+"抓老鼠.....");
        }
}


class AbstractDemo1
{
        public static void main(String[] args)
        {
                 Cat c = new Cat();

                 c.name="kitty";
                 c.color="花猫";

                 c.eat();
                 c.catchMouse();
                 c.sleep();


                 Dog d = new Dog();
                 d.name="旺财";
                 d.color="黑色";
                 d.eat();
                 d.lookHome();
                 c.sleep();
        }
}

抽象类里的方法子类里面具体化了,
就等于是子类的方法覆盖了抽象类里的方法,那么这个方法应该就相当于子类的个性
抽象类里面为什么抽象类里还要定义这个抽象的方法,
这样不想当于重复了吗?浪费空间,抽象不就是可有可无了吗?一直不能转过这个弯,希望能得到详细的回答
作者: 哪颗最亮的星星    时间: 2013-8-4 19:28
如果继承一个抽象类,就必须重写抽象类里所有的方法,要不然,你这个类也是一个抽象类,抽象类就好像一个规则,你继承了,就必须重写,
作者: taotao    时间: 2013-8-4 19:39
这样考虑,如果需求中要求,dog和cat 必须要体现eat()这个方法,那么如果不在抽象类animal中定义抽象方法eat(),你很可能有意或无意的没有在子类中定义该方法!这样也不会报错。
其实在抽象类animal中定义eat(),就是强制你必须在定义子类的时候体现eat()!因为如果子类中没有实现抽象类中的抽象方法,编译通不过!
作者: 昨夜星风    时间: 2013-8-4 20:21
在此定义一个抽象类是对象 Dog和 Cat进行分析后   在这两个对象中出现了相同的功能,但是功能的主体不同,
这时向上抽取了功能的定义 ,所以定义抽象类abstract class Animal
这样就可以对符合此抽象类功能的对象进行调来复用,如果不这样,那么在主函数中会重复对对象中相同功能代码的重写,
如果对象过多,编译相同的代码重复过多,所以向上抽取,定义一个抽象类,这是我个人的理解 希望能帮到你。

作者: 张云杰    时间: 2013-8-4 20:36
我给你背下抽象类的概念吧..  首先抽象类什么特点,  它相当于一个普通的java类, 他具有普通java类的操作功能,同时 他也有一个或者多个抽象方法, 如果子类继承了抽象类 那么抽象方法必须被实现, 然后抽象类是单继承的, 抽象类和抽象方法都是被 abstract所修饰,

abstract 不能和private static final 共存
作者: yan    时间: 2013-8-4 20:56
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有意义啊,就相当于摆设
作者: 草帽    时间: 2013-8-4 22:19
抽象方法是只生命而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。
1,抽象类和抽象方法都必须用abstract关键字来修饰
2,抽象类不能被直接实例化,也不能直接用new关键字去产生对象
3,抽象方法只需声明,而不需实现
4,含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆写所有抽象方法后才能被实例化,否则这个类还是抽象类

抽象类专门用来当作父类,我觉得既然是父类就是子类对逻辑共性的抽取,通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。
说到这儿,楼主又要注意接口的特性了
作者: xuaner0719    时间: 2013-8-4 22:37
1 抽象类
|-- 抽象,说不清楚的
|-- 抽象方法,是没有方法体的方法,必须abstract修饰
|-- 抽象方法,必须存在于抽象类,类需要抽象修饰

2. 抽象类的特点
|-- 抽象类,不能创建对象,不能实例化,不允许 new
|-- 需要定义子类,继承抽象类,并覆盖抽象类的全部抽象方法,建立子类对象
|-- 如果子类,覆盖一部分抽象方法,子类还是一个抽象类
|-- 抽象类中,可以有静态方法,但是static不能和abstract一起使用
|-- 抽象类有强制性,强制子类,必须重抽象写方法
|-- 抽象类,是这个继承体系中的最共性内容

3. 抽象类和接口的区别  |-- 抽象类需要子类继承后,覆盖全部抽象方法,建立子类对象  |-- 接口,需还子类实现,覆盖全部抽象方法,建立子类对象
  |-- 抽象类中,有普通方法,子类继承后直接使用  |-- 接口中,没有普通方法,全部是抽象的方法,子类必须全部覆盖
  |-- 抽象类中有构造方法,可以给体系中的子类实现成员变量的赋值  |-- 接口中定义的都是全局常量,直接调用使用
  |-- 抽象类是这个继承体系的最共性内容  |-- 接口是这个体系以外的扩展内同
  |-- 一个类只能继承一个类,有局限性  |-- 接口的多实现,避免了单继承的局限性


作者: 王松松    时间: 2013-8-4 23:52
只说重点。
抽象类中方法存在的意义是从不同类中抽取的具有相同性质,但是却有不同之处的方法。那么就需要这些类继承这个抽象类,覆盖该方法,书写属于自己的方法体。
作者: 丁永志    时间: 2013-8-5 09:32
本帖最后由 丁永志 于 2013-8-5 09:33 编辑
yan 发表于 2013-8-4 20:56
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有 ...

怎么会是摆设。。

作者: 心灵之歌    时间: 2013-8-5 10:14
抽象类定义抽象的方法,目的在于子类继承这个抽象类的时候,就必须要从写这个抽象方法。否则子类也是抽象的。这种是非常有必要的!




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