什么时候用抽象类,什么时候用接口? 最近遇到一个这样的面试题,不知道如何回答是好,请高人指点面试抽象类和接口,java 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 给LZ举个现实生活中的例子吧:电脑主板有好多PCI插槽对吧,主板厂商联合显卡声卡等指定了个规则,只要你的显卡,声卡等符合我主板的规则,那你就能在我的主板上运行,,这时候就需要定义接口,因为规则是统一的,但是具体怎么实现,主板商不知道也不需要知道,这个由其他的声卡,显卡厂商去实现,这就是接口。抽象类:当多个类中出现相同功能,但是功能主体不同,这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。抽象类的特点:1,抽象方法一定在抽象类中。2,抽象方法和抽象类都必须被abstract关键字修饰。3,抽象类不可以用new创建对象。因为调用抽象方法没意义。4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。 如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。抽象类和一般类没有太大的不同。该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。通过抽象方法来表示。抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。抽象类不可以实例化。特殊之处:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。抽象类:/*需求:假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。员工类:name id pay经理类:继承了员工,并有自己特有的bonus。*/class Employee{ private String name; private String id; private double pay; Employee(String name,String id,double pay) { this.name = name; this.id = id; this.pay = pay; } public abstract void work();}class Manager extends Employee{ private int bonus; Manager(String name,String id,double pay,int bonus) { super(name,id,pay); this.bonus = bonus; } public void work() { System.out.println("manager work"); }}class Pro extends Employee{ Pro(String name,String id,double pay) { super(name,id,pay); } public void work() { System.out.println("pro work"); }}class { public static void main(String[] args) { System.out.println("Hello World!"); }接口:/*需求:电脑运行实例,电脑运行基于主板。*/ interface PCI{ public void open(); public void close();} //主板class MainBoard{ public void run() { System.out.println("mainboard run "); } //这个方法就是说只要你实现了PCI接口你就能"插在我身上" //PCI p = new NetCard(),接口型引用指向自己的子类对象,同理网卡也是 //注:你还可以建立更多的对象实现PCI接口丰富电脑配置 public void usePCI(PCI p) { //这里的P代表你传给他哪个对象,他就代表哪个对象对应的方法 if(p!=null) { p.open(); p.close(); } }} //网卡实现了PCI接口复写了他的方法class NetCard implements PCI{ public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); method(); } } //声卡实现了PCI接口复写了他的方法class SoundCard implements PCI{ public void open() { System.out.println("SoundCard open"); } public void close() { System.out.println("SoundCard close"); }} class MainBoardTest { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); }} http://www.cnblogs.com/healerkx/articles/1233252.html前后几章都要看。 http://www.cnblogs.com/healerkx/articles/1233252.html 根据实际情况来定,首先抽象类是必定要给别人来继承的,这就是它存在的意义,其次,java不支持多继承,只能一对一的继承,但是java却可以同时实现多个接口,比如你定义了一个动物类,这个类既想有猫的动作,又想有狗的动作,那么你就可以用这个类去同时实现猫和狗的接口,抽象类个人认为它和多态联系更紧密一下,比如你定义了一个球类为抽象类,那么去继承它的可以是篮球、足球等等,那么在你以后写的代码中,你就可以更具需要去决定到底是用它的篮球子类还是足球子类。以上为个人理解,可能说的不太明白。 你理解错误了你还是看我的blog吧Cat,Dog不可能是接口(准确说,拿这种意义的东西当接口,不好)你注意一下,Java的接口命名规范,50%以上都是able结尾的。这说明问题的~~~ 抽象类 --> 模板接口 -->标准 经典String str = new String("abc");内存分配问题 java正则表达式中有后瞻吗 一个看似简单的问题 Struts+DWR实现页面图片自动刷新 处理5W~50W的数据方法 连接sqlservler的一个问题,急急急呀,快来看看呀,真奇怪!! 菜鸟提问,protected void paintComponent(Graphics g)问题 初级问题,又一个类编译问题?这次问题多多!=.=! 请教将字符类型转化为整数类型的函数,多谢! JAVADOC问题 我用java做了一个来回移动的三角形,但是调试不知道错在哪里 编译也没有错误 java 16进制处理bmp图片
这时可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。
抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
抽象类和一般类没有太大的不同。
该如何描述事物,就如何描述事物,只不过,该事物出现了一些看不懂的东西。
这些不确定的部分,也是该事物的功能,需要明确出现。但是无法定义主体。
通过抽象方法来表示。抽象类比一般类多个了抽象函数。就是在类中可以定义抽象方法。
抽象类不可以实例化。
特殊之处:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。抽象类:/*
需求:
假如我们在开发一个系统时需要对员工进行建模,员工包含 3 个属性:
姓名、工号以及工资。经理也是员工,除了含有员工的属性外,另为还有一个
奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方
法进行属性访问。员工类:name id pay经理类:继承了员工,并有自己特有的bonus。
*/class Employee
{
private String name;
private String id;
private double pay; Employee(String name,String id,double pay)
{
this.name = name;
this.id = id;
this.pay = pay;
}
public abstract void work();}class Manager extends Employee
{
private int bonus;
Manager(String name,String id,double pay,int bonus)
{
super(name,id,pay);
this.bonus = bonus;
}
public void work()
{
System.out.println("manager work");
}
}class Pro extends Employee
{
Pro(String name,String id,double pay)
{
super(name,id,pay);
}
public void work()
{
System.out.println("pro work");
}
}
class
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}接口:/*
需求:
电脑运行实例,
电脑运行基于主板。
*/
interface PCI
{
public void open();
public void close();
}
//主板
class MainBoard
{
public void run()
{
System.out.println("mainboard run ");
}
//这个方法就是说只要你实现了PCI接口你就能"插在我身上"
//PCI p = new NetCard(),接口型引用指向自己的子类对象,同理网卡也是
//注:你还可以建立更多的对象实现PCI接口丰富电脑配置
public void usePCI(PCI p)
{
//这里的P代表你传给他哪个对象,他就代表哪个对象对应的方法
if(p!=null)
{
p.open();
p.close();
}
}
}
//网卡实现了PCI接口复写了他的方法
class NetCard implements PCI
{
public void open()
{
System.out.println("netcard open");
}
public void close()
{
System.out.println("netcard close");
method();
}
}
//声卡实现了PCI接口复写了他的方法
class SoundCard implements PCI
{
public void open()
{
System.out.println("SoundCard open");
}
public void close()
{
System.out.println("SoundCard close");
}
}
class MainBoardTest
{
public static void main(String[] args)
{
MainBoard mb = new MainBoard();
mb.run();
mb.usePCI(null);
mb.usePCI(new NetCard());
mb.usePCI(new SoundCard());
}
}
你理解错误了你还是看我的blog吧
Cat,Dog不可能是接口(准确说,拿这种意义的东西当接口,不好)你注意一下,Java的接口命名规范,50%以上都是able结尾的。这说明问题的~~~
接口 -->标准