第08章.抽象类、接口
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Page 11
接口
接口由类来操作。类操作接口的关键字 是:implements。
操作某接口时,对接口中定义的方法有两种处理方式, 一是操作接口中定义的方法,二是再度将该方法标示 为abstract.
public abstract class Fish implements Swimmer { protected String name; public Fish(String name){ this.name=name; } public String getName(){ return name; } public abstract void swim(); }
Page 24
接口
public class Service implements Some1,Other{ @Override public void execute(){ System.out.println("execute()"); } @Override public void doSome(){ System.out.println("doSome()"); } @Override public void doOther(){ System.out.println("doOther()"); } }
Page 7
抽象类总结
在定义Java方法时可以只给出方法头,而不必给出方法体、即方法实现的细 节,这样的方法被称为抽象方法。 抽象方法必须使用关键字abstract修饰,包含抽象方法的类必须声明为抽象 类。 Java语言规定,子类必须实现其父类中的所有抽象方法,否则该子类也只能 声明为抽象类。 抽象类不能被实例化 抽象类主要是通过继承、再由其子类发挥作用的,其作用包括两方面: 代码重用 规划 其他特性: 抽象类中可以不包含抽象方法; 子类中可以不全部实现抽象父类中的抽象方法,但此时子类也只能声 明为抽象类; 父类不是抽象类,但在子类中可以添加抽象方法,但子类需声明为抽 象类; 抽象类中可以声明static属性和方法;
[public] interface 接口名称{ [权限设定] abstract 方法类型 方法名(参数列表) } public interface Swimmer { public abstract void swim(); } 在声明接口时方法上的权限设定可以省略,如果省略的话, 预设是“public,不省略只能是public或者abstract。
swim()方法,目的是让所有会游的东西都游起来
Page 19
接口
public class Test {
public static void main(String[] args) { doSwim(new Anemonefish("尼莫")); doSwim(new Shark("兰尼")); doSwim(new Human("贾斯汀")); doSwim(new Submarine("黄色1号")); } }
Page 21
接口
public class Seaplane implements Swimmer,Flyer { private String name; public Seaplane(String name) { this.name=name; } @Override public void fly(){ System.out.println("海上飞机在飞",name); } @Override public void swim(){ System.out.println("海上飞机航行海面",name); } }
Page 15
接口
Page 16
接口
Swimmer swimmer=new Shark("兰尼"); Shark shark=swimmer; CAST语法 Swimmer swimmer=new Shark("兰尼"); Shark shark=(Shark)swimmer;
Page 17
接口
//Tiger 继承抽象类Animal class Tiger extends Animal { String tigerType; String from; void tigerRun() { System.out.println("老虎在奔跑"); } void breath() { System.out.println("老虎是用肺呼吸的"); } } class Fish extends Animal { String fishType; void swim() { System.out.println("鱼在游泳"); } void breath() { System.out.println("鱼是用腮呼吸的"); } }
接口
分析上述类
存在问题:
代码弹性不足。只是表达出了,所有鱼会游泳。不能表达所有 东西(比如,人、潜水艇等)都会游泳。 问题的根源: 这是由java的继承机制决定的。 改进的方法: 不是某种东西专属的行为,而是所有东西都可以拥有的行为, 将该行为定义为接口。
Page 10
接口
接口用来定义行为,java中可以使用“interface” 关键词定义; 语法为:
第八章 抽象类、接口
Page 1
课程内容
抽象类
接口
枚举类型
Page 2
抽象
抽象的作用是从一类相似实体中抽取共性的东西,比如 任何电器都有一个播放功能,只是具体播放的内容不同 而已。 电器 (play)
电视机 (play video)
Page 3
影碟机 (play sound)
抽象类
在Java中可以创建专门的类来做为父类,这种类被称为
“抽象类”(abstract class)。抽象类有点类似“模板”
的作用,其目的是根据它的格式来创建和修改新的类。
Page 4
抽象类
抽象(abstract)类的概念:用abstract修饰的类称为抽象类,
用abstract 修饰的成员方法称为抽象方法。
Swimmer swimmer=new Human("贾斯汀"); Shark shark=(Shark)swimmer; 编译能通过,但执行时有错误:java.lang.ClassCastException
Page 18
接口
理解“接口能实现多态”
需求:在主类中,写个static的doswim()方法,调用各类对象的
Page 22
接口
类可以同时继承某个类,并操作某些接口
public class FlyingFish extends Fish implements Flyer { private String name; public FlyingFish(String name) { 注意:先后顺序 super(name); } @Override public void fly(){ System.out.println("飞鱼会飞"); } @Override public void swim(){ System.out.println("飞鱼游泳"); } }
合并,优化
Page 20
public static void doSwim(Swimmer swimmer){ swimmer.swim(); } 只要操作Swimmer接口,都可以使用 doSwim方法,可维护性提高很多
接口
Java中,一个类可以操作两个以上的接口,语法是:
public class 类别名称 implements 接口1,接口2,接口3 { } public interface Flyer { public abstract void fly(); }
Page 23
接口
在Java中,接口可以继承别的接口,也可以同时继承2个以上的接
口,也是使用关键字extends
public interface Action { void execute(); } public interface Some1 extends Action { void doSome(); } public interface Other extends Action { void doSome(); }
Page 12
接口
public class Human implements Swimmer { private String name; public Human(String name){ this.name=name; } public String getName(){ return name; } @Override public void swim(){ System.out.println("人类游泳"); } } 接口的好处在于:能实现所有 东西都会游泳这种行为。改进 了程序的框架,使代码更富有 弹性。
Page 13
接口
public static void main(String[] args) { Shark shark=new Shark("兰尼"); Human human=new Human("贾斯汀"); Submarine submarine = Submarine("黄色1号"); shark.swim(); human.swim(); submarine(); }
Page 8
接口
public abstract class Fish { protected String name; public Fish(String name){ this.name=name; } public String getName(){ return name; } public abstract void swim(); } public class Shark extends Fish { public Shark(String name){ super(name); } @Override public void swim(){ System.out.println("鲨鱼游泳"); } Page 9 }
抽象类和具体类的关系就是一般类和特殊类之间的关系, 是 继承和被继承的关系。
抽象类中可以有零个或多个抽象方法,也可以包含非抽象 方法。只要有一个抽象方法,类前就必须有abstract修饰。 若没有抽象方法,类前也可有abstract修饰。
抽象类不能创建对象,创建对象由具体子类来Baidu Nhomakorabea现,但可
以有声明,声明能引用所有具体子类的对象。
Page 14
接口
使用接口来实现多态
public static void main(String[] args) { Swimmer swimmer1=new Shark("兰尼"); Swimmer swimmer2=new Human("贾斯汀"); Swimmer swimmer3=new Submarine("黄色1号"); swimmer1.swim(); swimmer2.swim(); swimmer3.swim(); }
public static void doSwim(Fish fish){ fish.swim(); } public static void doSwim(Human human){ human.swim(); } public static void doSwim(Submarine submarine){ submarine.swim(); }
Page 5
抽象类
定义
[<修饰符>] abstract class 类名 {
成员变量定义; abstract 返回类型 方法名([参数列表]); 返回类型 方法名([参数列表]){}//非抽象方法 }
Page 6
抽象类
//抽象类的声明 abstract class Animal { String type; String name; int age; int weight; void eat() { System.out.println("动物爱吃饭"); } abstract void breath(); void sleep() { System.out.println("动物在睡觉"); } }
public class Anemonefish extends Fish { public Anemonefish(String name){ super(name); } @Override public void swim(){ System.out.println("小丑鱼游泳"); } }
接口
接口由类来操作。类操作接口的关键字 是:implements。
操作某接口时,对接口中定义的方法有两种处理方式, 一是操作接口中定义的方法,二是再度将该方法标示 为abstract.
public abstract class Fish implements Swimmer { protected String name; public Fish(String name){ this.name=name; } public String getName(){ return name; } public abstract void swim(); }
Page 24
接口
public class Service implements Some1,Other{ @Override public void execute(){ System.out.println("execute()"); } @Override public void doSome(){ System.out.println("doSome()"); } @Override public void doOther(){ System.out.println("doOther()"); } }
Page 7
抽象类总结
在定义Java方法时可以只给出方法头,而不必给出方法体、即方法实现的细 节,这样的方法被称为抽象方法。 抽象方法必须使用关键字abstract修饰,包含抽象方法的类必须声明为抽象 类。 Java语言规定,子类必须实现其父类中的所有抽象方法,否则该子类也只能 声明为抽象类。 抽象类不能被实例化 抽象类主要是通过继承、再由其子类发挥作用的,其作用包括两方面: 代码重用 规划 其他特性: 抽象类中可以不包含抽象方法; 子类中可以不全部实现抽象父类中的抽象方法,但此时子类也只能声 明为抽象类; 父类不是抽象类,但在子类中可以添加抽象方法,但子类需声明为抽 象类; 抽象类中可以声明static属性和方法;
[public] interface 接口名称{ [权限设定] abstract 方法类型 方法名(参数列表) } public interface Swimmer { public abstract void swim(); } 在声明接口时方法上的权限设定可以省略,如果省略的话, 预设是“public,不省略只能是public或者abstract。
swim()方法,目的是让所有会游的东西都游起来
Page 19
接口
public class Test {
public static void main(String[] args) { doSwim(new Anemonefish("尼莫")); doSwim(new Shark("兰尼")); doSwim(new Human("贾斯汀")); doSwim(new Submarine("黄色1号")); } }
Page 21
接口
public class Seaplane implements Swimmer,Flyer { private String name; public Seaplane(String name) { this.name=name; } @Override public void fly(){ System.out.println("海上飞机在飞",name); } @Override public void swim(){ System.out.println("海上飞机航行海面",name); } }
Page 15
接口
Page 16
接口
Swimmer swimmer=new Shark("兰尼"); Shark shark=swimmer; CAST语法 Swimmer swimmer=new Shark("兰尼"); Shark shark=(Shark)swimmer;
Page 17
接口
//Tiger 继承抽象类Animal class Tiger extends Animal { String tigerType; String from; void tigerRun() { System.out.println("老虎在奔跑"); } void breath() { System.out.println("老虎是用肺呼吸的"); } } class Fish extends Animal { String fishType; void swim() { System.out.println("鱼在游泳"); } void breath() { System.out.println("鱼是用腮呼吸的"); } }
接口
分析上述类
存在问题:
代码弹性不足。只是表达出了,所有鱼会游泳。不能表达所有 东西(比如,人、潜水艇等)都会游泳。 问题的根源: 这是由java的继承机制决定的。 改进的方法: 不是某种东西专属的行为,而是所有东西都可以拥有的行为, 将该行为定义为接口。
Page 10
接口
接口用来定义行为,java中可以使用“interface” 关键词定义; 语法为:
第八章 抽象类、接口
Page 1
课程内容
抽象类
接口
枚举类型
Page 2
抽象
抽象的作用是从一类相似实体中抽取共性的东西,比如 任何电器都有一个播放功能,只是具体播放的内容不同 而已。 电器 (play)
电视机 (play video)
Page 3
影碟机 (play sound)
抽象类
在Java中可以创建专门的类来做为父类,这种类被称为
“抽象类”(abstract class)。抽象类有点类似“模板”
的作用,其目的是根据它的格式来创建和修改新的类。
Page 4
抽象类
抽象(abstract)类的概念:用abstract修饰的类称为抽象类,
用abstract 修饰的成员方法称为抽象方法。
Swimmer swimmer=new Human("贾斯汀"); Shark shark=(Shark)swimmer; 编译能通过,但执行时有错误:java.lang.ClassCastException
Page 18
接口
理解“接口能实现多态”
需求:在主类中,写个static的doswim()方法,调用各类对象的
Page 22
接口
类可以同时继承某个类,并操作某些接口
public class FlyingFish extends Fish implements Flyer { private String name; public FlyingFish(String name) { 注意:先后顺序 super(name); } @Override public void fly(){ System.out.println("飞鱼会飞"); } @Override public void swim(){ System.out.println("飞鱼游泳"); } }
合并,优化
Page 20
public static void doSwim(Swimmer swimmer){ swimmer.swim(); } 只要操作Swimmer接口,都可以使用 doSwim方法,可维护性提高很多
接口
Java中,一个类可以操作两个以上的接口,语法是:
public class 类别名称 implements 接口1,接口2,接口3 { } public interface Flyer { public abstract void fly(); }
Page 23
接口
在Java中,接口可以继承别的接口,也可以同时继承2个以上的接
口,也是使用关键字extends
public interface Action { void execute(); } public interface Some1 extends Action { void doSome(); } public interface Other extends Action { void doSome(); }
Page 12
接口
public class Human implements Swimmer { private String name; public Human(String name){ this.name=name; } public String getName(){ return name; } @Override public void swim(){ System.out.println("人类游泳"); } } 接口的好处在于:能实现所有 东西都会游泳这种行为。改进 了程序的框架,使代码更富有 弹性。
Page 13
接口
public static void main(String[] args) { Shark shark=new Shark("兰尼"); Human human=new Human("贾斯汀"); Submarine submarine = Submarine("黄色1号"); shark.swim(); human.swim(); submarine(); }
Page 8
接口
public abstract class Fish { protected String name; public Fish(String name){ this.name=name; } public String getName(){ return name; } public abstract void swim(); } public class Shark extends Fish { public Shark(String name){ super(name); } @Override public void swim(){ System.out.println("鲨鱼游泳"); } Page 9 }
抽象类和具体类的关系就是一般类和特殊类之间的关系, 是 继承和被继承的关系。
抽象类中可以有零个或多个抽象方法,也可以包含非抽象 方法。只要有一个抽象方法,类前就必须有abstract修饰。 若没有抽象方法,类前也可有abstract修饰。
抽象类不能创建对象,创建对象由具体子类来Baidu Nhomakorabea现,但可
以有声明,声明能引用所有具体子类的对象。
Page 14
接口
使用接口来实现多态
public static void main(String[] args) { Swimmer swimmer1=new Shark("兰尼"); Swimmer swimmer2=new Human("贾斯汀"); Swimmer swimmer3=new Submarine("黄色1号"); swimmer1.swim(); swimmer2.swim(); swimmer3.swim(); }
public static void doSwim(Fish fish){ fish.swim(); } public static void doSwim(Human human){ human.swim(); } public static void doSwim(Submarine submarine){ submarine.swim(); }
Page 5
抽象类
定义
[<修饰符>] abstract class 类名 {
成员变量定义; abstract 返回类型 方法名([参数列表]); 返回类型 方法名([参数列表]){}//非抽象方法 }
Page 6
抽象类
//抽象类的声明 abstract class Animal { String type; String name; int age; int weight; void eat() { System.out.println("动物爱吃饭"); } abstract void breath(); void sleep() { System.out.println("动物在睡觉"); } }
public class Anemonefish extends Fish { public Anemonefish(String name){ super(name); } @Override public void swim(){ System.out.println("小丑鱼游泳"); } }