
目录
1.抽象类
2.接口
3.抽象类与接口的联系与区别
1.抽象类
定义: 如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类
这么说可能不好理解,我们来换个说法: 抽象类无法被实例化,也就是我们不能去创建它的对象
例 : 动物类就是一个抽象类,因为你不能说出具体是哪种动物
再来看一个概念 : 抽象方法 • 抽象方法是一种特殊的方法:它只有声明,而没有具体的实现 . • 抽象方法必须用 abstract 关键字进行修饰 . 例 :public abstract void eat();● 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法。 ● 用 abstract 修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义成抽象类。 那为什么抽象类不能被实例化,还会有构造方法呢? 这是因为 : 1. 构造方法具体是为类中属性赋值的,抽象类中是有属性的,我们调用构造为属性赋值 2. java规定类必须有构造方法,如果没有自行定义,那么就是无参的,如果没有构造方法,子类继承抽象类的时候,会先用super调用父类的构造,所以父类肯定得有构造 抽象类的用法 : 抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则,该类也必须声明为抽象类。 注意: 1.继承一个抽象类必须重写里面的所有抽象方法,除非子类也是一个抽象类(例如鸟类继承动物类) 2. 抽象类中不一定有抽象方法, 但有抽象方法的类一定是抽象类 代码示例 :
public abstract class Animals { //动物类
int root; //脚
public Animals() { //无参构造
}
public Animals(int root) { //有参构造
this.root = root;
}
public abstract void eat(); //抽象方法
}
接着给出它的两个子类
public class Dog extends Animals{ //狗类
public Dog(){
super(4); //狗4只脚
}
@Override
public void eat() { //重写eat方法
System.out.println("狗吃狗粮");
}
}
public class Cat extends Animals{ //猫类
public Cat() {
super(4); //猫4只脚
}
@Override
public void eat() {
System.out.println("猫吃猫粮");
}
}
我们说,抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能
2.接口接口的定义:使用 interface 关键字用来声明一个接口。
从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。也就是说,它里面只定义了一些功能,并没有实现,所以也不能被实例化
为什么会有接口?(接口存在的意义) : 因为类只能有一个父类,使用接口我们可以实现多继承这样的逻辑
接口的特性 : • 接口中方法可以是抽象的,静态的,默认的.声明的属性默认为 public static final 的; • 接口不是被类继承了,而是要被类实现。 • 接口不能实例化对象(无构造方法),但可以声明对象的引用。(多态性) • 多个类可以实现同一个接口。 • 一个类可以实现多个接口,但只能继承一个类。 • 与继承关系类似,接口与实现类之间存在多态性。 • 一个接口能继承其它多个接口。 • 当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类。 另外, 在jdk 8 之后 ,我们可以在接口中声明一个default(默认)方法,在类实现这个接口的时候,接口中这个默认的方法也会被继承进类,供我们使用 例 : 我们在上面抽象类 animals 的两个子类里来实现一个接口 定义接口 :public interface Things { //接口
final int count = 10; //常量
void sleep(); //抽象方法
default void setA(){ //默认方法
System.out.println("默认功能");
}
}
两个子类实现 :
public class Dog extends Animals implements Things{ //狗类
@Override
public void eat() {
System.out.println("狗吃狗粮");
}
@Override
public void sleep() {
System.out.println("狗睡狗窝");
}
}
public class Cat extends Animals implements Things{ //猫类
@Override
public void eat() {
System.out.println("猫吃猫粮");
}
@Override
public void sleep() {
System.out.println("猫睡猫窝");
}
}
测试 :
public static void main(String[] args) {
Dog dog = new Dog();
dog.sleep();
dog.setA();
System.out.println(dog.count);
System.out.println("-------------------");
Cat cat = new Cat();
cat.sleep();
cat.setA();
System.out.println(cat.count);
}
运行结果 :
3.抽象类与接口的联系与区别抽象类 与 接口 中都可以定义抽象方法,这些方法都是没有方法体的,也就是需要我们去继承或者实现对应的抽象类或者接口,然后重写这个方法,也就是定义功能
而我们的类只能有一个父类,所以接口的出现,无疑解决了这种单继承的局限性,类是可以去实现多个接口的
另外,抽象类中可以定义普通的方法,接口中也可以定义default方法
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)