浅谈java抽象类和接口
第一次,写这个,没有把图片放上来,有兴趣的可以点击连接看原文 http://note.youdao.com/noteshare?id=aecbd52b9240f23c0954e8086b848a17
一:抽象类
java的抽象类用关键字abstract来进行声明。抽象类只关心它的子类是否具有某种功能,并不关心功能的具体实现,功能的具体实现是由子类来负责实现的。
抽象类不能被实例化(既不能new 出来),只能用作派生类的基类而存在。
抽象类的定义规则如下:
1.抽象类必须用abstract关键字来修饰;抽象方法也必须用abstract来修饰。
2.抽象方法只需声明,而无需实现。
3.抽象方法不能被实例化。
4.当一个类中拥有抽象方法时,则该类必须被声明为抽象类。
5.当一个子类继承抽象类时,他必须实现实现父类的所有抽象方法,反则它也只是一个抽象类,还是不能被实例化。
下面举例子说明:
package 抽象类;
/**
* 定义一个抽象类People
*
*
*/
public abstract class People {
public void say(){
System.out.println("具体方法");
}
/**
* 定义一个抽象方法 职业
*/
public abstract void profession();
}
上面代码创建了一个抽象类,分别有一个抽象方法 profession();跟具体方法say()。
若定义一个子类继承自People类,则必须实现say()方法,否则还只是抽象类。
(1)实现了所有父类的抽象方法。
(2)没有实现父类的所有方法的情况。(必须加关键字声明为抽象类)
抽象类不能被实例化(不然会报错)
二:接口
java只支持单继承,利用接口可以实现多继承的一种效果。通常,接口中只定义了抽象方法,规划出类的共同行为,而把具体的实现留给具体的类。
接口用关键字interface来进行声明,接口是抽象方法和常量值定义的集合,从本质上讲,接口是一种特殊的抽象类,这种抽象类只包含有常量和方法的定义,而没有变量和方法的实现(不过可以在接口里面实现静态方法).
接口的常量定义部分有public、static和final属性。在接口中声明的方法具有public和abstract属性(接口的方法可以不用关键字abstrac进行声明).
接口的实现由类来实现,类通过关键字implements声明自己使用一个或多个接口。所谓实现接口,就是实现接口中声明的方法。
一个类可以实现多个接口,但必须实现所继承接口的全部方法,否则也是要被声明为抽象类。如下图所示。
上图也可以反映出接口中定义的常量具有static、final等属性,当然也是具有public属性的。
此外,接口还可以多继承。
三:补充
其实我觉得完全可以将抽象类,接口跟匿名类合在一起讲,匿名类是不能有名称的类,所以没办法引用他们。必须在创建时作为new语句的一部分来实现他们。
作为一个自学者,其实刚开始对匿名类这东西很不理解(当然现在也不一定完全理解了,只是个人的理解)。我觉得匿名类就是对原有的类或接口进行拓展和实现。所创建的相当于原有类的子类,所以你用上转型对象去接收的时候会发现用上转型对象调用不到匿名类里面自己新增的成员变量和方法。
匿名类使用最多的我想大概就是swing窗体的时候了吧。在为控件注册点击事件的时候常常用到匿名类。如:
这边就使用匿名类实现了接口WindowListener来注册窗体的相关事件。注意的是这边是实现接口所以必须实现接口的全部方法,否则根本new 不出来(因为是抽象类)。这样会变得很麻烦,因为我们要重写这个接口的全部未实现的方法。因此,这边就引入了事件适配器,如WindowAdapter。事件适配器里面已经有了相关方法的空实现(方法体里面什么都没有,不等同于抽象类),因此我们只需要重写我们关心的某几个方法。
在自学的路上,遇到好多挫折,曾经也想放弃但又舍不得放弃。我坚信好记性不如烂笔头,也希望和大家共同进步。第一次写这种,希望大家能多多指出我的错误,谢谢大家。新的一年,继续前进。
浙公网安备 33010602011771号