一、抽象类
在面向对象领域中一切都是对象,所有的对象都是用类来描述的,但不是所有的类都可以用来描述对象,比如抽象类。
如果一个类没有具体的信息来描述对象,而需要其他更具体的子类来支撑,那么这个类就是抽象类。好比 new animal();只知道他是动物类,而不知道他具体描述的是哪些动物,也不知道这些动物长什么样,所以他就是抽象类,这时候就需要一些更具体的子类来描述他,比如猫、狗这些知道具体长相的动物。
因为抽象概念没有具体的概念,所以抽象类不能被实例化。
抽象类定义了一组抽象的方法,他需要子类来继承(extends) 他,否则他没有实际的意义。
使用抽象类应注意下面几点:
1、抽象类不能直接实例化,实例化只能有继承他的子类来完成。
2、抽象方法必须由子类来重写。(重写:返回值、方法名、形参都不能改变!只能修改方法的核心内容)
3、只要包含有一个抽象方法的类就是抽象类,他可以包含其他具体的方法,也可以没有,只有抽象方法。
4、抽象方法只能用 public 来修饰。
public abstract class Animal{
//定义抽象类Animal和抽象方法cry()
public abstract void cry(){
}
//定义一个子类cat继承Animal
public class cat extends Animal{
//在子类cat中重写抽象方法cry()
@Override
public void cry(){
System.out.println("喵喵");
}
}
//定义一个子类dog继承Animal
public class dog extends Animal{
//在子类dog中重写抽象方法cry()
@Override
public void cry(){
System.out.println("汪汪");
}
}
}
public class Demo {
public static void main(String[] args) {
//实例化cat()对象
Animal a1 = new cat();
//实例化dog()对象
Animal a2 = new dog();
//分别在子类中调用cry()方法
a1.cry();
a2.cry();
}
}
二、接口
接口只是一种形式,没有具体的实现,接口中提供了一些方法来声明他是怎么工作的,也就是接口的作用。
我们通常说用类来实现接口提供的所有方法,使用implements 关键字。
接口可以看作是类的延伸,因为在 Java 中为了保证数据的安全是不能够多重继承的,也就是说一个子类只能继承一个父类,也就限制了子类功能的实现,但一个子类可以实现多个接口,不管这个接口有没有关系,所以接口可以弥补抽象类中不能多重继承的缺陷,接口和继承可以同时使用,这样既可以保证数据的安全性又可以实现更多的功能。
使用接口应该注意以下几点:
1、接口(interface)中所有方法的访问权限声明都只能用 public ,否则会报错。
2、接口中所有的方法都是抽象的,不存在实现的方法。
3、接口中只可以定义不可变的常量(public static final)
4、实现接口的非抽象类必须实现该接口的所有方法
三、抽象类与接口的区别
在抽象类中,可以定义任意范围的成员数据,也可以有非抽象方法(可以实现的方法)。在接口中,只能定义静态的,不可修改的成员数据(一般不在接口中使用成员数据),接口中的全部方法都必须是抽象的。
抽象类:
public abstract class Demo {
abstract void method1();
//可以实现
void method2(){
}
}
接口:
interface Demo {
void method1();
void method2();
}