现在开发的主流都是面向对象,面向过程几乎已经被淘汰了。理解面向对象,就要知道它的三大特性,多态继承和封装。在学习面向对象的过程中,总是会接触到抽象类和接口,涉及到继承和实现,而这两个概念又总是傻傻分不清楚。不过经过不懈努力,还是解决的差不多了。下面就来介绍下抽象类和接口:
抽象类
概念
用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中,一个类只能继承一个父类或抽象类,但是它可以实现多个接口,这也是抽象类和接口的不同之处。
总结
多态有三个特点:要有继承、要有重写、父类引用指向子类的对象,抽象类和接口体现多态也是体现在这三个方面。它们两个不是一对矛盾的概念,而是各有各的特点。两个概念和实现类之间的关系不同,一个是继承,一个是实现。在上述例子中也能体会到,接口比抽象类更灵活,原因就在于二者继承、实现的区别,实现比继承灵活,自然接口也就比抽象类灵活。
版权声明:本文为博主原创文章,未经博主允许不得转载。