又想大侠请教关于抽象类和接口的问题~~~~

zsmg888 2009-10-08 05:00:32
很迷惑,请大侠指点指点,好让菜鸟我拨云见日啊~~~~~~~~~~~

/*
这个是抽象类实现多态的代码
*/

public abstract class A1{
public abstract void fangFa();
public static void main(String[]args){
A1 t = new A2();
t.fangFa();
A1 t1 =new A3();
t1.fangFa();
/*
从这里看来,可以直接在抽象类上进行操作.很简单,很好.容易理解.
*/
}
}
class A2 extends A1{
public void fangFa(){
System.out.println("这里是A2的方法");
}
}
class A3 extends A1{
public void fangFa(){
System.out.println("这里是A3的方法");
}
}


/*
这是一个接口实现多态的代码.
*/
public class A2{
public static void main(String[]args){
JieKou t = new AA();
t.fangFa();
JieKou t1 = new BB();
t1.fangFa();
/*
从这里看来,在接口上还不容许使用main方法,那么我要实现接口的多态的话,
我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?
既然不如抽象类操作起来方便,直观.那为什么还要提出接口这个概念呢?
*/
}
}
interface JieKou{
void fangFa();
}
class AA implements JieKou{
public void fangFa(){
System.out.println("这里是AA实现了接口的方法");
}
}
class BB implements JieKou{
public void fangFa(){
System.out.println("这里是BB实现了接口的方法");
}
}
...全文
330 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ddrr2009 2009-10-10
  • 打赏
  • 举报
回复




了解了多态就明白了,多态有三个必要条件,1,要有继承,2,方法重写,3,超类引用指向了类对像···如果想了解的更多, http://bbs.tsp2c.cn/?fromuid=136
lifeiscreated 2009-10-10
  • 打赏
  • 举报
回复
其实接口在后期的时候有利于代码的封装,很好的保护你的源代码不透露,接口的作用多着,你应该好好看下书了
xiongbaiqi 2009-10-09
  • 打赏
  • 举报
回复
还是去看一下抽象类和接口的区别吧,或许在那就能找到答案
flyerwing 2009-10-09
  • 打赏
  • 举报
回复
怎么看程序员的头像都那么PL呢。
skyair2046 2009-10-09
  • 打赏
  • 举报
回复
还有接口是要用来实现的。你现在可能会认为他麻烦。慢慢的你会很好用
学多了以后
包括现在的主流框架 struts hibernate spring都是建立在接口之下的
慢慢来吧
skyair2046 2009-10-09
  • 打赏
  • 举报
回复
如何你想测试。可以试着把你那个抽象类的方法body实体部分补上。你那个抽象类就不能写main了
因为没一个抽象方法的类不叫抽象类
skyair2046 2009-10-09
  • 打赏
  • 举报
回复
大概知道了楼主的意图。。。
一抽象类是有至少有一个抽象方法的类

接口也叫完全抽象类。所有方法都抽象

只所以你那个抽象类里面可以用main方法是因为你那个类已经有一个抽象方法了.

你先搞清楚抽象类和接口的概念吧
leafsoar 2009-10-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zsmg888 的回复:]
楼上的大侠,我就是想知道接口和抽象类的区别.
可我目前觉得接口和抽象类的功能基本一样,所以想问问哪些时候适合用抽象类,哪些时候适合用接口?
[/Quote]
对于什么时候用继承(当然抽象类也一样),什么时候用接口,你可以有这么一个标准
我们说"狗"是"动物",那么"狗"可以继承动物
这当中有个关键字"XX是xx",满足 is a 的关系.
飞机能飞.可以把"飞",定义为接口,鸟能飞,当然也能实现这个接口
这当中得"XX能Xx",满足 can do 的关系
希望能对lz有帮助
leafsoar 2009-10-08
  • 打赏
  • 举报
回复
lz有个问题没搞明白,很难发现你的意图是什么..

/*
从这里看来,可以直接在抽象类上进行操作.很简单,很好.容易理解.
*/


在这里,你的main方法是在父类中写的,而不是在其他地方

/*
从这里看来,在接口上还不容许使用main方法,那么我要实现接口的多态的话,
我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?
既然不如抽象类操作起来方便,直观.那为什么还要提出接口这个概念呢?
*/


在接口中不能,定义main方法,而lz想当然的就认为,父类指向子类对象,应该在父类中操作
而接口中显然不能这么实现..lz有个误区.多态的使用.父类指向子类对象.你也发现了这样的好处..
但不一定非要在父类中去实现这个调用.这个main方法只是个测试用的,即使在你的第一个例子中
如果你没有main方法,你就体验不到的多态的好处了么..
bigbro001 2009-10-08
  • 打赏
  • 举报
回复
关于接口的作用第一点,请看下面这个雇员的例子,其中定义了修改个人信息和计算薪水的方法

public abstract class Employee implements Payable, EmployeeInfo
{
private String name;
private double weeklyPay;
//构造器
public Employee(String name, String address)
{
this.name = name;
this.address = address;
}

//跟个人信息由关的方法
public String getName()
{
return name;
}
public void setName(String n)
{
name = n;
}

//跟薪水有关的方法
public double getWeeklyPay()
{
return weeklyPay;
}
public void computePay(int hoursWorked)
{
weeklyPay = hoursWorked * 6.50;
System.out.println("Weekly pay for " + name + " is $" + weeklyPay);
}
}

