Java编程那些事儿63—多态性
当前位置:以往代写 > JAVA 教程 >Java编程那些事儿63—多态性
2019-06-14

Java编程那些事儿63—多态性

Java编程那些事儿63—多态性

副标题#e#

8.5.3 多态性

多态性是面向工具技能中最机动的特性,主要是加强项目标可扩展性,提高代码的可维护性。

多态性依赖担任特性,可以把多态领略为担任性的扩展可能深入。

在这里把多态性分为两方面来举办先容,工具范例的多态和工具要领的多态。

为了利便后续的讲授,首先给出一个担任布局的示例。

//文件名:SuperClass.java
public class SuperClass{
 public void test(){
  System.out.println(“SuperClass”);
 }
}
// 文件名:SubbClass1.java
public class SubbClass1 extends SuperClass{
 public void test(){
  System.out.println(“SubbClass1”);
 }
}
// 文件名:SubbClass2.java
public class SubbClass2 extends SuperClass{
 public void test(){
  System.out.println(“SubbClass2”);
 }
}

在该示例代码中,SubbClass1和SubbClass2是SuperClass的子类,而且在子类的内部都包围父类中的test要领。由于这三个类中都书写结构要领,则凭据默认结构要领的约定,每个类中城市被自动添加一个默认的结构要领。

8.5.3.1 工具范例的多态

工具范例的多态是指声明工具的范例不是工具的真正范例,而工具的真正范例由建设工具时挪用的结构要领举办抉择。破例,凭据担任性的说明,子类的工具也是父类范例的工具,可以举办直接赋值。

譬喻如下代码:

SuperClass sc = new SubbClass1();

这里声明白一个SuperClass范例的工具sc,然后利用SuperClass的子类SubbClass1的结构要领举办建设,因为子类范例的工具也是父类范例的工具,所以建设出来的工具可以直接赋值给父类范例的工具sc。除了工具的赋值以外,别的一个更重要的常识是sc工具固然利用SuperClass声明的范例,可是内部存储的却是SubbClass1范例的工具。这个可以Java语言的中instanceof运算符举办判定。


#p#副标题#e#

instanceof是一个运算符,其浸染是判定一个工具是否是某个类范例的工具,假如创立则表达式的值为true,不然为false。语法名目如下:

工具名 instanceof 类名

需要留意的是:这里的类名必需和声明工具时的类之间存储担任干系,不然将呈现语法错误。

测试范例的代码如下:

/**
* 测试工具范例的多态
*/
public class TestObjectType {
 public static void main(String[] args) {
  SuperClass sc = new SubbClass1();
  boolean b = sc instanceof SuperClass;
  boolean b1 = sc instanceof SubbClass1;
  System.out.println(b);
  System.out.println(b1);
 }
}

该测试措施的输出功效是:

true

true

由措施运行功效可以看出,sc既是SuperClass范例的工具,也是SubbClass1范例的工具,而SubbClass1的范例被埋没起来了,这就是工具的多态。其实sc工具不只仅在范例上是SubbClass1范例的,其存储的内容也是SubbClass1的内容,详细参看后头先容的工具要领的多态。

工具范例的多态有许多的用途,极大的利便了工具的存储和通报,使代码很利便的举办扩展,对付已有代码不发生影响。下面先容两个根基的利用。

1.工具的存储

在存储一系列差异子类的工具时,可以利用父类的布局来举办声明,这样可以利便数据的存储,譬喻需要存储多个SubbClass1和SubbClass2的工具时,则可以声明一个SuperClass范例的数组举办存储,示例代码如下:

SuperClass sc[] = new SuperClass[3];

sc[0] = new SubbClass1();

sc[1] = new SubbClass2();

sc[2] = new SubbClass1();

则这里的数组sc,可以存储各个范例子类的工具,而数组中每个元素的值都是存储的对应子类的工具,而只是在名义上的范例(语法上的范例)是SuperClass范例的,这样将利便措施的节制,当增加新的子类范例时,已有的代码不需要举办改革就可以自动适应新的子类的布局。

譬喻新增了一个SuperClass的子类SubbClass3,则该数组的代码可以修改成如下:

SuperClass sc[] = new SuperClass[3];

sc[0] = new SubbClass1();

sc[1] = new SubbClass2();

sc[2] = new SubbClass3();

其它的代码都需要举办修改,就可以适应新的布局,这是多态性最主要的用途。

#p#副标题#e#

2.工具的通报

在要领的传入参数通报,以及返回值处理惩罚方面都从工具范例的多态中受益。在向要领中传入参数时,假如该要领需要处理惩罚各个子类的工具,则只需要书写一个接管父类范例工具的要领即可。譬喻:

public void testObjectTypeMethod(SuperClass sc){}

#p#分页标题#e#

则该在挪用该要领时,可以传入SuperClass的工具,也可以传入其子类的工具,假如传入的是子类的工具,则子类工具中的内容不会丢失。譬喻挪用的示例代码如下:

SuperClass sc = new SuperClass();

SubbClass1 sc1 = new SubbClass1();

SubbClass2 sc2 = new SubbClass2();

testObjectTypeMethod(sc);

testObjectTypeMethod(sc1);

testObjectTypeMethod(sc2);

这里说明的只是挪用时的语法布局,这样的特性将使我们只需要书写一个要领,就可以处理惩罚所有子类的工具,简化代码的书写,低落代码的反复,从而低落维护的难度。

别的,要领的返回值也可以操作到该特性,譬喻如下要领:

public SuperClass testObjectTypeMethod2(){}

则在该要领的内部,既可以返回SuperClass范例的工具,也可以返回其子类的工具,也能简化代码的书写,便于代码的阅读和维护。

关于工具范例的多态,就简朴的说明这么多,详细在项目中如何举办利用,还需要必然的能力和要领。

8.5.3.2 工具要领的多态

工具要领的多态基于要领的包围,也就是该工具挪用的要领详细是子类的要领照旧父类的要领,由建设工具时利用的结构要领抉择,而不是由声明工具时声明的范例抉择。

示例代码如下:

/**
* 测试工具要领的多态
*/
public class TestObjectMethod {
 public static void main(String[] args) {
  SuperClass sc = new SuperClass();
  SubbClass1 sc1 = new SubbClass1();
  SubbClass2 sc2 = new SubbClass2();
  SuperClass sc3 = new SubbClass1();
  testObjectTypeMethod(sc);
  testObjectTypeMethod(sc1);
  testObjectTypeMethod(sc2);
  testObjectTypeMethod(sc3);
 }

 public static void testObjectTypeMethod(SuperClass sc){
  sc.test(); //挪用被包围的要领
 }
}

该代码的执行功效如下:

SuperClassSubbClass1

SubbClass2

SubbClass1

则从代码的执行功效看,固然testObjectTypeMethod要领吸收的是SuperClass范例的工具,可是传入子类工具时,子类工具的内容没有丢失,所以在挪用test要领时,照旧挪用的对应工具中对应的test要领。

这样就在成果上实现了工具的通报,从而保存了工具的内容,极大的利便了代码的扩展性。

可是,由于Java在执行措施时,在措施运行的进程中,需要判定工具挪用的详细是父类的要领照旧子类的要领,所以措施的执行速度会稍微有所低落。

    关键字:

在线提交作业