1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 面向对象编程(三) --- 抽象类和接口

面向对象编程(三) --- 抽象类和接口

时间:2023-09-28 23:23:55

相关推荐

面向对象编程(三) --- 抽象类和接口

抽象类和接口

1抽象类1.1抽象类的使用2.接口2.1接口的使用规则2.2实现多个接口2.3接口使用实例2.4接口间的继承2.5 Clonable 接口和深拷贝

1抽象类

1.1抽象类的使用

使用规则:

包含抽象方法的类叫抽象方法,方法和类都是abstract修饰抽象类中可以定义数据成员和成员方法抽象类不可以被实例化抽象类存在的意义就是为了被继承如果一个类继承了抽象类,那么这个类必须重写所有的抽象方法,抽象方法不能是final的。final和abstract 是不共存的一个抽象类A可以被另一个抽象类B继承,但是如果有另外的普通类C继承了这个抽象方法,那么普通类C里面,所有的抽象方法都要被重写抽象方法不能被private 修饰

代码示例:

abstract class A {abstract void m1(); public void m2() {System.out.println("A类中定义的m2方法"); } }class B extends A {void m1() {System.out.println("B类中定义的m1方法");}}public class Test {public static void main(String args[]) {A a = new B();a.m1();a.m2();}}

2.接口

2.1接口的使用规则

使用interface来定义一个接口接口中的方法默认是 public abstract 的接口当中的成员变量默认是public static final 修饰从JDK1.8开始接口当中可以是普通方法,但前提是这个方法有defaul修饰接口同样不可以进行实例化类和接口的关系是implements,同样该类需要实现一个类可以用implements实现n 个接口,每个接口之间使用逗号分隔(实现多继承)接口和接口之间的关系使用extends关键字来维护,意为扩展。该接口扩展了其他接口的功能接口也可以发生向上转型和多态

扩展(extends) vs 实现(implements):

扩展指的是当前已经有一定的功能了, 进一步扩充功能.

实现指的是当前啥都没有, 需要从头构造出来

代码示例:

在面向对象编程(二)的打印图形的示例中, 我们的父类 Shape 并没有包含别的非抽象方法, 也可以设计成一个接口

interface IShape {//接口void draw(); } class Cycle implements IShape {//实现接口@Override public void draw() {System.out.println("○"); } } public class Test {public static void main(String[] args) {IShape shape = new Rect(); shape.draw(); } }

2.2实现多个接口

Java 中只支持单继承, 一个类只能 extends 一个父类. 但是可以同时实现多个接口, 也能达到多继承类似的效果.

现在我们通过类来表示一组动物

class Animal {protected String name; public Animal(String name) {this.name = name; } }

另外我们再提供一组接口, 分别表示 “会飞的”, “会跑的”, “会游泳的”.

interface IFlying {void fly(); } interface IRunning {void run(); } interface ISwimming {void swim(); }

接下来我们创建几个具体的动物

猫, 是会跑的.

class Cat extends Animal implements IRunning {public Cat(String name) {super(name); } @Override public void run() {System.out.println(this.name + "正在用四条腿跑"); } }

鱼, 是会游的.

class Fish extends Animal implements ISwimming {public Fish(String name) {super(name); } @Override public void swim() {System.out.println(this.name + "正在用尾巴游泳"); } }

青蛙,可以跑也可以游泳

class Frog extends Animal implements IRunning, ISwimming {public Frog(String name) {super(name); } @Override public void run() {System.out.println(this.name + "正在往前跳"); } @Override public void swim() {System.out.println(this.name + "正在蹬腿游泳"); } }

还有一种神奇的动物鸭子,海陆空三栖

class Duck extends Animal implements IRunning, ISwimming, IFlying {public Duck(String name) {super(name); } @Override public void fly() {System.out.println(this.name + "正在用翅膀飞"); } @Override public void run() {System.out.println(this.name + "正在用两条腿跑"); } @Override public void swim() {System.out.println(this.name + "正在漂在水上"); } }

上面的代码展示了 Java 面向对象编程中最常见的用法:

一个类继承一个父类, 同时实现多种接口.

继承表达的含义是 is - a 语义, 而接口表达的含义是 具有 xxx 特性 .

猫是一种动物, 具有会跑的特性.

青蛙也是一种动物, 既能跑, 也能游泳

鸭子也是一种动物, 既能跑, 也能游, 还能飞

这样设计有什么好处呢? 时刻牢记多态的好处,让程序猿忘记类型. 有了接口之后, 类的使用者就不必关注具体类型, 而只关注某个类是否具备某种能力.

2.3接口使用实例

2.4接口间的继承

接口可以继承一个接口, 达到复用的效果. 使用 extends 关键字.

interface IRunning {void run(); } interface ISwimming {void swim(); } // 两栖的动物, 既能跑, 也能游interface IAmphibious extends IRunning, ISwimming {} class Frog implements IAmphibious {... }

通过接口继承创建一个新的接口 IAmphibious 表示 “两栖的”. 此时实现接口创建的 Frog 类, 就继续要实现 run 方法,也需要实现 swim 方法.

接口间的继承相当于把多个接口合并在一起

2.5 Clonable 接口和深拷贝

Object 类中存在一个 clone 方法, 调用这个方法可以创建一个对象的 “拷贝”. 但是要想合法调用 clone 方法, 必须要先

实现 Clonable 接口, 否则就会抛出 CloneNotSupportedException 异常.

class Animal implements Cloneable {private String name; @Override public Animal clone() {Animal o = null; try {o = (Animal)super.clone(); }} catch (CloneNotSupportedException e) {e.printStackTrace(); } return o; } }public class Test {public static void main(String[] args) {Animal animal = new Animal(); Animal animal2 = animal.clone(); System.out.println(animal == animal2); } } // 输出结果// false

浅拷贝 VS 深拷贝

Cloneable 拷贝出的对象是一份 “浅拷贝”

要想达到深拷贝必须克隆对象里的对象

观察以下代码:

public class Test {static class A implements Cloneable {public int num = 0; @Override public A clone() throws CloneNotSupportedException {return (A)super.clone(); } } static class B implements Cloneable {public A a = new A(); @Override public B clone() throws CloneNotSupportedException {return (B)super.clone(); } } public static void main(String[] args) throws CloneNotSupportedException {B b = new B(); B b2 = b.clone(); b.a.num = 10; System.out.println(b2.a.num); } } // 执行结果10

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。