//Payable接口只提供跟薪水有关的方法
interface Payable
{
public void computePay(int hoursWorked);
public double getWeeklyPay();
}

//EmployeeInfo接口只提供跟个人信息有关的方法
interface EmployeeInfo
{
public String getName();
public void setName(String n);
}

//如果写一个会计的类,其中的方法把Payable作为参数,会计就只能使用跟薪水有关的方法,而不能修改Employee的个人信息
class Payroll
{
public void payEmployee(Payable p)
{
p.computePay(40);
}

public void printPaycheck(Payable p)
{
System.out.println("Printing check for $" + p.getWeeklyPay());
}
}

//如果再写一个HR的类,其中的方法的参数为EmployeeInfo,那么HR就只能使用跟员工个人信息有关的方法,而不能看到薪水等
class HumanResources
{
public String getInfo(EmployeeInfo e)
{
return e.getName() + " " + e.getAddress();
}

public void changeName(EmployeeInfo e, String name)
{
System.out.println("Changing name for " + e.getName());
e.setName(name);
System.out.println("New name is " + e.getName());
}
}
//这样一来,通过接口,Employee类就可以提供部分方法给该类的用户使用,而不会暴露其他的方法,这个是接口的作用之一
bigbro001 2009-10-08
  • 打赏
  • 举报
回复
在小程序中(例如楼主一开始的例子),可能还体现不出来接口的好处和必要性,在大的项目中,接口的好处就很明显了

接口的作用主要有3点:
1.通过接口,可以把一个类的某些方法,而不是所有方法,提供给类的用户使用,而抽象类无法实现这种效果
2.利用接口类型的参数,强制类去实现某种行为
3.接口类型的多态
请楼主稍等,写几个例子
孝东 2009-10-08
  • 打赏
  • 举报
回复
接口可以规范团队开发的统一性,接口通常是高级程序员来设计,而初级的程序员则只需要实现这些接口定义的方法就可以了,如果接口设计得好,后面的工作也就轻松了许多,否则有些功能你无法实现的
最重要的还是上楼兄弟说的,接口可以多继承,而类只能单继承,如果你真写过项目,你就知道接口有多有用了
liuxiaosabbath 2009-10-08
  • 打赏
  • 举报
回复
接口为什么必要,原因不止一个。
就拿个最显而易见的来看:
你如果想要多继承,怎么办?
intends后面只能跟一个类,implement后面可以有N个接口。
zsmg888 2009-10-08
  • 打赏
  • 举报
回复
楼上的,单继承我可以变相的变成多继承啊.
如: class C extends A,B是错的.
那我 class B extends A.
class C extends B.
那C类就可以继承A B两类的东西了呀?

那和接口不一样了么?
rookie001 2009-10-08
  • 打赏
  • 举报
回复
单继承,多接口;
class C extends A,B --->错
class C implements A,B ---->可以

zsmg888 2009-10-08
  • 打赏
  • 举报
回复
楼上的大侠,我就是想知道接口和抽象类的区别.
可我目前觉得接口和抽象类的功能基本一样,所以想问问哪些时候适合用抽象类,哪些时候适合用接口?
舷Kelvin 2009-10-08
  • 打赏
  • 举报
回复
lz的意思还是有点表述不清。

就为了个main函数否定接口?

用接口觉得麻烦就别用接口,该用的地方才用。

接口和抽象类本来是各有分工的,接口有接口的好处,何必要求接口处处都比抽象类好。
ahey 2009-10-08
  • 打赏
  • 举报
回复
http://www.javaresearch.org/forum/thread.jsp?column=16&thread=28218
不知上文是否有帮助,^^
zsmg888 2009-10-08
  • 打赏
  • 举报
回复
各位,我的意思是说,如果我定义的是抽象类,那我直接就可以
抽象类 变量 = new 子类构造方法
来实现多态.

而接口的话,我要体现多态,我不能直接在接口里写
public static void main(String []args){
这里来写接口的多态.因为接口里不容许包含方法体.
}
我只能在重新开个类,来
public static void main(String []args){
接口 变量 = 实现类
来体现多态.
}
比直接在抽象类上public static void main(String []args){ 麻烦.

舷Kelvin 2009-10-08
  • 打赏
  • 举报
回复
lz的问题是什么。是“为什么还要提出接口这个概念呢?”这句吗?

为什么要有接口这个东西,在我初学java的时候也有这个疑问。

你现在觉得定义的时候接口没有抽象类方便,确实如此,但接口的好处是要你在使用它的时候才能发现的。

比如这个类public Thread(Runnable target),实例化的时候需要一个实现了Runnable接口的对象作参数,只要它自己实现了Runnable接口,就能放在这里当参数,与它的父类祖父类能不能在这里当参数毫无关系。属于其他继承树的类只要实现这个接口也能放在这里当参数。这样处理就灵活了好多。

其实你不必急着弄懂这个问题,多写写代码,很自然就能弄懂的。
加载更多回复(4)

62,621

社区成员

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

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