【JavaSE】Java入门七(抽象类和接口详解)

发布时间:2023年12月19日

目录

抽象类和接口?

1. 什么是抽象类

2.抽象类的特点

3.什么是接口

4.详解接口中的static,default,public abstract方法

5.抽象类和接口的区别(面试题)


抽象类和接口?

? ? ? ? 我们知道,Java中的类是对对象的描绘,就像现实中对具体事物的描绘一样,但现实中有一些词语只有抽象的含义,没有具体的事物,在Java中也有这样的描绘(不能描绘对象),便是抽象类和接口,接口可以理解为更加抽象的抽象类,下面我来为大家详解一下两者以及两者的区别。

1. 什么是抽象类

abstract修饰的类称为抽象类,语法格式如下:

// 抽象类:被abstract修饰的类
public abstract class Shape {
// 抽象方法:被abstract修饰的方法,没有方法体
abstract public void draw();
abstract void calcArea();
// 抽象类也是类,也可以增加普通方法和属性
public double getArea(){
return area;
}
protected double area; // 面积
}

抽象类中可以包含被abstract修饰的抽象方法,抽象方法在抽象类中仅仅被声明,具体的实现代码可以在继承他的类中被实现。?

注意:抽象类也是类,内部可以包含普通方法和属性,甚至构造方法

2.抽象类的特点

  1. 抽象类不能直接实例化对象
  2. 抽象方法不能是private的
  3. 抽象方法不能被final和static修饰,因为抽象方法要被子类重写
  4. 抽象类必须要被继承,并且继承后子类要重写父类中的抽象方法,否则子类也是抽象类必须用abstract修饰
  5. 抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类
  6. 抽象类中可以有构造方法,供子类创建对象时,初始化父类的成员变量

抽象类在实例化对象时会直接在编译层面报错。

3.什么是接口

? ? ? ?Java中类不能实现多继承,为了让一个类继承多个类型,Java中引入了接口,接口也是一种引用数据类型,可以把他当做比抽象类更抽象的引用数据类型

interface定义的类被称为接口,语法格式如下:

public interface 接口名称{
// 抽象方法
public abstract void method1(); // public abstract 是固定搭配,可以不写
public void method2();
abstract void method3();
void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

接口的设计者们在设计接口时就是为了让他被继承,所以最初版的接口之中只能有被public??abstract修饰的方法和被public static final修饰的变量,在之后的jdk发展中引入了可以被static和default修饰的方法。因为初版接口内默认只有这两种东西,所以我们在使用时一般省略public abstract和public static final。

接口可以被类实现多继承,接口和接口之间也可以实现多继承

  • 类继承接口通过implements关键字
    class Duck extends Animal implements IRunning, ISwimming, IFlying{
    ...
    }
  • 接口之间继承通过extends关键字
    interface IAmphibious extends IRunning, ISwimming {
    ...
    }
    class Frog implements IAmphibious {
    ...
    }

?tips:一个类实现多个接口时,每个接口中的抽象方法都要实现,否则类必须设置为抽象类

4.详解接口中的static,default,public abstract方法

在JDK8之前接口中的方法类型只有public abstract方法,在JDK8之后接口中可以添加default或者static修饰的方法。

public abstract:不能拥有自己的方法实现,具体实现完全交给实现类自己完成。

default:default修饰方法只能在接口中使用,在接口中这种方法被称为普通方法,可以直接写方法体。该方法有三种使用途径。

  1. 实现类继承接口中的default方法,如果接口中有default方法,则会被继承。
    public interface demo {
    	public default void demoFun(){
    		System.out.println("我是接口");
    	}
    }
    public class Test implements demo {
    	
    }
    public class Test2 {
    	public static void main(String[] args) {
    		Test t = new Test();
    		t.default();
    	}
    }
  2. ?如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

    public interface A {
    	public default void c(){
    		System.out.println("方法A");
    	}
    }
    public interface B {
    	public default void c(){
    		System.out.println("方法B");
    	}
    }
    public class Test implements A,B {
    	@overried
    	public default void c(){
    		System.out.println("方法A,B");
    	}
    }
  3. ?如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么继承的方法覆盖了实现接口的b方法。

    public interface A {
    	public default void b(){
    		System.out.println("A方法");
    	}
    }
    public class C {
    	public void b(){
    		System.out.println("C方法");
    	}
    }
    public class Test extends C implements A{
    
    }
    Test test=new Test();
    test.b()
    
    输出值为:C方法

static: 用法和普通的类中的static方法一样(里面可以有方法体),可以被接口名直接调用使用。

5.抽象类和接口的区别(面试题)

核心区别 : 抽象类中可以包含普通方法和普通字段 , 这样的普通方法和字段可以被子类直接使用 ( 不必重写 ), 而接口中不能包含普通方法, 子类必须重写所有的抽象方法

?

文章来源:https://blog.csdn.net/2203_75565612/article/details/134981715
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。