
作者:敲代码の流川枫
博客主页:流川枫的博客
专栏:和我一起学java
语录:Stay hungry stay foolish
工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网
目录
概念:一个类没有足够的信息去描述一个具体的对象时,这个类就是一个抽象类
语法:一个被abstract修饰的类称为抽象类,抽象类中被abstract修饰的方法称为抽象方法,抽象方法不用给出具体的实现体
格式:

示例:

- abstract class Shape{
- abstract public void draw();
- abstract void calcArea();
-
- public double getArea(){
- return area;
- }
- protected double area;
- }
抽象方法没有方法体
抽象类也可以增加普通方法与属性、构造方法
1.抽象类不能实例化

2.抽象方法不能是 private 修饰

3.抽象方法需要被子类继承,因此不能被final和static修饰

报错:
Illegal combination of modifiers: 'abstract' and 'final'
Illegal combination of modifiers: 'final' and 'abstract'
4.抽象类必须被继承,且子类必须重写父类的抽象方法,否则子类也是抽象类
- abstract class Shape{
- abstract public void draw();
- abstract void calcArea();
-
- public double getArea(){
- return area;
- }
- protected double area;
- }
- class Circle extends Shape{
- private double r;
- final private static double PI = 3.14;
-
- public Circle(double r) {
- this.r = r;
- }
-
- @Override
- public void draw() {
- System.out.println("圆形:r"+r);
- }
-
- @Override
- void calcArea() {
- area = PI*r*r;
- }
- @Override
- public double getArea() {
- return super.getArea();
- }
- }
5.抽象类中不一定包含抽象方法,有抽象方法的类一定是抽象类
6.抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量
在继承一个类后,如果是继承普通类,没有重写方法不会报错,如果继承抽象类,没有重写父类方法是会报错的,利用编译器的校验, 在实际开发中是非常有意义
接口就是公共的行为规范标准,实现时,只要符合规范标准,就可以通用
电子产品的USB、电源插座等
Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型
语法:
接口的定义与类基本相同,关键字:interface
1. 创建接口时, 接口的命名一般以大写字母I开头
2. 接口的命名一般使用 "形容词" 词性的单词
- public interface Inter {
- //抽像方法
- void method();
- }
接口是不能直接使用的,要定义具体类来实现接口中的所有抽象方法

关键字:implements
注意:子类和父类之间是extends 继承关系,类与接口之间是 implements 实现关系
格式:
- public class 类名称 implements 接口名称 {
- //...
- }
1.接口类型不能直接实例化,就是new对象

2. 接口中的方法会被隐式的指定为public abstract,其他修饰符会报错

3.接口中的方法由实现接口的类来实现

4.重写接口中方法时,不能使用default访问权限修饰

报错: 'A'中的'openDevice()'与'USB'中的'openDevice()'冲突;试图分配较弱的访问权限('package-private');“公共”
5.接口中的变量会被隐式的指定为public static final变量

6. 接口不能有静态代码块和构造方法

7. 接口编译完成后字节码文件的后缀格式是.class

8. 类必须实现接口中的所有的抽象方法,否则类必须设置为抽象类

报错:类“A”必须被声明为抽象,或者在“USB”中实现抽象方法“USB()”
继承是单继承的,但是一个类可以实现多个接口
看一个例子:
- public class Test {
- public static void main(String[] args) {
- dragon drag = new dragon("dragon");
- drag.fly();
- drag.swim();
- }
-
- }
-
- //定义一个动物类
- class Animal{
- protected String name;
-
- public Animal(String name){
- this.name = name;
- }
- }
- //定义接口
-
- interface IFlying{
- void fly();
- }
-
- interface ISwimming{
- void swim();
- }
- //定义鸟类
-
- class Bird extends Animal implements IFlying{
- public Bird(String name) {
- super(name);
- }
-
- @Override
- public void fly() {
- System.out.println(name+"正在用翅膀飞");
- }
- }
- //定义鱼类
-
- class Fish extends Animal implements ISwimming {
- public Fish(String name) {
- super(name);
- }
-
- @Override
- public void swim() {
- System.out.println(name+"正在用尾巴游");
- }
- }
- //定义龙类
-
- class dragon extends Animal implements ISwimming,IFlying{
- public dragon(String name) {
- super(name);
- }
-
- @Override
- public void fly() {
- System.out.println(name+"正在腾云驾雾");
- }
-
- @Override
- public void swim() {
- System.out.println(name+"正在海里游");
- }
- }

注意:一个类实现多个接口,必须要实现所有的抽象方法,否则要设置为抽象类
类和类是单继承的,接口之间可以多继承
关键字:extends
- interface IAmphibious extends IFlying,ISwimming{
- @Override
- void fly();
- @Override
- void swim();
- }
- class dragon1 extends Animal implements IAmphibious{
-
- public dragon1(String name) {
- super(name);
- }
- @Override
- public void fly() {
- //...
- }
- @Override
- public void swim() {
- //...
- }
- }
注意:接口间的继承相当于多个接口合并
核心区别: 抽象类中可以包含普通方法和普通字段, 这样的普通方法和字段可以被子类直接使用(不必重写), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法
抽象类的存在是为了让编译器更好的校验❌
语法上的区别:
1.抽象类的成员变量是无限制的,接口中的成员变量只能是public static final类型的
2.抽象类可以提供成员方法的实现细节,接口中只能存在public abstract 方法
3.抽象类可以有静态代码块和静态方法,接口中不能含有静态代码块以及静态方法
4.一个类只能继承一个抽象类,一个类却可以实现多个接口
“ 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!
