黑马程序员技术交流社区

标题: 还是不明白抽象类的作用。以及abstract修饰符? [打印本页]

作者: 李哲    时间: 2012-3-1 16:43
标题: 还是不明白抽象类的作用。以及abstract修饰符?
难道抽象类,仅仅是不让该类建立对象?
为什么要有abstract修饰符?
为什么不直接删除父类中的abstract方法呢?
作者: 唐兴旺    时间: 2012-3-1 17:23
我个人理解抽象类就如同一个框架,列出一些你想要实现的的功能,但并没有具体的实施过程,就像你计划明天上午购物,下午去公园,晚上再聚会,这就是一个抽象类,只是个框架,到了明天上午具体去哪里购物,中午去公园玩什么,晚上去哪里和谁谁聚会,这都是子类要完成的。所以我理解抽象类就是一个思路的整理,分析好各种需要,再有子类来具体实施各个功能。个人愚见,如有错误请老师指出。
作者: 骆龙    时间: 2012-3-1 17:31
抽象 的意思是将 某些事物的共性 进行抽取,但是这些共性是只有方法(功能)但没有功能内容, 搞1个抽象类 就是要其他类也有此方法时 直接继承抽象类再重写里面的功能内容 而不用再次建立方法的重复性,提高了代码的复用性 至于为什么要 abstract 来修饰 是规定好的修饰符,当 你看到abstract 时你就清楚的知道了 这是一个抽象类 以及它所 有的特性   个人理解,如有错误请纠正
作者: 泮和顺    时间: 2012-3-1 17:36
有抽象方法的必须肯定是抽象类,抽象方法只是方法的声明并没有具体定义,
作者: 张开开    时间: 2012-3-1 17:47
我认为,抽象类就是对好多具有共性的东西抽取出来,在以后需要对具体的东西进行实现时,就可以直接继承抽象类,重写其方法了。它的存在给了大家对某一类事物的一个概念。就向在我们现实生活中一样。“东西”是一个名词,“电脑”“桌子”“书包”等等就是具体的类,因为东西拥有的一些特点,肯定是“电脑”“桌子”“书包”所共有的,比如“形状”“重量”“作用”等等,但是又各不相同,具体实现,要重写“东西”的相关方法。如果说抽象类没有用了,那可以试想,如果生活中少了“东西”这个词,在我们描述不认识的东西,或者不确定的东西时,我们又该用什么词汇呢?因为我个人认为,抽象类就是像“东西”这个一个概念。
作者: liumeng    时间: 2012-3-1 17:59
看看抽象工厂就知道了 还有源码
作者: 冯兵兵    时间: 2012-3-1 18:21
当多个类中出现相同功能,但是功能主体不同,
这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。
让子类去继承这个抽象类,并实现里面的抽象方法。
比如学生对象:Student都有学习的行为,但小学生,初中生,高中生的学习行为都不一样。这是可以将学生类定义为一个抽象类,将study定义为抽象方法,并让小学生,初中生,高中生去继承学生类,并实现其学习方法:
abstract class Student
{
        abstract final void study();
}
抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。

作者: 王杰    时间: 2012-3-1 21:14
抽象就是不确定的意思,使用抽象方法可以增加类的扩展性!
作者: 刘刚洪    时间: 2012-3-1 21:34
abstract 英文的汉语意思就有抽象的含义,当然用它来修饰,这就好比int(只不过缩写了而已)来定义一个方法类型一样。
抽象类里边的抽象方法是所有子类中的共性方法,只不过各个子类执行的方法主体不同,所以父类中不确定执行的文体,才定义为抽象。
--------以上是个人学习总结,有误或不完善之处,恳请指正。
作者: 刘刚洪    时间: 2012-3-1 21:35
abstract 英文的汉语意思就有抽象的含义,当然用它来修饰,这就好比int(只不过缩写了而已)来定义一个方法类型一样。
抽象类里边的抽象方法是所有子类中的共性方法,只不过各个子类执行的方法主体不同,所以父类中不确定执行的文体,才定义为抽象。
--------以上是个人学习总结,有误或不完善之处,恳请指正。
作者: 许圣建    时间: 2012-3-2 02:30
比一般父类再抽象一点就是他了吧,那么也就是说不希望被创建对象的,也就是比较抽象的无意义的类,我们把这类父类加上abstract就好了,这是和private类似的做法。
有的父类有实际意义,可以创建有用的对象,就不抽象了。。。
作者: 李哲    时间: 2012-3-2 08:13
谢谢大家的指教,学到很多{:soso_e100:}。
作者: 黄方    时间: 2012-3-2 19:33
本帖最后由 舞动的心弦 于 2012-3-2 19:36 编辑

