Java面向对象—抽象类和接口

目录

抽象类

什么是抽象类?

1.抽象方法

2.抽象类

 实现抽象类中的方法

抽象类使用的意义

 接口

什么是接口?

接口的意义


抽象类

什么是抽象类?

1.抽象方法

当一个类没有具体的方法体时,且被abstract修饰,这个方法就叫做抽象方法

public abstract void eat();

eat方法被abstract修饰,并且后面没有 { } 所包含的方法体,那么这个eat方法就是一个抽象方法。

2.抽象类

若一个类中包含抽象方法,那么这个类就叫做抽象类

public abstract class Animal{
    public abstract void eat();
}

注:1.抽象方法必须在抽象类中,包含抽象方法的类必须定义为抽象类

2.抽象类中可以不包含抽象方法

3.抽象类不能被实例化

实现抽象类中的方法

既然抽象类不能被实例化,那么我们如何实现抽象类中的方法呢?

我们只需要把抽象类作为父类,新建一个子类,继承抽象类 ,再通过方法的重写来实现抽象类中的方法。

抽象类

public abstract class Animal {
	public abstract void shout();
}

子类

public class Cat extends Animal{
	@Override
	public void shout(){
		System.out.println("猫喵喵叫");
	}
}

测试类

public class Text {
	public static void main(String[] args) {
		Cat c = new Cat();
		c.shout();
	}
}

 成功运行,调用了抽象类中的shout方法,不过是经过子类重写后的方法。

抽象类使用的意义

抽象类在使用时,跟普通的父类使用方法大致相同,无论是继承还是多态,展现出的特点和性质都跟普通的父类一样,那么抽象类存在的意义是什么呢?

如果你亲自写一个继承自抽象类的子类,你会发现,当我把类定义完成后,系统报错了

 检查一下并没有啥毛病,按理说,在这个地方是不应该报错的。我们先来看一下这里报错的原因

大致意思就是,Cat类型必须实现抽象方法。

现在来把shout方法重写

 

 系统不再报错。

那么抽象类的意义也就显而易见了。抽象类要求子类必须重写抽象类中的抽象方法,是一种对子类的约束,要求子类必须实现某个或多个方法。

 接口

什么是接口?

若一个抽象类中的所有方法都是抽象方法,那么这个类就叫做接口

接口是一种特殊的抽象类,它不能包含普通的方法,其内部的所有方法都是抽象的。它将抽象进行的更彻底。

在JDK8中,接口中还可以包含默认方法和默认方法(也叫类方法),默认方法使用default修饰,静态方法用static修饰,这两种方法都允许有方法体。

与定义类不同的是,定义接口是不再用class关键字,而是用interface  

而用类实现接口时,就不可以使用extends了,要用implements

接口定义的基本语法

[修饰符] interface 接口名 [extends 父接口1,父接口2,…]{
        [public] [static] [final] 常量类型 常量名 = 常量值;
        [public] [abstract] 方法返回值类型 方法名([参数列表]);
        [public] default 方法返回值类型 方法名([参数列表]){
                //默认方法的方法体
        }
        [public] static 方法返回值类型 方法名([参数列表]){
                //静态方法的方法体
        }
}

[]为可选内容。

根据上面的语法可以得出几条结论:

1.接口也可以继承自接口,且接口之间的继承支持多继承。但是接口与实现类之间,不为继承关系。

2.接口中可以包含变量、抽象方法、默认方法、静态方法。

3.定义抽象方法时,可以不用abstract修饰。

接口实现类的定义

[修饰符] class 类名 [extends 父类名] [implements 接口1,接口2……]{
    //实现类的内容
}

可以得出:

1.当一个类即有继承,又有实现关系时,要先写继承,再写实现。

2.一个实现类可实现多个接口。

代码演示

接下来我们就以一个实例来演示一下。

首先来定义一个接口

public interface Animal {
	int age = 10;  //这里age必须赋值
	String name = "动物";
	void eat();  //吃东西
	void shout();  //发出叫声
	default void getType(String type){  //默认方法 获取动物的种类
		System.out.println("该动物属于:"+type);
	}
	static String getName(){  //静态方法 获取动物的名字
		return Animal.name;  //必须写 方法名.变量名 
	}
}

注:接口中变量在声明时必须初始化,同一个接口中使用接口变量时,也要通过 方法名.变量名 来调用

在没有实现类的情况下,接口中的变量和静态方法都是可以通过 接口名.变量名 或 接口名.方法名 直接调用的。

 实现类

public class Cat implements Animal{
	String name = "肥波";
	@Override
	public void eat() {
		System.out.println("猫吃鱼");
	}
	@Override
	public void shout() {
		System.out.println("猫喵喵叫");	
	}
}

我们在实现类中new一个对象,调用一下抽象方法,默认方法,静态方法

如果把接口看作一个父类,不管是调用变量还是方法,完全符合成员访问的特点,跟普通的父类没什么区别。

注:若默认方法被重写,运行结果是重写后的结果,若默认方法没被重写,则运行接口中的默认方法。

现在我们来测试一下多态,将Cat c = new Cat();改为Animal c = new Cat();

name调用的是接口中的变量,方法是实现类中重写的方法,跟普通的继承也没有区别。

总体来说,接口跟父类类似,无论是继承还是多态,成员的访问特点都跟父类相同。

接口的意义

既然接口跟父类类似,那么我们为什么使用接口呢?

在我们的生活中,插座是接口,usb是接口,Type-C也是接口……同种的接口提供了相同的规范。这样接口的公头和母头才可以对接。

接口就是一种公共的规范标准,它体现在对实现类中方法的约束。接口的存在,规范了实现类必须实现一些方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G.E.N.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值