java抽象类与接口

抽象类

  • 定义:面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。
  • 抽象方法和抽象类用abstract修饰
    • abstract 关键字只能用于普通方法,不能用于 static 方法(以及private修饰的方法,因为子类要重写)或者构造方法中。
    • 格式:访问权限 abstract 返回类型 方法名称(参数)
  • 抽象方法的使用规则:
    • 如果一个方法被声明为抽象方法,所在类也必须是抽象类。
    • 抽象类中既可以有抽象方法也可以有具体方法
      • 抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类
      • 抽象类中可以有零个或多个抽象方法
    • 抽象类的限制:
      • abstract关键字不能与final关键字同时修饰一个类
      • abstract关键字不能与private、static、final等关键字同时修饰一个方法
      • 抽象类不能被实例化,不能创造对象,可以包含成员变量以及构造方法,但不能通过构造方法创建实例,但可在子类创建实例时调用,抽象类里的抽象方法没有方法体,既然没有方法体,就无法进行调用,即无法实例化对象。
    • 子类重写父类时,必须重写父类所有的抽象方法,子类必须写出抽象类中的全部抽象方法,如果子类没有实现父类的抽象方法,则必须将子类也定义为抽象类。
    • 抽象类必须有子类,使用extends继承,一个子类只能继承一个抽象类,
//创建一个图形的抽象类shape
public abstract class Shape {
    public int width; // 几何图形的长
    public int height; // 几何图形的宽
    public Shape(int width, int height) {
        this.width = width;
        this.height = height;
    }
    public abstract double area(); // 定义抽象方法,抽象方法没有方法体 计算面积
}
public class Square extends Shape {
    public Square(int width, int height) {
        super(width, height);
    }
    // 重写父类中的抽象方法,实现计算正方形面积的功能
    @Override
    public double area() {
        return width * height;
    }
}
public class Triangle extends Shape {
    public Triangle(int width, int height) {
        super(width, height);
    }
    // 重写父类中的抽象方法,实现计算三角形面积的功能
    @Override
    public double area() {
        return 0.5 * width * height;
    }
}
public class ShapeTest {
    public static void main(String[] args) {
        Square square = new Square(5, 4); // 创建正方形类对象
        System.out.println("正方形的面积为:" + square.area());
        Triangle triangle = new Triangle(2, 5); // 创建三角形类对象
        System.out.println("三角形的面积为:" + triangle.area());
    }
}

接口

接口的定义:指用interface关键字定义的特殊类,也称为接口类型。
接口的特点:接口的成员没有执行体,是由全局常量和公共的抽象方法所组成。
格式:[修饰符] interface 接口名 [extends 父接口名列表] 静态常量成员变量声明; 抽象方法声明;}

  • 接口的应用:
    • (1)在接口体内可以包含静态常量、抽象方法、内部类、内部接口的定义;
    • (2)接口中的成员变量自动修饰符public static final;
    • (3)接口中的成员方法默认修饰符为public abstract;接口也产生class文件;
    • (4)接口中的成员方法不能被static和final修饰,因为子类要重写所有接口中的方法,如果没有重写所有的抽象方法,那么实现类就是一个抽象类 。
    • (5)接口中不能定义构造方法
    • (6)一个类可以同时实现多个接口
  • 通过implements关键字实现接口
    - class 子类名 implements 接口A, 接口B, … {定义子类成员变量;定义子类成员方法; 实现接口所有抽象方法;}
interface MyInterface{
	double PI=3.14;  // 成员变量,默认修饰符public static
   void show(String msg); // 成员方法,默认修饰符public abstract

}
class  Base implements  MyInterface {
	private int x;
	public Base(int x) {
		this.x=x;
	}
	
// 实现接口中的抽象方法
	public void show(String msg) {
		System.out.println(msg);
	}
}

接口的继承

  • 接口也可以继承,可以使用extends声明一个接口是另一个接口的子接口(接口不能继承类),由于接口的定义的常量和方法都是public的,所以子接口继承全部常量和方法
  • 接口可以实现多重继承(即:父接口可以有多个)
  • 当父类实现了某个接口,则子类也就自然实现了该接口,子类不必在使用关键字implements声明

接口回调

  • 接口回调是指:可以把实现某一接口的类创建的对象的引用,赋给该接口声明的接口变量,那么该接口变量就可以调用被类重写的接口方法。
  • 当接口变量调用被类重写的接口方法时,就是通知相应的对象调用这个方法。

image.png

接口参数

定义:
接口也可以作为一个方法的形式参数类型
若方法的参数是接口类型,则可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法
image.png

接口与抽象类的区别与联系

区别
  1. (1)成员变量:接口里只能定义静态常量,不能定义普通成员变量;抽象类里则既可以定义普通成员变量,也可以定义静态常量属性;
  2. (2)构造方法:接口不包含构造方法;抽象类里可以包含构造方法,抽象类里的构造方法并不是用于创建对象,而让其子类调用这些构造方法来完成抽象类对象的初始化操作;
  3. (3)继承关系:一个类最多只能有一个直接父类,包括抽象类;但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承的不足。
联系
  1. (1)接口和抽象类都不能被实例化,用于被其他类实现和继承;
  2. (2)接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值