现在开发的主流都是面向对象,面向过程几乎已经被淘汰了。理解面向对象,就要知道它的三大特性,多态继承和封装。在学习面向对象的过程中,总是会接触到抽象类和接口,涉及到继承和实现,而这两个概念又总是傻傻分不清楚。不过经过不懈努力,还是解决的差不多了。下面就来介绍下抽象类和接口:


抽象类


概念


用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中,一个类只能继承一个父类或抽象类,但是它可以实现多个接口,这也是抽象类和接口的不同之处。


总结

多态有三个特点:要有继承、要有重写、父类引用指向子类的对象,抽象类和接口体现多态也是体现在这三个方面。它们两个不是一对矛盾的概念,而是各有各的特点。两个概念和实现类之间的关系不同,一个是继承,一个是实现。在上述例子中也能体会到,接口比抽象类更灵活,原因就在于二者继承、实现的区别,实现比继承灵活,自然接口也就比抽象类灵活。

更多相关文章

  1. 避免在Java接口中使用数组的3个理由
  2. C#/Java 调用WSDL接口及方法
  3. Javadoc转换chm帮助文档的四种方法总结
  4. 最新Eclipse配置Android开发环境SDK 并安装JellyBean 4.3的方法
  5. Android 两种制作圆形/圆角图片的方法
  6. 在android中运行java main方法
  7. 第三部分:Android 应用程序接口指南---第二节:UI---第六章 对话框
  8. android studio 无法调试安装到小米手机解决方法
  9. OpenGL es 2.0使用shadow mapping方法制作阴影时,阴影穿透实体现

随机推荐

  1. Android(安卓)Java包各种功能概览
  2. 更改Android AVD模拟器创建路径位置的方
  3. Android高手进阶教程(十一)之----Android
  4. Android中关于android:imeOptions="actio
  5. Android(安卓)上层应用读写设备节点
  6. Android(安卓)Studio导入SlidingMenu类库
  7. linux公社大量免费的在线android资料
  8. 处女男学Android(十五)---Android 广播机制
  9. 总结系列-硬件加速
  10. Android音频开发(1):基础知识