高手来帮菜鸟解答解答····

budongaideniuniu 2011-06-28 01:16:03
问题:接口是由抽象方法和类常量构成,抽象类又可以含有抽象方法,抽象方法有方法体,这样传递来说,也就是接口也可以有方法体,可是,为什么书上说,接口中不允许有方法体呢??
困惑,求解??谢谢
...全文
188 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
抽象类:
含有abstract修饰符的class即为抽象类;

抽象方法和抽象类规则:
1.抽象类必须使用abstract修饰符来修饰,抽象方法也必须用abstract来修饰,抽象方法不能有方法体.
2.抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例.
3.抽象类可以包含属性、方法、构造器、初始化块、内部类、枚举类六种成分.抽象类的构造器不能用于创建实例,主要是被子类调用
4.含有抽象方法的类只能被定义成抽象类.3种情况:
a.直接定义了一个抽象方法
b.继承了一个抽象父类,但没有完全实现父类包含的抽象方法
c.实现了一个接口,但没完全实现接口包含的抽象方法

*当abstract修饰类时,表明这个类只能被继承,当abstract修饰方法时,表明这个方法必须由子类提供实现(重写).而final修饰的类不能被继承,final修饰的方法不能被重写,因此final和abstract永远不能同时使用.

*当使用static修饰一个方法时,表明这个方法属于当前类,即该方法可以通过该类来调用,如果该方法被定义成抽象方法,则将导致通过该类来调用该方法时出错(没有方法体),因此static和abstract不能同时修饰某个方法.

*abstract关键字修饰的方法必须被其子类重写才有意义,否则这个方法将永远不会有方法体,因此abstract方法不能定义为private访问权限,即private和abstract不能同时使用.

抽象类不能创建实例,它只能当成父类来被继承.从语义的角度来看,抽象类是从多个具体类中抽象出来的父类,它具有更高层次的抽象.从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免了子类设计的随意性.

抽象类体现的是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会大致保留抽象类的行为方式.

如果编写了一个父类,父类提供了多个子类的通用方法,并把一个或多个方法留给子类实现,这就是一种模板模式.简单规则:
1.抽象父类可以只定义需要使用的某些方法,其余则留给子类实现.
2.父类中可能包含需要调用的其他系列的方法,这些被方法既可以由父类实现,也可以由其子类实现.父类里提供的方法只是定义了一个通用算法,其实现也许并不完全由自身实现,而必须依赖于其子类的辅助.

接口:
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行得更彻底,则可以提炼出一种更加特殊的"抽象类"---接口(interface),接口里不能包含普通方法,接口里所有方法都是抽象方法.

接口是从多个相似类中抽象出来的规范,接口不提供任何实现.接口体现的是规范和现实分离的设计哲学.

接口定义的是多个类共同的公共行为规范,这些行为是与外部交流的通道,这就意味着接口里通常是定义一组公用方法.

接口定义语法:

[修饰符] interface 接口名 extends 父接口1,父接口2...{
零到多个常量定义
零到过个抽象方法定义
}

修饰符:
可以是public或省略,省略则默认采用包权限访问控制符.
接口名:
与类名采用相同的命名规则,从语法角度来看,接口名只要是合法的标识符即可;如果要遵守Java可读性规范,则接口名应由多个有意义的单词连缀而成,每个单词首字母大写,单词与单词之间无需任何分隔符.
一个接口可以有多个直接父接口,但接口只能继承接口,不能继承类.

接口里不能包含构造器和初始化块,可以包含属性(只能是常量)、方法(只能是抽象实例方法)、内部类(包括内部接口)和枚举类定义.

由于没构造器和初始化块,接口里定义属性只能在定义时指定默认值.系统默认而且必定使用public static final来修饰接口里的属性.

接口中定义的方法只能是抽象方法,系统默认而且必定使用public static来修饰接口中定义的方法.

接口里定义的内部类和枚举类,系统默认而且必定使用public static修饰符.

接口和抽象类之间的差别非常大,这种差别主要体现在二者设计目的上:
接口作为系统与外界交互的窗口,体现的是一种规范.对于接口的实现者而言,接口规定了实现者必须向外提供哪些服务(以方法的形式来提供);对于接口的调用者而言,接口规定了调用者可以调用哪些服务,以及如何调用这些服务(就是如何来调用方法).当在一个程序中使用接口时,接口是多个模块间的耦合标准;当在多个应用程序之间使用接口时,接口是多个程序之间的通信标准.

从某种程度上来看,接口类似于整个系统的"总纲",它指定了系统各模块应该遵循的标准,因此一个系统中的接口不应该经常改变.一旦接口被改变,对这个系统甚至其他系统的影响将是辐射式的,导致系统中大部分类需要改写.

