一、抽象类*
在了解抽象类之前,需要先了解一下抽象方法。
abstract void fun();
抽象方法需要用abstract来修饰,在有了抽象方法,这个类就可以成为抽象类,也同样需要用abstract来修饰。
接下来看一下抽象类的示例。
对于人类来说,用人类这一个类来描述人类就会比较抽象,只能够描述每一个人都共有的特点而不能更加具体的描述人,所以可以将Peoploe作为一个抽象类,而通过Student和Teacher这样的子类来创建对象。
abstract class People{
String name;
int age;
public People(String name,int age){
this.name = name;
this.age = age;
}//抽象方法
public abstract void talk();
}
class Student extends People{
public Student(String name,int age){
//子类构造方法通过super()调用父类的构造方法
super(name, age);
}
public void talk() {
System.out.println(“学生—>姓名:”+this.name+”,年龄”+this.age);
}
}
class Teacher extends People{
public Teacher(String name,int age){
//子类构造方法通过super()调用父类的构造方法
super(name, age);
}
public void talk() {
System.out.println(“老师—>姓名:”+this.name+”,年龄”+this.age);
}
}
public class Demo{
public static void main(String[] args) {
Student stu = new Student(“dove”, 22);
Teacher tea = new Teacher(“wang”, 32);
stu.talk();
tea.talk();
}
}
结果:
学生—>姓名:dove,年龄22
老师—>姓名:wang,年龄32
二、接口
接口在java中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而继承接口的抽象方法。
下面来看一下接口的示例
通过interface定义了两个接口Fly和Bite,通过Bat类来实现这两个接口
public interface Fly {
public final int speed=1;
public abstract void fly();
}
public interface Bite {
public abstract void bite();
}
public class Bat implements Fly ,Bite {
@Override
public void bite() {
System.out.println("咬");
}
@Override
public void fly() {
System.out.println("飞");
}
public static void main(String[] args) {
System.out.println(Fly.speed);
}
}
接口中的所有成员变量都默认是由public static final修饰的。
接口中的所有方法都默认是由public abstract修饰的。
三、异同
抽象类与接口的相同点:
1.两者都不能实例化
2.抽象类的子类必须重写抽象类中的全部抽象方法,接口的实现类也必须实现
接口中的全部抽象方法,只有这样抽象类的子类和接口的实现类才能够实例化
抽象类与接口的不同点:
1.抽象类中可以有普通方法,而接口中只有抽象方法
2.抽象类中可以有普通变量,而接口中只能是公共的静态的常量
3.接口要实现,抽象类要继承,一个类可以实现多个接口,但只能继承一个抽象类
4.抽象类与子类更多是“is-a”的关系,而接口与实现类更多是“has-a”的关系。
四、小结
虽然两者在语法上存在着不小的差别,但是使用接口也能够实现和抽象类一样的
操作,当子类和父类之间存在有逻辑上的层次结构时,推荐使用抽象类;当用于
不同类之间,定义不同类之间的通信规则,希望支持差别较大的两个或者更多对
象之间的特定交互行为时,应该使用接口。