300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Java面向对象—抽象类和接口

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

时间:2020-07-20 06:07:08

相关推荐

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{@Overridepublic 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 = "肥波";@Overridepublic void eat() {System.out.println("猫吃鱼");}@Overridepublic void shout() {System.out.println("猫喵喵叫");}}

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

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

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

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

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

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

接口的意义

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

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。