额,看了你的问题啦:
1.首先,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。好比,我们都知道三角形是一个形状,世界上有三角形这样具体的东西,但是确没有形状这样具体的东西,我们要描述这个形状的概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。那什么是类型隐藏呢?我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。好比,动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。

2.abstract修饰符可用来修饰类和实例成员方法用abstract修饰的类表示抽象类,抽象类不能被实例化。没有用abstract修饰的类称为具体类,具体类可以被实例化。
用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,
但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法必须要有方法体。

(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类,否则编译出错。
(2)没有抽象构造方法,也没有抽象静态方法。
(3)抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
(4)抽象类及抽象方法不能被final修饰符修饰。即,abstract与final不能连用。这是因为abstract与final的作用是恰恰相反的,如:抽象类只允许创建其子类,而final修饰的类不允许拥有子类; 抽象方法必须被子类的具体方法来实现,而final修饰的方法不允许被子类方法覆盖

     哎,我写了这么多,不知您明白点不?好些东西需要慢慢理解和记忆!还用不懂的继续问我!!
作者: 黄方    时间: 2012-3-2 19:36
本帖最后由 舞动的心弦 于 2012-3-2 19:38 编辑

===================================================
作者: 黄方    时间: 2012-3-2 19:38
唐兴旺 发表于 2012-3-1 17:23
我个人理解抽象类就如同一个框架,列出一些你想要实现的的功能,但并没有具体的实施过程,就像你计划明天上 ...


额,看了你的问题啦:
1.首先,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类是表征我们对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。好比,我们都知道三角形是一个形状,世界上有三角形这样具体的东西,但是确没有形状这样具体的东西,我们要描述这个形状的概念就要用到抽象类。因此在java中抽象类是不允许被实例化的。
在面向对象领域,抽象类主要用来进行类型隐藏。那什么是类型隐藏呢?我们可以构造出一个固定的一组行为的抽象描述,但是这组行为却能够有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派生类。好比,动物是一个抽象类,人、猴子、老虎就是具体实现的派生类,我们就可以用动物类型来隐藏人、猴子和老虎的类型。

2.abstract修饰符可用来修饰类和实例成员方法用abstract修饰的类表示抽象类,抽象类不能被实例化。没有用abstract修饰的类称为具体类,具体类可以被实例化。
用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,
但不提供具体的实现。没有用abstract修饰的方法称为具体方法,具体方法必须要有方法体。

(1)抽象类中可以没有抽象方法,但包含了抽象方法的类必须被定义为抽象类。如果子类没有实现父类中所有的抽象方法,那么子类也必须被定义为抽象类,否则编译出错。
(2)没有抽象构造方法,也没有抽象静态方法。
(3)抽象类中可以有非抽象的构造方法,创建子类的实例时可能会调用这些构造方法。抽象类不能被实例化,然而可以创建一个引用变量,其类型是一个抽象类,并让它引用非抽象的子类的一个实例。
(4)抽象类及抽象方法不能被final修饰符修饰。即,abstract与final不能连用。这是因为abstract与final的作用是恰恰相反的,如:抽象类只允许创建其子类,而final修饰的类不允许拥有子类; 抽象方法必须被子类的具体方法来实现,而final修饰的方法不允许被子类方法覆盖

     哎,我写了这么多,不知您明白点不?好些东西需要慢慢理解和记忆!还用不懂的继续问我!!
作者: 李哲    时间: 2012-3-14 09:16
黄方 发表于 2012-3-2 19:38
额,看了你的问题啦:
1.首先,java编程思想中说“万物皆对象”,我们知道所有的对象都是通过类来描绘的 ...

谢谢你的解释,随着学习,现在对于继承,实现之类有了一些了解,还是有很大作用。只是不好说清楚。谢谢你的详细回答。
作者: 崔岩    时间: 2012-3-14 11:30
标题: RE: 还是不明白抽象类的作用。以及abstract修饰符?
本帖最后由 崔岩 于 2012-3-14 11:34 编辑

我认为abstract修饰符还有一个好处就是提醒你重写父类中的方法。比如父类中定义一个抽象方法,这个方法的性质是每个子类中都有不同的做法,必须要重写。这个时候就没必要在父类中把这个方法实现出来,因为子类最后也不会用父类的做法。这时如果不抽象一下,对于新手或者对这个项目不熟悉的人在继承父类后,可能会忘记重写该方法,导致运行时逻辑错误。而一旦抽象了该方法,相当于提醒了所有继承父类的子类,必须重写该方法,因为编译器就会提醒你,从而避免了错误发生。这只是个人一点小看法。
至于为什么需要抽象类,我感觉它和接口思想是一样的,我也想知道接口能不能完全代替抽象类。




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