搜索
写经验 领红包
 > 地理

多态抽象(抽象和多态有什么区别)

导语:好难的多态,都不知道起什么标题了,就叫抽象类和接口如何

今天的文章介绍一下面向对象的最后一部分内容,可能面向对象的知识点还有很多,但我觉得最近这几篇文章所介绍的足够用了,不知道大家觉得怎么样。

抽象方法和抽象类

由abstract修饰的方法为抽象方法,抽象方法只有方法的定义,没有方法实现,用一个分号结尾;一个类中如果包含抽象方法,该类应该用abstract关键字声明为抽象类;如果一个类继承了抽象类,必须重写其抽象方法(除非该类也声明为抽象类)。

abstract class Shape{

private double c;

public Shape(double c){

this.c=c;

}

public abstract double area();

}

抽象类不可以实例化,例如,如果Shape是抽象类的话,Shape s1=new Shape()是错误的。即使一个类中没有抽象方法,也可以将其定义为抽象类,同样该类不可以实例化。Abstract和final关键字使得类不可继承,而abstract修饰的类如果不可以继承将没有任何意义。

一个类继承抽象类后,必须重写其抽象方法,不同的子类可以有不同的实现。

抽象类的意义

-为其子类提供一个公共的类型;

-封装子类中的重复内容(成员变量和方法)

-定义有抽象方法,子类虽然有不同的实现,但该方法的定义是一致的

接口

接口的定义:接口可以看成是特殊的抽象类。即只包含有抽象方法的抽象类

实现接口

与继承不同,一个类可以实现多个接口,实现的接口直接用逗号隔开。当然,该类需要实现这些接口中定义的所有方法;一个类可以通过implements关键字实现接口,一个类实现了某个接口后必须实现该接口中定义的所有方法。

class AmericanCurl implements Runner,...{

public void run(){

system.out.println(“run...”);

}

}

接口可以作为一种类型声明变量,一个接口类型的变量可以引用实现了该接口的类的对象;通过该变量可以调用该接口中定义的方法(具体的实现类提供了方法的实现)

Runner runner =new AmericanCurl();

接口的继承

接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。子接口继承了父接口中定义的所有方法。

接口和抽象类的区别

图一

多态

多态的意义(以下实例均以上图图一为例)

一个类型的引用在指向不同的对象时会有不同的实现

公司职员 emp1=new 讲师();

公司职员 emp2=new 项目经理()

emp1.完成工作();

emp2.完成工作();

同样一个对象,造型成不同的类型时,会有不同的功能

讲师 teacher =new讲师();

企业技术顾问 consultant=teacher;

技术图书作者 author=teacher;

consultant.培训员工();

author.编辑资料();

向上造型

一个类的对象可以向上造型的类型有:父类的类型;其实现的接口类型

Java编译器根据类型检查调用方法是否匹配。

讲师 teacher=new 讲师;

职员 emp=teacher;

企业技术顾问 consultant=teacher;

技术图书作者 author=teacher;

emp.上班打卡();

emp.完成工作();

consultant.培训员工();

author.编辑资料();

强制转型

我们可以通过强制转换将父类型变量转换为子类型变量,前提是该变量指向的对象确实是该子类类型;也可以通过强制转换将变量转换为某种接口类型,前提是该变量指向的对象确实实现了该接口;如果在强制转换过程中出现违背上述两个前提,将会抛出ClassCastException

职员 emp1=new 讲师();

讲师teacher=(讲师)emp1;

技术图书作者 author=(技术图书作者)emp1;

项目经理 pm=(项目经理)emp1; //会抛出ClassCastException

instanceof关键字

在强制转型中,为了避免出现ClassCastException,可以通过instanceof关键字判断某个引用指向的对象是否为指定类型。

定义成员内部类

一个类可以定义在另外一个类的内部,定义在类内部的类称为Inner,其所在的类称之为Outer;

Inner定义在Outer的内部。通常只服务于Outer,对外部不具备可见性,Inner可以直接调用Outer的成员及方法(包括私有的)

class Outer{

private int time;

class Inner{

public void timeInc(){

time++;

}

}

}

创建内部类对象

一般情况下,Inner对象会在Outer对象中创建(构造方法或其他方法);Inner对象中会有一个隐式的引用指向创建Outer类对象

定义匿名内部类

如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。

随着这篇文章的结束,我们这几天介绍的面向对象的相关知识点全部介绍完了,在接下来的几天,小编会介绍几个实训案例,让我们加深记忆,可以关注一下。

知识无限,能力有限。小编在文章编辑过程中难免出现不尽人意的地方,欢迎大家批评指正,小编也将不断积累完善自己,让我们共同进步。

本文内容由小故整理编辑!