Java基础(12)——抽象类与接口


版权声明

  • 本文原创作者:清风不渡
  • 博客地址:https://blog.csdn.net/WXKKang

一、抽象类

  抽象类不能被直接实例化,因此它一般作为其他类的父类,与final类正好相反

1、抽象类

  用abstract修饰一个类时,该类叫做抽象类,语法如下:

public abstract class 类名{
}

2、抽象方法

  用abstract修饰一个方法的时候,该方法叫做抽象方法。并且抽象方法只能在抽象类中定义,它只有方法声明,没有方法体,语法如下:

public abstract class 类名{
	public abstract 返回值类型 方法名([参数类型 参数1,参数类型 参数2...参数类型,参数n]);
}

3、抽象类特点

  现将抽象类的特点罗列如下:

  • 抽象类中不一定有抽象函数
  • 抽象方法只能在抽象类中定义
  • 抽象类不能直接创建实例,只能通过子类创建实例
  • 编译器强制子类实现抽象父类中的抽象方法。如果子类也是抽象类则可不实现

4、final、static、private、abstract使用细节

  因为这些关键字都各有各的特点,所以我们在使用的时候需注意一些逻辑上的细节,现将它们罗列如下:

  • final、static、private都不可以和abstract一起使用,理由如下:
  • final修饰类表示类不可以被子类继承,修饰方法表示不可以被重写;abstract表示类不可以被实例化,表示方法用于被子类重写
  • static表示方法可以用类名直接调用;abstract表示方法没有方法体实现,不能被直接调用。它不可以和static定义同一方法
  • private表示方法只能在本类中使用,abstract表示方法用于被子类重写。它不可以和private定义同一方法

二、接口

1、引入

  由于Java为了避免多重继承的复杂性,只支持单继承,为了实现类似于多继承的效果,Java提供了接口来拓展类的功能,弥补Java中单继承的缺点

2、语法

  接口就是抽象方法和常量值定义的集合,语法如下

[public] interface interfaceName [extends SuperInterfaceList]{
	常量属性;
	抽象方法;
}

注意:

  • 关键字interface
  • 方法只有声明,没有定义
  • 接口中的所有属性:默认修饰符是public static final
  • 接口中的所有方法:默认修饰符是public abstract

示例:

public interface InterfaceDemo{
	//常量
	public static final int NUMBER = 100;
	//方法
	public abstract add(double num1,double num2);
	public abstract subtract(double num1,double num2);
}

  从本质上来讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现

3、接口的实现

  我们知道,类与类之间是继承关系,那么类与接口之间又是什么关系呢?接口与类之间是实现关系,类实现接口需要使用implements 关键字,并且一个类可以实现一个或多个接口
  如果是实现多个接口的话,各个接口名之间只需要使用逗号(“,”)隔开即可,这样这个类就“继承”了多个接口中的属性和方法,并且一个类可以同时进行继承类和实现接口,示例如下:

  人类代码:

package cn.com;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public class People {
	//公有属性
	public String name;
	public String age;
	
	//people类构造函数
	public People() {
		super();
		
	}
	
	//普通方法
	public void speak() {
		System.out.println("people can speak !!");
	}
	
	public void play() {
		System.out.println("人们可以玩很多好玩的");
	}
}

  学习接口代码:

package cn.com;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public interface Study {
	
	//常量属性
	public static final String STRING = "学生在学习";
	
	//抽象方法
	String studyEnglish();
	
}

  学生类:继承人类并实现学习接口:

package cn.com;
/*
原创作者:清风不渡
博客地址:https://blog.csdn.net/WXKKang
*/
public class Student extends People implements Study{
	
	//学号  学生自有的属性
	public String studentId;

	//无参构造函数
	public Student() {
		super();
	}
	
	//学习方法
	public void study() {
		//通过super关键字调用父类speak方法
		super.speak();
		System.out.println("学生需要学习很多知识");
	}
	
	//重写父类play方法
	@Override
	public void play() {
		System.out.println("学生不能玩呀,要加班写作业嘞");
	}
	
	//实现study接口的方法
	@Override
	public String studyEnglish() {
		return "学生在学习英语";
	}
}

  总结:

  • 接口中没有构造方法
  • 接口中定义的所有属性的默认修饰符为public static final,即静态常量
  • 接口中定义的所有方法的默认修饰符为public abstract。即抽象方法
  • 由于接口中定义的所有方法默认都是抽象的,所以接口不能被实例化
  • 有抽象方法的不一定是抽象类,也可能是接口
  • 类可以通过implements 实现接口,一个类可以实现多个接口
  • 如果类没有实现接口中的所有方法,那么类必须是抽象类
  • 如果在类中访问接口中的属性,不能使用super关键字,因为两者之间没有显示的继承关系。可以使用接口名.属性名直接访问
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值