JAVA中抽象类与接口的异同【超级全面】

前言:抽象类与接口是学习java基础的一个难点,也是必须要掌握的一个重要知识点,本文就介绍了抽象类与接口的重点知识


目录

一、抽象类与接口的概念

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

三、 java8中关于接口的新规范


概念:超类声明一个方法但不提供实现,该方法的实现由子类提供。这样的方法称为抽象方法。有一个或更多抽象方法的类称为抽象类,抽象类是对整个类整体进行抽象,包括属性、行为

1、abstract:抽象的
2、abstract可以用来修饰的结构:类、方法

3、abstract修饰类:抽象类
    >此类不能实例化
    >抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
    >开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作

 4、abstract修饰方法:抽象方法
     >抽象方法只有方法的声明,没有方法体
    >包含抽象方法的类一定是一个抽象类。反之,抽象类当中可以没有抽象方法
    >若子类重写了父类当中所有的抽象方法,则此子类方可实例化;

    >若子类没有重写父类中所有的抽象方法,则子类仍是一个抽象类,需要abstract修饰
    >抽象类是为了继承而存在的,所有子类不能全部都是抽象类,这样的话与面向对象编程就相违背。一定要有能够实现所有抽象方法的普通类
 
 【!!!】

5、同名同参数的方法要么都声明为非static的(才考虑重写),要么都声明为static的(不是重写)
  
 6、abstract使用上的注意点:
     >abstract不能用来修饰:属性,构造器等
     >abstract不能用来修饰私有方法、静态方法、final修饰的方法、final修饰的类
 
 

abstract class Person  {
	String name;
	int age;


	// 有大括号就不能称为是抽象方法
	public void eat1() {
		System.out.println("人会吃饭");
	}

    //抽象方法
	public abstract void eat();

    //普通方法
	public void waik() {
		System.out.println("人会走路");
	}

}

概念:接口是对行为的抽象,也可以说是对类局部(行为)的抽象。

 接口的使用
  1.接口使用interface来定义
  2.Java中,接口和类是并列的两个结构
  3.如何定义接口:定义接口中的成员
         3.1 JDK7以及以前,只能定义全局常量和抽象方法
                全局常量:public static final修饰,但是书写时可以省略不写
               抽象方法:public abstrac修饰
          3.2 JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法
 
  4.接口中不能定义构造器,说明接口不可实例化

  5.Java开发中,接口通过让类去实现(implements)的方式来使用的
         >如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
         >如果实现类没有覆盖接口中所有的抽象方法,则此实现类仍是一个抽象类

  6.Java类可以实现多个接口----->弥补了Java单继承的局限性
         格式:class A extends superclass implements B,C,D
  7.接口与接口之间是允许多继承的

   接口的使用:
 * 1.接口使用上也满足多态性
 * 2.接口,实际上就是定义了一种规范

 
public class USBTest {
	public static void main(String[] args) {
		Computer com = new Computer();

		// 1.创建了接口的非匿名实现类的非匿名对象
		Flash flash = new Flash();
		com.transferData(flash);
		System.out.println("--------------");

		// 2.创建了接口的非匿名实现类的匿名对象
		com.transferData(new Printer());
		System.out.println("--------------");

		// 3.创建了接口的匿名实现类的非匿名对象
 
		USB u = new USB() {
			@Override
			public void start() {
				System.out.println("手机开始工作");

			}

			@Override
			public void stop() {
				System.out.println("手机结束工作");
			}

		};
		com.transferData(u);
		System.out.println("--------------");

		// 4.创建了接口的匿名实现类的匿名对象
		com.transferData(new USB() {

			@Override
			public void start() {
				System.out.println("mp3开始工作");

			}

			@Override
			public void stop() {
				System.out.println("mp3结束工作");

			}

		});

	}
}

class Computer {
	public void transfer data(USB usb) { 
		usb.start();
		System.out.println("具体传输数据的细节");
		usb.stop();
	}
}

interface USB {
	// 常量:定义了长、宽、最大最小的传输速度等
	public static final int MAX_SPEED = 1270;

	void start();

	void stop();
}

class Flash implements USB {

	@Override
	public void start() {
		System.out.println("U盘开启工作");

	}

	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}

}

class Printer implements USB {

	@Override
	public void start() {
		System.out.println("打印机开启工作");

	}

	@Override
	public void stop() {
		System.out.println("打印机结束工作");

	}

} 

 

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

1、联系

两者都不能实例化

都可以包含抽象方法

2、区别

接口是对行为的抽象。抽象类是对类整体进行的抽象;

类与类之间是单继承的,但类与接口之间是多继承,一个类可以实现多个接口;

接口中除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法(jdk8及以后),

而抽象类当中可以定义抽象方法也可以没有抽象方法,抽象类的成员变量有默认值,可以在子类中被重新赋值或被重新定义

接口只给出方法的声明,没有具体的实现。而抽象类中得抽象方法只有方法的声明,但是一般方法既有声明也有实现


三、 java8中关于接口的新规范

JDK8:除了定义全局常量和抽象方法之外, 还可以定义静态方法,默认方法

 1、接口中定义的静态方法,只能通过接口来调用
 2、如果实现类重写了接口中的默认方法,调用时,调用的是重写后的方法
 3、如果子类(实现类)继承的父类和实现的接口声明了同名同参数的方法,

        >那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法-->类优先原则
  4、如果实现类实现了多个接口,而这多个接口中定义了同名同参数的方法。
         >那么在实现类没有重写此方法的情况下,就会报错-->接口冲突

 5、如何在子类(或实现类)的方法中调用父类、接口中被重写的方法?

        super.父类中声明的方法;//调用的是父类中声明的

        接口名.super.接口中声明的方法;//调用的是接口中声明的方法

        


      

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值