前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JavaSE】Java入门七(抽象类和接口详解)

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

作者头像
小皮侠
发布2024-04-08 20:38:18
1800
发布2024-04-08 20:38:18
举报
文章被收录于专栏:Java学习从基础到就业

抽象类和接口

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

1. 什么是抽象类

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

代码语言:javascript
复制
// 抽象类:被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定义的类被称为接口,语法格式如下:

代码语言:javascript
复制
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关键字

代码语言:javascript
复制
class Duck extends Animal implements IRunning, ISwimming, IFlying{
...
}

接口之间继承通过extends关键字

代码语言:javascript
复制
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修饰方法只能在接口中使用,在接口中这种方法被称为普通方法,可以直接写方法体。该方法有三种使用途径。

实现类继承接口中的default方法,如果接口中有default方法,则会被继承。

代码语言:javascript
复制
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();
	}
}

如果一个类同时实现接口A和B,接口A和B中有相同的default方法,这时,该类必须重写接口中的default方法

代码语言:javascript
复制
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");
	}
}

如果子类继承父类,父类中有b方法,该子类同时实现的接口中也有b方法(被default修饰),那么继承的方法覆盖了实现接口的b方法。

代码语言:javascript
复制
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.抽象类和接口的区别(面试题)

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抽象类和接口
    • 1. 什么是抽象类
      • 2.抽象类的特点
        • 3.什么是接口
          • 4.详解接口中的static,default,public abstract方法
            • 5.抽象类和接口的区别(面试题)
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档