抽象类和接口

抽象类:

首先,我来解释一下什么叫做抽象类,抽象抽象,顾名思义,有abstract修饰的类名叫做抽象类,那么,由abstract修饰的方法,也叫做抽象方法,但是,抽象方法只有声明部分,没有具体的方法体,例子如下

public abstract class IMammal{
    public abstract void move();
}       

因为一个抽象方法只关心它的子类的是否具有某种功能,并不关心其自身是否具有某种行为,功能的具体行为由子类实现

public class Whale extends IMammal{
    public void move(){
        System.out.println("鲸鱼游动");
    }
}

同时,抽象类不能被实例化,即不能用new关键字来创建对象

抽象类和普通类的区别:

1.抽象类由abstract修饰,普通类没有

2.抽象类中可以有抽象方法,普通类不可以

3.抽象类不能创建对象,普通类可以创建对象

在此说明一下,抽象类中可以有普通方法,也可以有抽象方法,而普通类中一定不能有抽象方法,抽象方法只能存在于抽象类中,并且抽象类的子类一定要实现父类的所有抽象方法,除非子类也是抽象类,显而言之,抽象类中的抽象方法是多态的一种表现机制


接口:

java中的接口是抽象方法的集合,其定义的语法为

   访问控制符(只能是public或默认) interface 接口名[extends 接口名]{

常量;

抽象方法;

内部类;

}

接口中只能包括常量(public static final),抽象方法和内部类;

接口中的抽象方法只能为public修饰;

通过extends关键字可以使自定义接口实现继承,但得注意:

接口继承父接口,但不能继承普通类和抽象类

接口弥补了java单一继承的缺点,即接口可以实现继承多个接口,中间用逗号隔开

接口实现:

类可以通过implements关键字实现接口,注意在实现的过程中实现类中方法的名字,返回值类型,参数列表要和接口中保持一致(就是重写的规则)

如果一个类实现类接口,就必须实现接口中的所有抽象方法,否则该类为抽象类

如果多个接口定义了相同的方法,那么在该实现类中只要实现其中一个即可

public interface ICircle {

	double getArea();
}

public interface IRectangle {

	double getArea();
}

public class GraphicalUtil implements ICircle, IRectangle {

	@Override
	public double getArea() {
		return 0;
	}
}

接口回调:

接口回调描述的是一种现象:接口声明的对象指向其实现类实例化的对象,那么该接口就可以调用接口中的抽象方法(类似于上转型过程)

接口没有构造方法,不能创建对象,但可以引用实现类中的对象

接口实现类可以直接使用接口中的常量

接口实现类所实现的多个接口都有名字相同的常量,则在实现类中不能直接使用,必须使用类名来调用到底使用哪个常量

java1.8新特性:

在java1.8之前,接口中只能定义常量,抽象方法和内部类,在1.8之后,还能定义default修饰的方法,静态方法

如果接口中只定义了一个抽象方法,那么这个接口就叫做函数式接口,可以用@FactionnalInterface注解来验证一个接口是否是函数式接口

抽象类和接口的区别:

1.关键字:一个是abstract修饰,一个是interface修饰

2.成员变量:接口中只能有常量(默认前面加了public static final),抽象类中皆可

3.构造方法:抽象类中有构造方法,接口中没有

4.方法:抽象类中可以有人以方法,在java1.8之前,抽象类中只能定义常量,抽象方法和内部类,在1.8之后,还能定义default修饰的方法,静态方法

5.实现抽象方法:一个是extends,一个是implements

6.是否存在多继承:抽象类中只能有单继承,接口中可以有继承多个接口


instanceof:

instanceof用于判断该运算符前面的引用类型变量指向的对象是否是后面类,或者其子类,接口类的实现类创建的对象,如果是返回ture,否则fasle

interface IMammal{
	void move();
}

class Mammal implements IMammal{

	@Override
	public void move() {
		System.out.println("哺乳动物可以移动......");
	}
}

public class Test{
	public static void main(String[] args) {
		System.out.println(new Mammal() instanceof IMammal);//true
	}
}

instanceof用于强制类型转换之前检查对象的真实类型避免类型转换异常,提高了代码的健壮性

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test{
	
	public static void main(String[] args) {
		Object object = new String();
		print(object);//无法保证传入的object是否是Date类型的对象,因此用instanceof判别一下
	}
	
	public static void print(Object object) {
		if (object instanceof Date) {
			Date date = (Date) object;
			String format = "yyyy-MM-dd HH:mm:ss";
			String result = new SimpleDateFormat(format).format(date);
			System.out.println(result);
		}else {
			System.out.println("请传入由Date类或其子类创建的对象。");
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值