现在开发的主流都是面向对象,面向过程几乎已经被淘汰了。理解面向对象,就要知道它的三大特性,多态继承和封装。在学习面向对象的过程中,总是会接触到抽象类和接口,涉及到继承和实现,而这两个概念又总是傻傻分不清楚。不过经过不懈努力,还是解决的差不多了。下面就来介绍下抽象类和接口:
抽象类
概念
用abstract关键字来修饰的类称为抽象类
特点
1、不是完整的类,只能作为基类
2、不能被实例化
3、有抽象方法的类必须声明为抽象类,而且该抽象方法必须被重写
举例
<span style="font-family:KaiTi_GB2312;font-size:18px;">abstract class Animal{
private String name;
Animal(String name){this.name=name;}
/*public void enjoy(){
System.out.println("叫声......");
}*/
public abstract void enjoy();
}
class Cat extends Animal{
private String eyeColor;
Cat(String n,String c){super(n);eyeColor=c;}
public void enjoy(){
System.out.println("猫叫声......");
}
}
class Dog extends Animal{
private String furColor;
Dog(String n,String c){super(n);furColor=c;}
public void enjoy(){
System.out.println("狗叫声......");
}
}
class Lady{
private String name;
private Animal pet;
Lady(String name,Animal pet){
this.name=name;this.pet=pet;
}
public void myPetEnjoy(){pet.enjoy();}
}
public class Test{
public static void main(String args[]){
Cat c=new Cat("catname","blue");
Dog d=new Dog("dogname","black");
Lady l1=new Lady("l1",c);
Lady l2=new Lady("l2",d);
l1.myPetEnjoy();
l2.myPetEnjoy();
}
}</span>
结果
我的理解
我认为抽象类主要体现的是多态,就比如说在上面这个例子中,Animal类中的enjoy()方法,如果换成注释掉的那两句代码,运行的结果是一样的,所以说这个方法在Animal类中实现不实现效果都一样,所以就把它声明为了抽象方法,那么这个类就必须声明为抽象类。在其他类继承Animal类时,不满意基类的方法实现,就对基类的方法进行了重写,来实现自己不同的功能,就是说动物都会叫,但是不同动物的叫声不同,这就是多态。
接口
概念
接口是抽象方法和常量值的定义的集合,从本质上讲,接口是一种特殊的抽象类,只包含常量和方法定义,没有变量和方法实现。
特点
1、可以多重实现
2、可以继承其他接口,并添加新的属性和抽象方法
3、多个无关的类可以实现同一个接口,一个类也可以实现多个无关的接口
举例
<span style="font-family:KaiTi_GB2312;font-size:18px;">interface Singer{
public void sing();
public void sleep();
}
interface Painter{
public void paint();
public void eat();
}
class Student implements Singer{
private String name;
Student (String name){
this.name=name;
}
public void study(){
System.out.println("studying");
}
public String getName(){return name;}
public void sing(){
System.out.println("student is singing");
}
public void sleep(){
System.out.println("student is sleeping");
}
}
class Teacher implements Singer,Painter{
private String name;
public String getString(){
return name;
}
Teacher(String name){this.name=name;}
public void teach(){System.out.println("teaching");}
public void sing(){System.out.println("teacher is singing");}
public void sleep(){System.out.println("teacher is sleeping");}
public void paint(){System.out.println("teacher is painting");}
public void eat(){System.out.println("teacher is eating");}
}
public class TestInterface{
public static void main(String[] args){
Singer s1=new Student("le");
s1.sing(); s1.sleep();
Singer s2=new Teacher("steven");
s2.sing();s2.sleep();
Painter p1=(Painter)s2;
p1.paint();p1.eat();
}
}</span>
结果
我的理解
其实同抽象类相同,接口与实现类之间的也存在多态性,体现在实现类在实现接口的同时,还可以让自己实现新的方法,如上面的例子,Student实现Singer接口的同时,还实现了他自己的Study()方法。当时我认为接口更多的是封装,定义相同的规范,实现类实现时要按规范来。接口的多重实现其实就是多继承,在Java中,一个类只能继承一个父类或抽象类,但是它可以实现多个接口,这也是抽象类和接口的不同之处。
总结
多态有三个特点:要有继承、要有重写、父类引用指向子类的对象,抽象类和接口体现多态也是体现在这三个方面。它们两个不是一对矛盾的概念,而是各有各的特点。两个概念和实现类之间的关系不同,一个是继承,一个是实现。在上述例子中也能体会到,接口比抽象类更灵活,原因就在于二者继承、实现的区别,实现比继承灵活,自然接口也就比抽象类灵活。