🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!欢迎志同道合的朋友一起加油喔🤺🤺🤺
目录
前言
哈喽各位友友们,今天给大家带来了抽象类和接口的用法,在这里做了一个精简的总结,希望能给你们带来帮助!
一.抽象类
1.抽象类的概述
如果一个类没有包含足够多的信息来描述一个具体的对象,这样的类就是抽象类.
在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类和抽象方法用abstract关键字来修饰
抽象类: abstract class 类名{}
抽象方法: pubic abstract void eat();//抽象方法中没有方法体
2.抽象类特点(★★★)
1.抽象类中不一定有抽象方法,但是有抽象方法的类必须为抽象类;
2.抽象类不能实例化;
3.抽象类由具体的子类进行实例化;
4.子类必须对父类(抽象类)中的所有抽象方法进行重写
5.在抽象类中可以定义非抽象方法
6.子类如果不重写抽象类中的抽象方法,则该类还是为抽象类
7.抽象类中可以有构造方法,用于子类访问父类时的数据初始化;
8. 抽象类可以声明对象,也可以实现多态。
9.抽象类可以实现接口,可以不重写(实现)其中的抽象方法,交由它具体的子类来实现
代码演示如下:
public abstract class Person {
public void eat(){
System.out.println("团团今天没吃饭!");
}
public abstract void say();
public abstract void sleep();
}
class Student extends Person{
@Override
public void say() {
System.out.println("我喜欢演讲!");
}
@Override
public void sleep() {
System.out.println("我喜欢睡觉!");
}
}
class Demo{
//这是一个main方法,是程序的入口:
public static void main(String[] args) {
//11.创建抽象类的对象:-->抽象类不可以创建对象
//Person p = new Person();
//12.创建子类对象:
Student s = new Student();
s.sleep();
s.say();
3.抽象关键字abstract和哪些不可以共存?
private 冲突 abstract的方法必须被子类重写,而private不能被继承
final 冲突 final修饰的方法,变量都不能修改,而abstract修饰的方法必须被重写
static 不能共存 无意义 static 是静态的,abstract方法中无方法体,无法调用。
4.抽象类的细节
(1)抽象类中是否可以定义非抽象方法?
可以。其实,抽象类和一般类没有太大的区别,都是在描述事物,只不过抽象类在描述事物时,有些功能不具体。所以抽象类和一般类在定义上,都是需要定义属性和行为的。只不过,比一般类多了一个抽象方法。而且比一般类少了一个创建对象的部分。
(2)抽象类中可不可以不定义抽象方法?
可以。抽象方法目的仅仅为了不让该类创建对象。
5.抽象类的作用
有些友友们可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法呢?
确实如此. 但是使用抽象类相当于多了一重编译器的校验.
使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题.
很多语法存在的意义都是为了 "预防出错", 例如我们曾经用过的 final 也是类似. 创建的变量用户不去修改, 不就相当于常量嘛? 但是加上 final 能够在不小心误修改的时候, 让编译器及时提醒我们.
充分利用编译器的校验, 在实际开发中是非常有意义的.
二.接口(★★★★★)
1.什么是接口
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象!
2.接口的语法
1.接口 用关键字interface 修饰
public interface 接口名{}
2.类实现接口用 implements 表示
public class 类 implements 接口 {}
3.接口不能够实例化(不能创建对象)
接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态。
多态的形式:具体类多态,抽象类多态,接口多态。
4.多态的前提:有继承或者实现关系;有方法重写;有父(类/接口引用)指向(子/实现)类对象
5.接口的实现类,要么重写接口中所有的抽象方法、要么是抽象类
3.接口成员的特点
1、成员变量只能是常量;(直接通过接口名称访问即可)
默认修饰符 public static final
2、成员方法只能是抽象方法;(JDK8开始 是可以在接口中定义非抽象方法 是需要加上default关键字修饰,JDK9开始可以在接口中定义私有方法)
默认修饰符 public abstract
3、接口没有构造方法;
因为接口主要对行为进行抽象,没有具体存在,一个类如果没有父类,默认继承自Object类
4.接口和类之间的关系
(1)类和类之间的关系
继承关系,只能单继承,不能多继承,但是可以多层继承.
(2)类和接口的关系
实现关系,可以单实现,也可以多实现,还可以在继承一个类的时候同时实现多个接口.
(如果多个接口中出现同名的抽象方法,实现类在重写的时候只需要重写一次)
(3)接口和接口的关系
继承关系,可以单继承,也可以多继承.
(如果实现类实现了最下面的子接口,那么就需要重写所有接口的抽象方法)
5.接口存在的意义
1、重要性:在Java语言中, class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。
2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。
3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类,可是在不久将来,你突然发现这个类满足不了你了,然后你又要重新设计这个类,更糟糕是你可能要放弃这个类,那么其他地方可能有引用他,这样修改起来很麻烦,如果你一开始定义一个接口,把绘制功能放在接口里,然后定义类时实现这个接口,然后你只要用这个接口去引用实现它的类就行了,以后要换的话只不过是引用另一个类而已,这样就达到维护、拓展的方便性。
4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。