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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yan 中级黑马   /  2013-8-4 19:13  /  1762 人查看  /  11 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 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 20:42

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

11 个回复

正序浏览
抽象类定义抽象的方法,目的在于子类继承这个抽象类的时候,就必须要从写这个抽象方法。否则子类也是抽象的。这种是非常有必要的!
回复 使用道具 举报
本帖最后由 丁永志 于 2013-8-5 09:33 编辑
yan 发表于 2013-8-4 20:56
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有 ...

怎么会是摆设。。
回复 使用道具 举报
只说重点。
抽象类中方法存在的意义是从不同类中抽取的具有相同性质,但是却有不同之处的方法。那么就需要这些类继承这个抽象类,覆盖该方法,书写属于自己的方法体。
回复 使用道具 举报
1 抽象类
|-- 抽象,说不清楚的
|-- 抽象方法,是没有方法体的方法,必须abstract修饰
|-- 抽象方法,必须存在于抽象类,类需要抽象修饰

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

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

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
抽象方法是只生命而未实现的方法,所有的抽象方法必须使用abstract关键字声明,包含抽象方法的类也必须使用abstract class声明。
1,抽象类和抽象方法都必须用abstract关键字来修饰
2,抽象类不能被直接实例化,也不能直接用new关键字去产生对象
3,抽象方法只需声明,而不需实现
4,含有抽象方法的类必须被声明为抽象类,抽象类的子类必须覆写所有抽象方法后才能被实例化,否则这个类还是抽象类

抽象类专门用来当作父类,我觉得既然是父类就是子类对逻辑共性的抽取,通过继承它实现多态,后期绑定,可以为将来要实现的东西做好接口,实现重用性。
说到这儿,楼主又要注意接口的特性了

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
我明白什么情况下用,只是不明白,既然子类里面有这个方法,还能覆盖抽象方法,那么抽象方法写在那里就没有意义啊,就相当于摆设
回复 使用道具 举报
我给你背下抽象类的概念吧..  首先抽象类什么特点,  它相当于一个普通的java类, 他具有普通java类的操作功能,同时 他也有一个或者多个抽象方法, 如果子类继承了抽象类 那么抽象方法必须被实现, 然后抽象类是单继承的, 抽象类和抽象方法都是被 abstract所修饰,

abstract 不能和private static final 共存
回复 使用道具 举报
在此定义一个抽象类是对象 Dog和 Cat进行分析后   在这两个对象中出现了相同的功能,但是功能的主体不同,
这时向上抽取了功能的定义 ,所以定义抽象类abstract class Animal
这样就可以对符合此抽象类功能的对象进行调来复用,如果不这样,那么在主函数中会重复对对象中相同功能代码的重写,
如果对象过多,编译相同的代码重复过多,所以向上抽取,定义一个抽象类,这是我个人的理解 希望能帮到你。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
这样考虑,如果需求中要求,dog和cat 必须要体现eat()这个方法,那么如果不在抽象类animal中定义抽象方法eat(),你很可能有意或无意的没有在子类中定义该方法!这样也不会报错。
其实在抽象类animal中定义eat(),就是强制你必须在定义子类的时候体现eat()!因为如果子类中没有实现抽象类中的抽象方法,编译通不过!
回复 使用道具 举报
如果继承一个抽象类,就必须重写抽象类里所有的方法,要不然,你这个类也是一个抽象类,抽象类就好像一个规则,你继承了,就必须重写,
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马