又想大侠请教关于抽象类和接口的问题~~~~ 本帖最后由 zsmg888 于 2009-10-08 17:01:53 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 首先不懂lz的真正意图“我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?”这是啥意思?你没有真正理解多态的好处,好好看书体会。为什么还要提出接口这个概念呢?答:java只支持单继承,那谁来表现一个类多继承的特征? 接口。一个类可以实现多个接口。 我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?不理解楼主啥意思那为什么还要提出接口这个概念呢?接口是规范,用来实现java中的多继承 lz的问题是什么。是“为什么还要提出接口这个概念呢?”这句吗?为什么要有接口这个东西,在我初学java的时候也有这个疑问。你现在觉得定义的时候接口没有抽象类方便,确实如此,但接口的好处是要你在使用它的时候才能发现的。比如这个类public Thread(Runnable target),实例化的时候需要一个实现了Runnable接口的对象作参数,只要它自己实现了Runnable接口,就能放在这里当参数,与它的父类祖父类能不能在这里当参数毫无关系。属于其他继承树的类只要实现这个接口也能放在这里当参数。这样处理就灵活了好多。其实你不必急着弄懂这个问题,多写写代码,很自然就能弄懂的。 各位,我的意思是说,如果我定义的是抽象类,那我直接就可以抽象类 变量 = new 子类构造方法来实现多态.而接口的话,我要体现多态,我不能直接在接口里写 public static void main(String []args){这里来写接口的多态.因为接口里不容许包含方法体.}我只能在重新开个类,来public static void main(String []args){接口 变量 = 实现类来体现多态.}比直接在抽象类上public static void main(String []args){ 麻烦. http://www.javaresearch.org/forum/thread.jsp?column=16&thread=28218不知上文是否有帮助,^^ lz的意思还是有点表述不清。就为了个main函数否定接口?用接口觉得麻烦就别用接口,该用的地方才用。接口和抽象类本来是各有分工的,接口有接口的好处,何必要求接口处处都比抽象类好。 单继承,多接口;class C extends A,B --->错class C implements A,B ---->可以 楼上的,单继承我可以变相的变成多继承啊.如: class C extends A,B是错的. 那我 class B extends A. class C extends B. 那C类就可以继承A B两类的东西了呀?那和接口不一样了么? 接口为什么必要,原因不止一个。就拿个最显而易见的来看:你如果想要多继承,怎么办?intends后面只能跟一个类,implement后面可以有N个接口。 关于接口的作用第一点,请看下面这个雇员的例子,其中定义了修改个人信息和计算薪水的方法 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类就可以提供部分方法给该类的用户使用,而不会暴露其他的方法,这个是接口的作用之一 lz有个问题没搞明白,很难发现你的意图是什么.. /* 从这里看来,可以直接在抽象类上进行操作.很简单,很好.容易理解. */在这里,你的main方法是在父类中写的,而不是在其他地方/* 从这里看来,在接口上还不容许使用main方法,那么我要实现接口的多态的话, 我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗? 既然不如抽象类操作起来方便,直观.那为什么还要提出接口这个概念呢? */在接口中不能,定义main方法,而lz想当然的就认为,父类指向子类对象,应该在父类中操作而接口中显然不能这么实现..lz有个误区.多态的使用.父类指向子类对象.你也发现了这样的好处..但不一定非要在父类中去实现这个调用.这个main方法只是个测试用的,即使在你的第一个例子中如果你没有main方法,你就体验不到的多态的好处了么.. 对于什么时候用继承(当然抽象类也一样),什么时候用接口,你可以有这么一个标准我们说"狗"是"动物",那么"狗"可以继承动物这当中有个关键字"XX是xx",满足 is a 的关系.飞机能飞.可以把"飞",定义为接口,鸟能飞,当然也能实现这个接口这当中得"XX能Xx",满足 can do 的关系希望能对lz有帮助 大概知道了楼主的意图一抽象类是有至少有一个抽象方法的类接口也叫完全抽象类。所有方法都抽象只所以你那个抽象类里面可以用main方法是因为你那个类已经有一个抽象方法了.你先搞清楚抽象类和接口的概念吧 如何你想测试。可以试着把你那个抽象类的方法body实体部分补上。你那个抽象类就不能写main了因为没一个抽象方法的类不叫抽象类 还有接口是要用来实现的。你现在可能会认为他麻烦。慢慢的你会很好用学多了以后包括现在的主流框架 struts hibernate spring都是建立在接口之下的慢慢来吧 了解了多态就明白了,多态有三个必要条件,1,要有继承,2,方法重写,3,超类引用指向了类对像···如果想了解的更多, http://bbs.tsp2c.cn/?fromuid=136 哈希表键值怎么放入二维数组? webwork不知道怎么回事报错了,请各位大侠帮忙看看 请帮我写成sql哦 java测试题 一著名软件公司的java笔试算法题! jsp传值为什么不能插入数据库? jdbc.drivers属性设定 哪里可以下载 侯杰 翻译的 Java 编程思想? tomcat and 2000IIS的问题 谁有SqlServer的JDBC驱动?谢谢!定给分!! java反射机制 linux下运行jar,找不到路径,大家帮我看看
“我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?”
这是啥意思?你没有真正理解多态的好处,好好看书体会。为什么还要提出接口这个概念呢?
答:java只支持单继承,那谁来表现一个类多继承的特征?
接口。一个类可以实现多个接口。
不理解楼主啥意思
那为什么还要提出接口这个概念呢?
接口是规范,用来实现java中的多继承
抽象类 变量 = new 子类构造方法
来实现多态.而接口的话,我要体现多态,我不能直接在接口里写
public static void main(String []args){
这里来写接口的多态.因为接口里不容许包含方法体.
}
我只能在重新开个类,来
public static void main(String []args){
接口 变量 = 实现类
来体现多态.
}
比直接在抽象类上public static void main(String []args){ 麻烦.
不知上文是否有帮助,^^
class C extends A,B --->错
class C implements A,B ---->可以
如: class C extends A,B是错的.
那我 class B extends A.
class C extends B.
那C类就可以继承A B两类的东西了呀?那和接口不一样了么?
就拿个最显而易见的来看:
你如果想要多继承,怎么办?
intends后面只能跟一个类,implement后面可以有N个接口。
{
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类就可以提供部分方法给该类的用户使用,而不会暴露其他的方法,这个是接口的作用之一
从这里看来,可以直接在抽象类上进行操作.很简单,很好.容易理解.
*/
在这里,你的main方法是在父类中写的,而不是在其他地方/*
从这里看来,在接口上还不容许使用main方法,那么我要实现接口的多态的话,
我还要再写个类来把接口和实现类揉在一起.那不是比抽象类麻烦吗?
既然不如抽象类操作起来方便,直观.那为什么还要提出接口这个概念呢?
*/
在接口中不能,定义main方法,而lz想当然的就认为,父类指向子类对象,应该在父类中操作
而接口中显然不能这么实现..lz有个误区.多态的使用.父类指向子类对象.你也发现了这样的好处..
但不一定非要在父类中去实现这个调用.这个main方法只是个测试用的,即使在你的第一个例子中
如果你没有main方法,你就体验不到的多态的好处了么..
我们说"狗"是"动物",那么"狗"可以继承动物
这当中有个关键字"XX是xx",满足 is a 的关系.
飞机能飞.可以把"飞",定义为接口,鸟能飞,当然也能实现这个接口
这当中得"XX能Xx",满足 can do 的关系
希望能对lz有帮助
一抽象类是有至少有一个抽象方法的类接口也叫完全抽象类。所有方法都抽象只所以你那个抽象类里面可以用main方法是因为你那个类已经有一个抽象方法了.你先搞清楚抽象类和接口的概念吧
因为没一个抽象方法的类不叫抽象类
学多了以后
包括现在的主流框架 struts hibernate spring都是建立在接口之下的
慢慢来吧