当前位置:首页 » 编程语言

【Java笔记】——抽象类和接口

2015-08-30 20:07 本站整理 浏览(150)

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

抽象类概念

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

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