抽象类与接口简述

抽象类

为什么使用抽象类
  • 有些类创建对象不具体,需要把这个定义为抽象类
    • Animal animal = new Animal();
    • Pet pet = new Pet();
  • 使用abstract修饰类变成抽象类:不能实例化,只能被继承
  • 抽象类的构造方法不能直接使用,只能被子类调用
abstract抽象类
  • 关键字:abstract 抽象
  • 修饰类:类变成抽象类,类中可以有抽象方法也可以有非抽象方法,不能实例化
  • 修饰方法:变成抽象方法,只能在抽象类和接口中,且抽象方法没有方法体,只能被子类继承重写
  • 子类必须重写抽象类中方法,除非子类是抽象类
示例
package waking.test.ai;
/**
 * 抽象类
 * @author waking
 *
 */
public class Day01 {
	public static void main(String[] args) {
		//抽象类没法实例化
//		Animal animal = new Animal();
		
		//通过子类实例化
		Animal animal = new Pet();
		animal.sleep();
	}
}
abstract class Animal{
	public abstract void sleep();
}
class Pet extends Animal{

	@Override
	public void sleep() {
		System.out.println("睡觉");
	}
	
}

抽象类和普通类的区别
  • 抽象类需要abstract修饰,普通类不需要
  • 构造方法:都用,但是抽象类不能实例化对象,普通类可以
  • 成员方法:抽象类中可以存在抽象方法也可以存在非抽象方法,而普通类只能存在非抽象方法
package waking.test.ai;
/**
 * 抽象类和普通类
 * @author waking
 *
 */
public class Day02 {
	//普通方法
	public void stady() {}
}
abstract class Person{
	//抽象类中的普通方法
	public void stady() {
		
	}
	//抽象方法
	public abstract void sleep();
}
  • 思考:final和abstract可以同时使用吗?
static、final、abstract

修饰符 修饰对象 规则
static 属性 表示类的公共属性,使用类来调用,推荐使用类名.属性名来调用
static 方法 表示类的公共方法,使用类来调用,静态方法中只能调用静态方法和静态属性,不能使用this和super,如果非要调用非静态方法和属性只能创建对象
static 代码块 静态代码块,随着类的加载而加载,且只能运行一次
final 属性 变量变成常量,表示最终的,不能被重新赋值
final 方法 表示最终的方法,能被继承不能被重写
final 该类不能被继承,表示最终的类
abstract 方法 抽象方法,没有方法体,构造方法和final、static不能是抽象方法,存在抽象类或接口中
abstract 抽象类,该类可以有抽象方法和非抽象方法,抽象类不能实例化,必须被子类继承

接口

  • 生活上接口很多,USB,插座等
  • java中用interface修饰的称为接口
概念
  • 从语法上讲:接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现
  • 从功能上讲:接口表示一种约定(规范)或能力
使用接口的好处
  • 扩展类的功能,保持对外接口一致
  • 接口实现了多重继承,完成类和任何实现接口子类的通信和交互
  • 降低代码之间的耦合性
接口的特点:
  • 接口不能创建对象,接口中没用构造方法
  • 接口中的方法一般都是公有抽象方法:public abstract
  • 接口中所有的属性都是公有静态常量属性:public static final
  • 注意:在一个接口中声明方法时,若没有声明访问权限,默认也是public,若没有其他修饰默认也是abstract;声明属性时,若没有声明访问权限和静态常量,默认也是public static final
package waking.test.ai;
/**
 * 接口
 * @author waking
 *
 */
public interface USBable {
	
	//公开静态常量
	public static final int NUM = 10;
	
	//公开抽象方法
	public abstract void usb();
	
}
  • 注意:interface关键字表示接口,和class同级
接口的分类
  • 普通接口:在接口中可以声明抽象方法,和静态常量属性
  • 常量群接口:在接口中只声明一组静态常量属性
  • 标志性接口:在接口中没有抽象方法,也没有静态常量,作用为了标记某个类具有某种功能
接口和接口的关系
  • 继承关系:使用extends实现接口与接口中的继承关系
接口继承的特点:
1、接口中没有私有成员,所以父接口中所有的成员都会被子接口继承
2、父子关系都是接口,所以在子接口中不需要实现任何的抽象方法
3、接口可以多继承
接口中特殊的方法
  • jdk1.8之后接口中使用static关键字修饰的方法有方法体
  • 静态方法需要有方法体,注意只能通过接口名.方法名调用,因为不能被继承
  • jdk1.8之后接口中使用default关键字修饰的方法有方法体可以被继承,通过实现类调用
package waking.test.ai;
/**
 * 抽象类
 * @author waking
 *
 */
public class Day01 {
	public static void main(String[] args) {
		//抽象类没法实例化
//		Animal animal = new Animal();
		
		//通过子类实例化
		Animal animal = new Pet();
		animal.sleep();
	}
}
abstract class Animal{
	public abstract void sleep();
}
class Pet extends Animal{

	@Override
	public void sleep() {
		System.out.println("睡觉");
	}
	
}
抽象类和接口区别
  • 语法:
    • 抽象类使用abstract,接口使用interface
    • 抽象类中可以包含抽象方法,也就可以包含非抽象方法,接口中只能包含抽象方法和静态常量,jdk1.8之后接口可以包含静态方法和默认方法
    • 抽象类和接口都不能实例化
    • 抽象类可以包含构造方法,接口中没有构造方法
  • 功能:
    • 抽象类一般用来表示同事物,接口可以表示不同类事物
    • 抽象类可以实现代码的重用,也可以约束之类的功能。接口就是约束实现类的功能,降低耦合性
  • 使用场景
    • 程序或模块内部使用抽象类
    • 程序架构或模块之间使用接口
感谢您的观看
发布了16 篇原创文章 · 获赞 15 · 访问量 2388

猜你喜欢

转载自blog.csdn.net/weixin_43688349/article/details/104141505