Microsoft Word - 投影片ch11

Similar documents
Microsoft Word - 投影片ch15

投影片 1

運算子多載 Operator Overloading

The Embedded computing platform

Microsoft Word - 投影片ch13


詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

Microsoft Word - 投影片ch12

untitled

投影片 1

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

软件工程文档编制

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

java2d-4.PDF

JavaIO.PDF

javaexample-02.pdf

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

Microsoft Word - chap12.doc

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

投影片 1

untitled

《大话设计模式》第一章

Chapter 9: Objects and Classes

Excel VBA Excel Visual Basic for Application

3.1 num = 3 ch = 'C' 2

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

公共圖書館利用教育方案規劃之研究


<4D F736F F D B0EABB79A4E5B8D5C344BBBCB065AAA9>


康體藝術

Microsoft Word - 01.DOC

untitled

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

Microsoft Word - 投影片ch22

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

Strings

资 讯 速 递 台 基 于 大 数 据 的 学 校 督 导 评 估 系 统 建 设 上 海 市 闵 行 区 人 民 政 府 教 育 督 导 室 ( 摘 要 ) 闵 行 教 育 在 深 化 教 育 改 革 探 索 管 办 评 分 离 的 背 景 下, 把 教 育 督 导 评 估 系 统 建 设 作 为

浙江师范大学2014年度毕业生就业质量报告

目 录 监 管 资 讯 2016 年 全 国 保 险 监 管 工 作 会 议 召 开...3 协 会 动 态 赤 峰 保 险 行 业 协 会 召 开 数 据 统 计 和 信 息 宣 传 总 结 表 彰 会 议...5 赤 峰 市 保 险 行 业 协 会 秘 书 处 召 开 2015 年 度 述 职

同 时, 采 取 提 供 新 闻 线 索 和 素 材 安 排 专 访 等 方 式 主 动 为 新 闻 媒 体 服 务, 为 采 访 报 道 活 动 创 造 便 利 条 件 建 设 网 络 信 息 发 布 平 台 2013 年 9 月 开 通 中 央 纪 委 监 察 部 网 站,2015 年 1 月

公務員服務法第13條相關解釋彙整表

大陸教育部等6個部門公佈「現代職業教育體系建設規劃 ( 年)」規劃到2015年初步形成現代職業教育體系框架,到2020年基本建成「中國」特色現代職業教育體系

B1

時間軸上的竹蓮記憶 學務主任 黃雅彙 我不是竹蓮國小的畢業校友 但對於身為新竹人的我來 說 仔細回想起來 似乎和竹蓮有著一種特別的緣分 對竹蓮國小最初的印象是在小學的時候 猶記得年幼的 我經過一段時日的啦啦隊舞蹈訓練後 老師便帶著我們從學 校步行到竹蓮國小來參加比賽 一踏入竹蓮校門 映入眼簾 的是黑

B1

Microsoft Word - 临政办发6.doc

1.5招募说明书(草案)

電機工程系認可證照清單 /7/1

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

OOP with Java 通知 Project 4: 推迟至 4 月 25 日晚 9 点

Microsoft PowerPoint - P766Ch06.ppt

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

untitled

Microsoft PowerPoint - chap08.ppt

EJB-Programming-4-cn.doc

運算子多載 Operator Overloading

<4D F736F F F696E74202D20B5DA3035D5C220C3E6CFF2B6D4CFF3B8DFBCB6B3CCD0F2C9E8BCC6>

Java 1 Java String Date

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

OOP with Java 通知 Project 3: 4 月 19 日晚 9 点

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

chp6.ppt

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

建模与图形思考

Microsoft Word - 投影片ch03

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

The golden pins of the PCI card can be oxidized after months or years

使用MapReduce读取XML文件

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

基于CDIO一体化理念的课程教学大纲设计

相 应 功 能 (5) 再 将 Boy 类 作 为 Girl 类 的 友 元 类, 在 Boy 类 的 某 成 员 函 数 VisitGirl(Girl & ) 中 访 问 Girl 类 的 私 有 成 员, 观 察 编 译 器 给 出 的 信 息 ( 6 ) 删 除 两 个 类 中 的 函 数 V

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Java

