文章目录
前言
大家好呀,今天给大家带来抽象类和接口的讲解,那么废话不多说,跟着我一起去学习吧!
1.1抽象类的概念
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果 一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
下面我们定义父类Animal和子类Dog,Cat来画图解释一下
public class Test { public static void main(String[] args) { Dog dog = new Dog(); Cat cat = new Cat(); dog.bark();// 狗叫 cat.bark();// 猫叫 } } abstract class Animal{ /* * Animal是动物类,每个动物都有叫的方法。 * 但由于Animal不是具体的动物,所以叫的方法无法具体实现 * 那么我们该在方法中写什么好? * 写什么都是没用的,因为父类Animal的bark方法无法描述所有动物的叫! * 狗和猫的叫不同,狮子和大象等都不同 * 那么既然无法实现,不如直接定义为抽象类!让子类重写抽象方法 * 让子类自己去实现方法! * */ public abstract void bark(); } class Dog extends Animal{ @Override public void bark() { System.out.println("狗叫"); } } class Cat extends Animal{ @Override public void bark() { System.out.println("猫叫"); } }
想象一个大人他有很多个子女,有一天他们家家宴
我们定义一个eat方法
大人们吃饭很快,吃完了,没出现在照片上,所以大人们的eat方法中应该写(吃得快)
大儿子是顺时针第三个,吃的很斯文,所以我们可以写(吃的斯文)
小儿子是顺时针第一个,吃得慢,所以可以写(吃得慢)
子女是大人们的孩子,我们让大人为父类,子女为子类,在这个场景中,父类的eat方法无法描述所有子类,所以子类需要重写eat,父类无法描述具体的对象(父亲是大人,母亲也是,叔叔....),直接可以定义为抽象类,宝子们,懂了没?
1. 2抽象类的语法
在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用给出具体的实现(既不需要方法体)。
抽象类也是类的一种,也是可以有普通成员变量和方法
1.3抽象类的特性
1.3.1抽象类不能直接实例化对象
抽象类无法描述具体的对象,实例化没有意义,所以java不允许实例化
这是语法,理解着去记,实例化出来也没用那为何要实例化呢?
这时候可能就有人说了,我如果就要实例化呢?
在这里我送你两句话
1.想写bug没人能拦你,
2.不过既然你问了这个问题,我还是会给出解决办法地,可以用匿名内部类(本质上其实就是重写了抽象方法)想要了解吗? 见下回分解
1.3.2抽象方法不能被private,final和static修饰
在这里你可能会疑问private是什么,那么.....
懂了吧!
private是访问修饰限定符,被修饰后抽象方法只能在本类中才有权限访问
举个例子吧,从前有个小孩叫张三,张三的爸爸叫李四,李四有一笔私房钱,那么请问,李四构不构成犯罪?
好吧扯远了,张三可以用李四的压岁钱吗?
我明确地告诉你,不可以,因为李四的money是私有的,只能李四自己用!
final修饰的方法表示最终的方法,不能重写
static为什么不能修饰抽象方法?
不知阁下可否知道static修饰的是东西属于类的(不知道的话可以去看static详解),在类加载的时候就被加载了
那么类的东西可以被继承吗?是不可以的
static修饰的东西是类的一部分,假如类是个
那么static修饰的东西可以是一面墙,一个地板,无法被继承
1.3.3 抽象类的子类要么也是抽象类,要么重写所有抽象方法
怎么理解? 动物可以有子类陆生和水生,显然这两个子类都是抽象类
动物也可以是狗和猫,显然,这两个类都不是抽象类
我们以水生和狗来举例
1. 3.4 抽象类不一定含有抽象方法,但是含有抽象方法的内一定是抽象类(上图)
1.3.5 抽象类中可以有构造方法,供子类创建对象时,为父类初始化
1.4抽象类的作用
抽象类本身不能被实例化, 要想使用, 只能创建该抽象类的子类. 然后让子类重写抽象类中的抽象方法. 有些同学可能会说了, 普通的类也可以被继承呀, 普通的方法也可以被重写呀, 为啥非得用抽象类和抽象方法 呢? 确实如此. 但是使用抽象类相当于多了一重编译器的校验. 使用抽象类的场景就如上面的代码, 实际工作不应该由父类完成, 而应由子类完成. 那么此时如果不小心误用成父类 了, 使用普通类编译器是不会报错的. 但是父类是抽象类就会在实例化的时候提示错误, 让我们尽早发现问题. 很多语法存在的意义都是为了 "预防出错",充分利用编译器的校验, 在实际开发中是非常有意义的.
2.1 接口的概念
接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型。
2.2 语法规则
接口的定义与类基本相同,将class换成interface即可
2.3 接口的使用
接口不能直接使用,必须要有一个实现类来实现接口,实现接口中所有的抽象方法
2.4 接口的特性
1. 接口类型是一种引用类型,但是不能直接new接口的对象
2.. 接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract)
3.接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量
2.5 接口的多实现和接口间的多继承
类可以实现多个接口
这里就不过多讲解了,很简单的,大家可以自己试试
除此之外,接口之间还可以多继承,即接口可以继承多个接口,大家了解即可
有兴趣的话,不妨自己试试
2.6 抽象类和接口的区别
抽象类和接口都是 Java 中多态的常见使用方式. 都需要重点掌握. 同时又要认清两者的区别(重要!!! 常见面试题).
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中 不能包含普通方法, 子类必须重写所有的抽象方法.
总结
以上就是今天要讲的内容,本文重点介绍了抽象类简单介绍了接口,抽象类和接口中提供了大量能使我们快速便捷地处理数据的函数和方法,值得我们去重点掌握。