抽象类则不一样,抽象类作为系统中多个子类的共同父类,它所体现的是一种模板式设计.抽象类作为多个子类的抽象父类,可以被当成系统实现过程中的中间产品,这个中间产品已经实现了系统的部分功能(已提供实现的方法),但这个产品依然不能当成最终产品,必须有更进一步的完善,这种完善可能有几种不同方式.

个人笔记..
g_valley 2011-07-14
  • 打赏
  • 举报
回复
抽象类中可以有方法体,“抽象方法有方法体”根本不通(内嵌方法?) 书的笔误吧 哥们多找几本书比对比对 尽信书不如无书
猫儿爷爷 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chosen0ne 的回复:]
应该说接口中只有方法的声明,也就是抽象方法,是没有方法体的。
抽象方法是没有方法体的,你从哪本书上看到的有方法体,误人子弟啊。。。。
[/Quote]+1
nourewang 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 budongaideniuniu 的回复:]
问题:接口是由抽象方法和类常量构成,抽象类又可以含有抽象方法,抽象方法有方法体,这样传递来说,也就是接口也可以有方法体,可是,为什么书上说,接口中不允许有方法体呢??
困惑,求解??谢谢
[/Quote]
lz说的是"可是,为什么书上说,接口中不允许有方法体呢??",书上说的是对的,
然后
lz",这样传递来说,也就是接口也可以有方法体,"
怎么能走传递路线呢lz?
sd4324530 2011-07-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 mkj414370365 的回复:]

引用 1 楼 chosen0ne 的回复:
应该说接口中只有方法的声明,也就是抽象方法,是没有方法体的。
抽象方法是没有方法体的,你从哪本书上看到的有方法体,误人子弟啊。。。。



投诉出版社 谁说抽象方法有方法体。。。
[/Quote]
+1
kjma 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 yangguoshui 的回复:]
引用 9 楼 chenchenyangll 的回复:
引用 7 楼 lacus87 的回复:

书上说的是抽象类里面可以有抽象方法也可以有带方法体的非抽象方法吧....


应该是这么说的


[/Quote]







kjma 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 chosen0ne 的回复:]
应该说接口中只有方法的声明,也就是抽象方法,是没有方法体的。
抽象方法是没有方法体的,你从哪本书上看到的有方法体,误人子弟啊。。。。
[/Quote]


投诉出版社 谁说抽象方法有方法体。。。
悠忧虫 2011-07-01
  • 打赏
  • 举报
回复


谁告诉你抽象方法有方法体的?
学java不容易 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 chenchenyangll 的回复:]
引用 7 楼 lacus87 的回复:

书上说的是抽象类里面可以有抽象方法也可以有带方法体的非抽象方法吧....


应该是这么说的
[/Quote]
哎呦喂哈 2011-06-29
  • 打赏
  • 举报
回复
[Quote=引用楼主 budongaideniuniu 的回复:]
问题:接口是由抽象方法和类常量构成,抽象类又可以含有抽象方法,抽象方法有方法体,这样传递来说,也就是接口也可以有方法体,可是,为什么书上说,接口中不允许有方法体呢??
困惑,求解??谢谢
[/Quote]
抽象类可以包含非抽象的方法,但是接口不能包含非抽象的方法。楼主理解错了,(抽象方法有方法体)这句话是不对的,有方法体的就不叫抽象方法了。
Mourinho 2011-06-29
  • 打赏
  • 举报
回复
抽象类的非抽象方法可以有方法体,但是抽象方法肯定没有方法体。
接口是由抽象方法和类常量构成,故没有方法体。
LZ估计是看错了。
ljybasically 2011-06-29
  • 打赏
  • 举报
回复
呵呵,路过,学习一下
hanszh 2011-06-29
  • 打赏
  • 举报
回复
抽象方法有方法体的话,还要抽象方法干嘛??
iis81365341 2011-06-29
  • 打赏
  • 举报
回复
是不是你们老师给你们这么说的?
gzc145 2011-06-28
  • 打赏
  • 举报
回复
书上有错其实也不是什么坏事,你能把书上的错纠出来,说明你是真正用心去读的。
抽象类中的抽象方法是没有方法体的,但是抽象类中可以有普通方法,而普通方法必须有方法体!
接口中的所有方法都是抽象方法,绝对不能有方法体。
chenchenyangll 2011-06-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lacus87 的回复:]

书上说的是抽象类里面可以有抽象方法也可以有带方法体的非抽象方法吧....
[/Quote]

应该是这么说的
24K純帥 2011-06-28
  • 打赏
  • 举报
回复
接口怎么会有常量。。
lacus87 2011-06-28
  • 打赏
  • 举报
回复
书上说的是抽象类里面可以有抽象方法也可以有带方法体的非抽象方法吧....
Who_know_me 2011-06-28
  • 打赏
  • 举报
回复
我记得是没有的~
楼主估计是看错了
riyuezhizhi 2011-06-28
  • 打赏
  • 举报
回复
抽象方法没有方法体的,哪本书上看的,告诉我,以后我不看这个作者的书了
加载更多回复(8)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