第10章 抽象类和接口
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java.util.Calendar calendar = new java.util.GregorianCalendar(); System.out.println(calender.get(Calender.DAY_OF_MONTH));
14
接口
接口 interface 是一种与类相似的结构,只包含常量 和抽象方法。 语法格式: public interface 接口名 { 常量声明; 方法头标志; }
public class DoubleAgent implements BritishSpy, GermanSpy { public String speak() { return "Hello"; } public String sprechen() { return "Gutentag"; } }
Circle
Cylinder
Rectangle
4
注
非抽象类不能包含抽象方法,如果一个抽象 父类的子类不能实现所有的抽象方法,它必 须声明为抽象的。
换句话说,在一个抽象类扩展出来的非抽象 类中,所有的抽象方法必须实现。
5
注
抽象类不能用Hale Waihona Puke Baiduew运算符实例化,但仍然可 以定义它的构造方法这种构造方法将在它的 子类中被调用。
10
public class Agency { public static void toMI5(BritishSpy spy) { //军情5处当然只能说英语,做英国间谍 spy.speak(); //spy.sprechen();不可见 } public static void inGermany(GermanSpy spy) { //spy.speak();不可见 spy.sprechen(); } public static void main(String[] args) { DoubleAgent da = new DoubleAgent(); BritishSpy es = (BritishSpy) da; GermanSpy gs = (GermanSpy) da; toMI5(da); //MI5也不知道他是一个双重间谍,只知道他是BritishSpy toMI5(es); //更安全 //toMI5(gs); 不可能 inGermany(da); //在德国还是安全的,德国人不知道他的双重间谍身份, //只知道他是GermanSpy inGermany(gs); //inGermany(es); 不可能 } }
12
日历类 Calendar 和 公历类 GregorianCalendar
java.util.Date 实例表示以毫秒为单位的时刻. java.util.Calendar 是一个抽象的父类,可以实 现特定的日历系统。 公历类java.util.GregorianCalendar.
13
Calendar 类中的get方法
接口中可以有数据成员,这些成员默认都是 public static final。
19
interface Math{ double PI=3.1415926; } class Arithmetic implements Math{ double roundArea(double radius) { return PI*radius*radius; } } class Student{ public static void main(String[] args) { Arithmetic a=new Arithmetic(); System.out.println(a.roundArea(3)); System.out.println(Math.PI); System.out.println(Arithmetic.PI); System.out.println(a.PI); } }
25
26
27
28
29
30
接口应用
Comparable和Comparator
31
public class ComparableUser implements Comparable { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; public int compareTo(Object o) { } return this.age - ((ComparableUser) o).getAge(); public int getAge() { } return age; public static void main(String[] args) { } ComparableUser[] users = new ComparableUser[] { public void setAge(int age) { new ComparableUser("u1001", 25), this.age = age; new ComparableUser("u1002", 20), } new ComparableUser("u1003", 21) }; public String getId() { Arrays.sort(users); return id; for (int i = 0; i < users.length; i++) { } ComparableUser user = users[i]; public void setId(String id) { System.out.println(user.getId() + " " + user.getAge()); this.id = id; } } } }
//ok //ok //ok
20
接口
一个接口可以继承自另一个接口。 Java中不允许类的多继承,但允许接口的多 继承。
21
interface Sittable{ void sit(); } interface Lie{ void sleep(); } interface Chair extends Sittable{ }
Calendar 类中的get方法用来提取给定时间域的值,时 间域定义为常量。 如YEAR, MONTH, DATE, HOUR (12), HOUR_OF_DAY (24), MINUTE, SECOND, DAY_OF_WEEK, DAY_OF_MONTH, DAY_OF_YEAR, WEEK_OF_MONTH, 和 WEEK_OF_YEAR 例如:
Cylinder
-length: double +getLength(): double +setLength(length: double): void +findVolume(): double
-radius: double
+getRadius(): double +setRadius(radius: double): void
-color: String -filled: boolean +getColor(): String +setColor(String color): void +isFilled(): boolean +setFilled(boolean filled): void +findArea(): double +findPerimeter(): double
11
假设你只用class,因为不能多重继承,所以,speak()/sprechen()比然声明在同一个class里面 public abstract class DoubleAgent extends Spy/**(略...)*/ { public abstract String speak(); public abstract String sprechen(); } public class PoorDoubleAgent { public String speak() { return "Hello"; } public String sprechen() { return "Gutentag"; } } 晚了,不管你PoorDoubleAgent a = new PoorDoubleAgent(); 还是DoubleAgent a = new PoorDoubleAgent();,
17
接口
接口中所有的方法都是public abstract。 在接口中声明方法时,不能使用native、 static 、final 、synchronized 、private 、 protected等修饰符。 和public类一样,public接口也必须定义在与 接口同名的文件中。
18
接口
TestGeometricObject
Run
9
public interface BritishSpy { public String speak(); //英国间谍讲英语 }
public interface GermanSpy { public String sprechen(); //德国间谍讲德语 }
2
abstract 修饰符
abstract 类 和常规类一样具有数据和方法,但是不能 用new操作符创建它的实例. 需要被继承,实现由子类提供 abstract 方法 只有方法头标志而没有实现
3
Abstract类
UML 图形符号:
抽象的类名和方法名用斜体
Circle Object GeometricObject
包含抽象方法的类必须是抽象的,但是允许 声明没有抽象方法的抽象类。这种情况下不 能用new操作符创建类的实例,这种类用于 定义新的子类。
6
注
子类可以声明为抽象的,即使它的父类是具 体的。例如object类是具体的,但是它的子 类可以是抽象的。
子类可以覆盖它的父类的方法,将其声明为 抽象的。例如,父类的方法在子类中无效时 就可以使用。
7
注
不能用new运算符创建抽象类的实例,但是 抽象类可以作为数据类型。创建一个元素是 GeometricObject 类型的数组:
GeometricObject[] geo = new GeometricObject[10];
8
使用 GeometricObject 类
Objective: 创建2个几个对象,一个圆和一个 矩形。equalArea方法检查2个对象是否有相 同的面积, displayGeometricObject 方法显 示对象.
interface Sofa extends Sittable, Lie{ }
22
接口
在Java中,一个类可以实现多个接口。 一个类在继承另外一个类的同时,可以实现 多个接口。
23
//实现多个接口 interface Sittable{ void sit(); } interface Lie{ void sleep(); } class Sofa implements Sittable, Lie{ public void sit() { } public void sleep() { } }
15
接口的概念
接口是指一些方法特征的集合,它关心的是 方法的特征定义(例如方法的名称、参数的 类型及数量),而不是方法的具体实现。在 Java中,抽象类和接口都是一种接口抽象机 制,符合接口的特点。
接口提供了一种抽象机制 接口使即插即用变得可能 接口针对抽象而不是针对实现
16
接口特点
使用接口的好处是便于系统的扩展、维护和重 用。接口的使用使得代码模块之间的耦合减弱。 具体表现在对象之间的依赖关系弱化为客户— —服务的关系,即客户对象请求服务,服务对 象提供服务,而接口则成了提供服务的一种契 约。 没有经验的程序员设计接口时通常会犯合并接 口和预留接口这两个错误。根据接口隔离法则, 我们在设计接口时不应该强迫客户端依赖于他 们用不上的方法,而是应该提供职责明确、功 能专一的最小化接口。除非必要,应该严格控 制接口宽度,避免接口冗余。
抽象类和接口
第 II篇 的必备基础
第5章 数组
第6章 对象和类 第7章 字符串 第8章后可涉及图形界面 第8章 继承和多态 第9章抽象类和接口 第10章 面向对象建模 第11章图形界面程序编程 第12章 事件驱动程序
第15章 异常和断言
第16章 简单输入输出
1
学习目标
设计和使用抽象类 使用 Calendar 和 GregorianCalendar 类处理日历 声明接口来模拟弱继承关系 了解接口和抽象类的异同 使用包装类 (Byte, Short, Integer, Long, Float, Double, Character, and Boolean) 将基本数据类型包装为对象
Rectangle
-width: double -length: double +getWidth(): double +setWidth(width: double): void +getLength(): double +setLength(length: double): void
GeometricObject
24
//在继承类的同时,实现多个接口 interface Sittable{ void sit(); } interface Lie{ void sleep(); } interface HealthCare{ void massage(); } class Chair implements Sittable{ public void sit(){}; } class Sofa extends Chair implements Lie, HealthCare{ public void sleep(){}; public void massage(){}; }
14
接口
接口 interface 是一种与类相似的结构,只包含常量 和抽象方法。 语法格式: public interface 接口名 { 常量声明; 方法头标志; }
public class DoubleAgent implements BritishSpy, GermanSpy { public String speak() { return "Hello"; } public String sprechen() { return "Gutentag"; } }
Circle
Cylinder
Rectangle
4
注
非抽象类不能包含抽象方法,如果一个抽象 父类的子类不能实现所有的抽象方法,它必 须声明为抽象的。
换句话说,在一个抽象类扩展出来的非抽象 类中,所有的抽象方法必须实现。
5
注
抽象类不能用Hale Waihona Puke Baiduew运算符实例化,但仍然可 以定义它的构造方法这种构造方法将在它的 子类中被调用。
10
public class Agency { public static void toMI5(BritishSpy spy) { //军情5处当然只能说英语,做英国间谍 spy.speak(); //spy.sprechen();不可见 } public static void inGermany(GermanSpy spy) { //spy.speak();不可见 spy.sprechen(); } public static void main(String[] args) { DoubleAgent da = new DoubleAgent(); BritishSpy es = (BritishSpy) da; GermanSpy gs = (GermanSpy) da; toMI5(da); //MI5也不知道他是一个双重间谍,只知道他是BritishSpy toMI5(es); //更安全 //toMI5(gs); 不可能 inGermany(da); //在德国还是安全的,德国人不知道他的双重间谍身份, //只知道他是GermanSpy inGermany(gs); //inGermany(es); 不可能 } }
12
日历类 Calendar 和 公历类 GregorianCalendar
java.util.Date 实例表示以毫秒为单位的时刻. java.util.Calendar 是一个抽象的父类,可以实 现特定的日历系统。 公历类java.util.GregorianCalendar.
13
Calendar 类中的get方法
接口中可以有数据成员,这些成员默认都是 public static final。
19
interface Math{ double PI=3.1415926; } class Arithmetic implements Math{ double roundArea(double radius) { return PI*radius*radius; } } class Student{ public static void main(String[] args) { Arithmetic a=new Arithmetic(); System.out.println(a.roundArea(3)); System.out.println(Math.PI); System.out.println(Arithmetic.PI); System.out.println(a.PI); } }
25
26
27
28
29
30
接口应用
Comparable和Comparator
31
public class ComparableUser implements Comparable { private String id; private int age; public ComparableUser(String id, int age) { this.id = id; this.age = age; public int compareTo(Object o) { } return this.age - ((ComparableUser) o).getAge(); public int getAge() { } return age; public static void main(String[] args) { } ComparableUser[] users = new ComparableUser[] { public void setAge(int age) { new ComparableUser("u1001", 25), this.age = age; new ComparableUser("u1002", 20), } new ComparableUser("u1003", 21) }; public String getId() { Arrays.sort(users); return id; for (int i = 0; i < users.length; i++) { } ComparableUser user = users[i]; public void setId(String id) { System.out.println(user.getId() + " " + user.getAge()); this.id = id; } } } }
//ok //ok //ok
20
接口
一个接口可以继承自另一个接口。 Java中不允许类的多继承,但允许接口的多 继承。
21
interface Sittable{ void sit(); } interface Lie{ void sleep(); } interface Chair extends Sittable{ }
Calendar 类中的get方法用来提取给定时间域的值,时 间域定义为常量。 如YEAR, MONTH, DATE, HOUR (12), HOUR_OF_DAY (24), MINUTE, SECOND, DAY_OF_WEEK, DAY_OF_MONTH, DAY_OF_YEAR, WEEK_OF_MONTH, 和 WEEK_OF_YEAR 例如:
Cylinder
-length: double +getLength(): double +setLength(length: double): void +findVolume(): double
-radius: double
+getRadius(): double +setRadius(radius: double): void
-color: String -filled: boolean +getColor(): String +setColor(String color): void +isFilled(): boolean +setFilled(boolean filled): void +findArea(): double +findPerimeter(): double
11
假设你只用class,因为不能多重继承,所以,speak()/sprechen()比然声明在同一个class里面 public abstract class DoubleAgent extends Spy/**(略...)*/ { public abstract String speak(); public abstract String sprechen(); } public class PoorDoubleAgent { public String speak() { return "Hello"; } public String sprechen() { return "Gutentag"; } } 晚了,不管你PoorDoubleAgent a = new PoorDoubleAgent(); 还是DoubleAgent a = new PoorDoubleAgent();,
17
接口
接口中所有的方法都是public abstract。 在接口中声明方法时,不能使用native、 static 、final 、synchronized 、private 、 protected等修饰符。 和public类一样,public接口也必须定义在与 接口同名的文件中。
18
接口
TestGeometricObject
Run
9
public interface BritishSpy { public String speak(); //英国间谍讲英语 }
public interface GermanSpy { public String sprechen(); //德国间谍讲德语 }
2
abstract 修饰符
abstract 类 和常规类一样具有数据和方法,但是不能 用new操作符创建它的实例. 需要被继承,实现由子类提供 abstract 方法 只有方法头标志而没有实现
3
Abstract类
UML 图形符号:
抽象的类名和方法名用斜体
Circle Object GeometricObject
包含抽象方法的类必须是抽象的,但是允许 声明没有抽象方法的抽象类。这种情况下不 能用new操作符创建类的实例,这种类用于 定义新的子类。
6
注
子类可以声明为抽象的,即使它的父类是具 体的。例如object类是具体的,但是它的子 类可以是抽象的。
子类可以覆盖它的父类的方法,将其声明为 抽象的。例如,父类的方法在子类中无效时 就可以使用。
7
注
不能用new运算符创建抽象类的实例,但是 抽象类可以作为数据类型。创建一个元素是 GeometricObject 类型的数组:
GeometricObject[] geo = new GeometricObject[10];
8
使用 GeometricObject 类
Objective: 创建2个几个对象,一个圆和一个 矩形。equalArea方法检查2个对象是否有相 同的面积, displayGeometricObject 方法显 示对象.
interface Sofa extends Sittable, Lie{ }
22
接口
在Java中,一个类可以实现多个接口。 一个类在继承另外一个类的同时,可以实现 多个接口。
23
//实现多个接口 interface Sittable{ void sit(); } interface Lie{ void sleep(); } class Sofa implements Sittable, Lie{ public void sit() { } public void sleep() { } }
15
接口的概念
接口是指一些方法特征的集合,它关心的是 方法的特征定义(例如方法的名称、参数的 类型及数量),而不是方法的具体实现。在 Java中,抽象类和接口都是一种接口抽象机 制,符合接口的特点。
接口提供了一种抽象机制 接口使即插即用变得可能 接口针对抽象而不是针对实现
16
接口特点
使用接口的好处是便于系统的扩展、维护和重 用。接口的使用使得代码模块之间的耦合减弱。 具体表现在对象之间的依赖关系弱化为客户— —服务的关系,即客户对象请求服务,服务对 象提供服务,而接口则成了提供服务的一种契 约。 没有经验的程序员设计接口时通常会犯合并接 口和预留接口这两个错误。根据接口隔离法则, 我们在设计接口时不应该强迫客户端依赖于他 们用不上的方法,而是应该提供职责明确、功 能专一的最小化接口。除非必要,应该严格控 制接口宽度,避免接口冗余。
抽象类和接口
第 II篇 的必备基础
第5章 数组
第6章 对象和类 第7章 字符串 第8章后可涉及图形界面 第8章 继承和多态 第9章抽象类和接口 第10章 面向对象建模 第11章图形界面程序编程 第12章 事件驱动程序
第15章 异常和断言
第16章 简单输入输出
1
学习目标
设计和使用抽象类 使用 Calendar 和 GregorianCalendar 类处理日历 声明接口来模拟弱继承关系 了解接口和抽象类的异同 使用包装类 (Byte, Short, Integer, Long, Float, Double, Character, and Boolean) 将基本数据类型包装为对象
Rectangle
-width: double -length: double +getWidth(): double +setWidth(width: double): void +getLength(): double +setLength(length: double): void
GeometricObject
24
//在继承类的同时,实现多个接口 interface Sittable{ void sit(); } interface Lie{ void sleep(); } interface HealthCare{ void massage(); } class Chair implements Sittable{ public void sit(){}; } class Sofa extends Chair implements Lie, HealthCare{ public void sleep(){}; public void massage(){}; }