全国计算机技术与软件专业技术资格(水平)考试

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

untitled

Microsoft PowerPoint - SE7ch08.ppt

Microsoft Word - 物件導向編程精要.doc

Strings

任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Chapter 9: Objects and Classes

Microsoft PowerPoint - 14Threads.ppt

Learning Java

Microsoft Word - A _ doc

untitled

(procedure-oriented)?? 2

PowerPoint Presentation

Microsoft Word - ACL chapter00a-1ed .doc

Transcription:

Java2 JDK5.0 教學手冊第三版洪維恩編著博碩文化出版書號 pg20210 第十一章抽象類別與介面 本章學習目標認識抽象類別學習介面的使用認識多重繼承與介面的延伸

抽象類別與介面 11-2 11.1 抽象類別 抽象類別的目的是要依據它的格式來修改並建立新的類別 11.1.1 定義抽象類別 定義抽象類別的語法如下 : abstract class 類別名稱 { 宣告資料成員 ; // 定義抽象類別 格式 11.1.1 抽象類別的定義格式 傳回值的資料型態 method 名稱 ( 引數...) { 定義一般 method... } 定義抽象 method 注修飾子 abstract 傳回值資料型態 method 名稱 ( 引數...); 意於抽象 method 裡, } 沒有定義處理的方式

抽象類別與介面 11-3 11.1.2 抽象類別的實作 例如, 想設計一個父類別 CShape, 依據此類別可用來衍生出圓形 長方形與三角形等幾何形狀的類別 : CShape 類別類別 父類別 子類別 CRectangle 類別類別 CCircle 類別類別 CTriangle CTriangle 類別類別

抽象類別與介面 11-4 下面的父類別程式碼, 即是抽象類別 CShape 的內容 : 01 // 定義抽象類別 CShape 02 abstract class CShape // 定義抽象類別 CShape 03 { 04 protected String color; // 資料成員 05 public void setcolor(string str) // 一般 method, 用來設定何形狀的顏色 06 { 07 color=str; 08 } 09 public abstract void show(); // 抽象函數, 在此沒有定義處理方式 10 }

抽象類別與介面 11-5 下面的程式碼是以子類別 CCircle 為例來撰寫的 : 01 // 定義由抽象類別 CShape 而衍生出的子類別 CCircle 02 class CCircle extends CShape // 定義子類別 CCircle 03 { 04 protected double radius; // 資料成員 05 public CCircle(double r) // 建構元 06 { 07 radius=r; 08 } 09 public void show() 10 { 11 System.out.print("color="+color+", "); 12 System.out.println("area="+3.14*radius*radius); 13 } 14 } 在此處明確定義 show() 的處理方式

抽象類別與介面 11-6 app11_1 是抽象類別實作的完整範例 01 // app11_1, 抽象類別的實例 02 abstract class CShape // 定義抽象類別 CShape 03 { 04 protected String color; // 資料成員 05 public void setcolor(string str) // 一般的函數 06 { 07 color=str; 08 } 09 public abstract void show(); // 抽象函數, 只有宣告, 但沒有定義處理方式 10 } 11 class CRectangle extends CShape // 定義子類別 CRectangle 12 { 13 protected int width,height; 14 public CRectangle(int w,int h) 15 { 16 width=w; 17 height=h; 18 } 19 public void show() // 明確定義繼承自抽象類別的 Show() method 20 { 21 System.out.print("color="+color+", "); 22 System.out.println("area="+width*height); 23 } 24 }

抽象類別與介面 11-7 25 class CCircle extends CShape // 定義子類別 CCircle 26 { 27 protected double radius; 28 public CCircle(double r) 29 { 30 radius=r; 31 } 32 public void show() // 明確定義繼承自抽象類別的 Show() method 33 { 34 System.out.print("color="+color+", "); 35 System.out.println("area="+3.14*radius*radius); 36 } 37 } 38 public class app11_1 39 { 40 public static void main(string args[]) 41 { 42 CRectangle rect=new CRectangle(5,10); 43 rect.setcolor("yellow"); 44 rect.show(); 45 46 CCircle cir=new CCircle(2.0); 47 cir.setcolor("green"); 48 cir.show(); 49 } 50 } /* app11_1 OUTPUT--- color=yellow, area=50 color=green, area=12.56 ---------------------*/

抽象類別與介面 11-8 CShape CCircle 與 CRectangle 的 show() method 之間的關係圖 : CShape 類別 abstract class CShape {... abstract void show(); } 將 show() method 宣告成 abstract ( 只有宣告, 沒有明確定義 ) CRectangle 類別 public void show() { // 明確定義 show() 的內容 } CShape 類別 public void show() { // 明確定義 show() 的內容 }

抽象類別與介面 11-9 11.1.3 用抽象類別型態的變數來建立物件 利用父類別的變數來存取子類別物件的成員 app11_2 是以抽象類別型態的變數建立物件的範例 : 01 // app11_2, 用抽象類別型態的變數來建立物件 02 // 將 app11_1 的 CShape 類別的定義放在這兒 03 // 將 app11_1 的 CRectangle 類別的定義放在這兒 04 // 將 app11_1 的 CCircle 類別的定義放在這兒 05 public class app11_2 06 { 07 public static void main(string args[]) 08 { 09 CShape shape1=new CRectangle(5,10); 10 shape1.setcolor("yellow"); 11 shape1.show(); 12 13 CShape shape2=new CCircle(2.0); 14 shape2.setcolor("green"); 15 shape2.show(); 16 } 17 } /* app11_2 OUTPUT----- color=yellow, area=50 color=green, area=12.56 ----------------------*/ 以類別 CShape 建立物件 shape1, 並以它來存取子類別 CRectangle 的成員 以類別 CShape 建立物件 shape2, 並以它來存取子類別 CCircle 的成員

抽象類別與介面 11-10 利用父類別的陣列變數來存取子類別物件的成員 當所建立的物件較多時, 可利用父類別的陣列變數來存取子類別物件的成員 : (1) 先建立父類別的陣列變數 (2) 利用陣列元素建立子類別的物件, 並以它來存取子類別的內容

抽象類別與介面 11-11 app11_3 改寫了 app11_2: 01 // app11_3, 利用父類別的陣列變數來存取子類別的內容 02 // 將 app11_1 的 CShape 類別的定義放在這兒 03 // 將 app11_1 的 CRectangle 類別的定義放在這兒 /* app11_3 OUTPUT----- 04 // 將 app11_1 的 CCircle 類別的定義放在這兒 color=yellow, area=50 05 public class app11_3 color=green, area=12.56 06 { ----------------------*/ 07 public static void main(string args[]) 08 { 09 CShape shape[]; // 宣告 CShape 型態的陣列變數 10 shape=new CShape[2]; // 產生兩個 CShape 抽象類別型態的變數 11 12 shape[0]=new CRectangle(5,10); 13 shape[0].setcolor("yellow"); 14 shape[0].show(); 15 16 shape[1]=new CCircle(2.0); 17 shape[1].setcolor("green"); 18 shape[1].show(); 19 } 20 } 利用陣列變數 shape[0] 建立物件, 並存取子類別的成員 利用陣列變數 shape[1] 建立物件, 並存取子類別的成員

抽象類別與介面 11-12 11.1.4 使用抽象類別的注意事項 抽象類別不能用來直接產生物件 在抽象類別內可以定義建構元, 以供子類別的建構元呼叫 定義在抽象類別裡的抽象函數, 在子類別裡一定要被 改寫 如果子類別裡沒有 改寫 抽象函數, 則子類別也要宣告成 abstract

抽象類別與介面 11-13 11.2 介面的使用 介面與抽象類別有下列兩點不同 : (1) 介面的資料成員必須初始化 ( 即設定初值 ) (2) 介面裡的 method 必須全部都宣告成 abstract

抽象類別與介面 11-14 介面定義的語法如下 : interface 介面名稱 // 定義介面 { final 資料型態成員名稱 = 常數 ; // 資料成員必須設定初值 格式 11.2.1 介面的定義格式 } 修飾子 abstract 傳回值資料型態 method 名稱 ( 引數...); 宣告抽象 method 注意於抽象 method 裡, 沒有定義處理的方式

抽象類別與介面 11-15 下面的範例定義一介面 ishape2d: 01 // 定義 ishape2d 介面 02 interface ishape2d 03 { 04 final double pi=3.14; // 資料成員一定要初值化 05 abstract void area(); // 抽象函數, 不需要定義處理方式 06 } 程式碼可改寫如下 : 01 // 定義 ishape2d 介面, 省略 final 與 abstract 關鍵字 02 interface ishape2d 03 { 04 double pi=3.14; // 省略 final 關鍵字 05 void area(); // 省略 abstract 關鍵字 06 }

抽象類別與介面 11-16 利用介面 A 打造新的類別 B 的過程, 稱之為以類別 B 實作介面 A, 或簡稱介面的實作 (implementation) 介面實作的語法 : class 類別名稱 implements 介面名稱 {...... } // 介面的實作 格式 11.2.2 以類別實作介面的語法

抽象類別與介面 11-17 下面是以 CCircle 類別實作 ishape2d 介面的範例 : 以類別 CCircle 來實作 介面 ishape2d 01 // 介面的實作 02 class CCircle implements ishape2d // 以 CCircle 類別實作 ishape2d 介面 03 { 04 double radius; 05 public CCircle(double r) // 建構元 06 { 07 radius=r; 08 } 09 public void area() // 定義 area() 的處理方式 10 { 11 System.out.println("area="+pi*radius*radius); 12 } 13 }

抽象類別與介面 11-18 app11_4 是以 ishape2d 介面實作 CCircle 與 CRectangle 二個類別的範例 : 01 // app11_4, 介面的實作範例 02 interface ishape2d // 定義介面 03 { 04 final double pi=3.14; 05 abstract void area(); 06 } 07 08 class CRectangle implements ishape2d// 以 CRectangle 類別實作 ishape2d 介面 09 { 10 int width,height; 11 public CRectangle(int w,int h) 12 { 13 width=w; 14 height=h; 15 } 16 public void area() // 定義 area() 的處理方式 17 { 18 System.out.println("area="+width*height); 19 } 20 } 21 22 class CCircle implements ishape2d// 以 CCircle 類別實作 ishape2d 介面

抽象類別與介面 11-19 23 { 24 double radius; 25 public CCircle(double r) 26 { 27 radius=r; 28 } 29 public void area() // 定義 area() 的處理方式 30 { 31 System.out.println("area="+pi*radius*radius); 32 } 33 } 34 35 public class app11_4 36 { 37 public static void main(string args[]) 38 { 39 CRectangle rect=new CRectangle(5,10); 40 rect.area(); // 呼叫 CRectangle 類別裡的 area() method 41 42 CCircle cir=new CCircle(2.0); 43 cir.area(); // 呼叫 CCircle 類別裡的 area() method 44 } 45 } /* app11_4 OUTPUT--- area=50 area=12.56 --------------------*/

抽象類別與介面 11-20 app11_5 是利用透過介面型態的變數來存取物件的範例 01 // app11_5, 透過介面型態的變數來存取物件 02 // 將 app11_4 的 ishape 介面的定義放在這兒 03 // 將 app11_4 的 CRectangle 類別的定義放在這兒 04 // 將 app11_4 的 CCircle 類別的定義放在這兒 05 public class app11_5 06 { 07 public static void main(string args[]) 08 { 09 ishape2d var1,var2; // 宣告介面型態的變數 10 var1=new CRectangle(5,10); // 將介面型態的變數 var1 指向新建的物件 11 var1.area(); // 透過介 var1 呼叫 show() method 12 13 var2=new CCircle(2.0); // 將介面型態的變數 var2 指向新建的物件 14 var2.area(); // 透過介面 var2 呼叫 show() method 15 } 16 } /* app11_5 OUTPUT-- area=50 area=12.56 --------------------*/

抽象類別與介面 11-21 11.3 多重繼承 Java 並不允許多個父類別的繼承 : 父類別 1 父類別 2 父類別 3 子類別 用類別來實作兩個以上的介面, 即可實現多重繼承

抽象類別與介面 11-22 將類別和兩個以上的介面實作在一起的語法如下 : class 類別名稱 implements 介面 1, 介面 2,... {...... } 格式 11.3.1 實作兩個以上的介面

抽象類別與介面 11-23 app11_6 是以兩個介面 ishape2d 和 icolor 來實作 CCirlce 類別的範例 01 // app11_6, 用 CCircle 類別實作兩個以上的介面 02 interface ishape2d // 定義 ishape2d 介面 03 { 04 final double pi=3.14; 05 abstract void area(); 06 } 07 08 interface icolor // 定義 icolor 介面 09 { 10 abstract void setcolor(string str); 11 } 12 13 class CCircle implements ishape2d,icolor // 實作 ishape2d 與 icolor 介面 14 { 15 double radius; 16 String color; 17 public CCircle(double r) 18 { 19 radius=r; 20 } 21 public void setcolor(string str) // 定義 icolor 介面裡的 setcolor()

抽象類別與介面 11-24 22 { 23 color=str; 24 System.out.println("color="+color); 25 } 26 public void area() // 定義 ishape2d 介面裡的 area() method 27 { 28 System.out.println("area="+pi*radius*radius); 29 } 30 } 31 public class app11_6 32 { 33 public static void main(string args[]) 34 { 35 CCircle cir; 36 cir=new CCircle(2.0); 37 cir.setcolor("blue"); // 呼叫 setcolor() method 38 cir.area(); // 呼叫 show() method 39 } 40 } /* app11_6 OUTPUT--- color=blue area=12.56 ----------------------*/

抽象類別與介面 11-25 透過類別與介面的實作, 可達到多重繼承的目的, 如下圖所示 : ishape2d 介面 icolor 介面 CCircle 類別 CCircle 類別實作了 ishape2d 與 icolor 介面

抽象類別與介面 11-26 11.4 介面的延伸 介面可透過繼承的技術來衍生出新的介面 原來的介面稱為基底介面 (base interface) 或父介面 (super interface) 衍生出的介面稱為衍生介面 (derived interface) 或子介面 (sub interface)

抽象類別與介面 11-27 下圖中的 ishape 是父介面, 透過關鍵字 extends 衍生出 ishape2d 與 ishape3d 子介面 : ishape 介面 父介面 extends ishape2d 介面 ishape3d 介面 子介面 implements CCircle 類別 CRectangle 類別 CBox 類別 CSphere 類別 類別

抽象類別與介面 11-28 介面延伸的語法 : interface 子介面名稱 extends 父介面名稱 1, 父介面名稱 2,... {...... } 格式 11.4.1 介面延伸的語法

抽象類別與介面 11-29 下面是介面延伸的範例 : 01 // app11_7, 介面的延伸 02 interface ishape // 定義 ishape 介面 03 { 04 final double pi=3.14; 05 abstract void setcolor(string str); 06 } 07 08 interface ishape2d extends ishape // 定義 ishape2d 介面, 繼承自 ishape 09 { 10 abstract void area(); 11 } 12 13 class CCircle implements ishape2d // 實作 ishape2d 介面 14 { 15 double radius; 16 String color; 17 18 public CCircle(double r) 19 { 20 radius=r; 21 } 22 public void setcolor(string str) // 定義 ishape 介面的 setcolor() 23 {

抽象類別與介面 11-30 24 color=str; 25 System.out.println("color="+color); 26 } 27 public void area() // 定義 ishape2d 介面裡的 area() 28 { 29 System.out.println("area="+pi*radius*radius); 30 } 31 } 32 public class app11_7 33 { 34 public static void main(string args[]) 35 { 36 CCircle cir; 37 cir=new CCircle(2.0); 38 cir.setcolor("blue"); // 呼叫 setcolor() method 39 cir.area(); // 呼叫 area() method 40 } 41 } /* app11_7 OUTPUT-- color=blue area=12.56 --------------------*/

抽象類別與介面 11-31