抽象类和接口

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

1抽象类

1.1抽象类的使用

使用规则:

  1. 包含抽象方法的类叫抽象方法,方法和类都是abstract修饰
  2. 抽象类中可以定义数据成员和成员方法
  3. 抽象类不可以被实例化
  4. 抽象类存在的意义就是为了被继承
  5. 如果一个类继承了抽象类,那么这个类必须重写所有的抽象方法,抽象方法不能是final的。final和abstract 是不共存的
  6. 一个抽象类A可以被另一个抽象类B继承,但是如果有另外的普通类C继承了这个抽象方法,那么普通类C里面,所有的抽象方法都要被重写
  7. 抽象方法不能被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接口的使用规则

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

扩展(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

面向对象编程(三) --- 抽象类和接口相关推荐

  1. 廖雪峰Java2面向对象编程-4抽象类和接口-1抽象类

    每个子类都可以覆写父类的方法 如果父类的方法没有实际意义,能否去掉方法的执行语句?子类会报编译错误 如果去掉父类的方法,就失去了多态的特性 可以把父类的方法声明为抽象方法. 如果一个class定义了方 ...

  2. 《Java技术》第三次作业--面向对象——继承、抽象类、接口

    1.阅读下面程序,分析是否能编译通过?如果不能,说明原因.应该如何修改?程序的运行结果是什么?为什么子类的构造方法在运行之前,必须调用父 类的构造方法?能不能反过来? class Grandparen ...

  3. 面向对象编程三种特性

    文章目录 面向过程 面向过程特点 面向对象 面向对象特点 对象和类 定义类 类创建对象 封装特性 封装的特性 继承特性 多继承 新式类与经典类 私有属性与私有方法 私有属性和私有方法: 多态 多态特点 ...

  4. Java语言基础-面向对象编程三步走之打开冰箱门

    开头: 何谓"面向对象" 面向对象是一种编程思想. 思想是一个很虚无缥缈的东西,但是它可以从一个人的具体行动中体现出来,如果说你坚持每天跑步,每天读书,做一些有益于身心健康的事情, ...

  5. java封装例题_java面向对象编程类的封装接口和基本类库练习题

    面向对象编程基本知识练习 一.判断题 1.不需要定义类,就能创建对象.() 2.构造方法用于给类的 private 实例变量赋值.() 3.对象一经声明就可以立即使用.() 4.在定义变量和方法时,必 ...

  6. 面向对象编程三⼤特性 --封装、继承、多态

    封装 把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏.封装是面向对象的特征之一,是对象和类概念的主要特性. 通俗的说,一个类就是一个封装了数据以 ...

  7. 面向对象——多态,抽象类,接口(二)

    目录 前言: 多态 1.1 向下转型(了解) 1.2 instanceof关键字 1.3 多态(理解) 1.4 多态的好处 抽象类 2.1 abstract关键字 2.2 语法规则 接口(重点) 3. ...

  8. Java面向对象之抽象方法抽象类、接口的使用

    一.抽象 1.简单说明 只是声明,并不去实现 抽象方法:public abstract void act();,没有方法体,直接结束,抽象方法只能存在于抽象类中. 抽象类:public abstrac ...

  9. 面向对象——多态、抽象类、接口

    多态 概念:父类类型引用指向子类对象(多态的第一种形式) 多态的前提是继承 语法: 父类类名 对象名 = new 子类类名(); 1.多态的类型转换: 1.1自上类型转换 ​ 子类型转成父类型(dog ...

最新文章

  1. 二分法:search insert position 插入位置
  2. 当程序员的一个人无聊时,甚至用Python开发出机器人看他们聊天
  3. POJ1990:MooFest——题解
  4. SQL Serve 查询所有可用的数据库语句
  5. asp.net(C#)时间相减 得到天数、小时、分钟、秒差
  6. 【矩阵论笔记】平方根分解
  7. 白泽六足机器人_ros_v1——零件准备
  8. excel删除无尽空白行_史上最简单的Excel工资条制作方法,实用收藏!
  9. 经济学积累(二)一些经济学词汇及概念
  10. Paper reading (二十二):Integrated omics: tools, advances and future approaches
  11. Java化小数为分数_杭电oj1717——小数化分数(java实现)
  12. Dojo的联合创建者Dylan Schiemann访谈
  13. 机械硬盘速度突然变慢了
  14. crf graph matlab_如何评价 Vicarious 在 Science 上提出基于概率图模型(PGM)的 RCN 模型?...
  15. 服务器托管是什么?和租用有什么区别?
  16. 产品经理从专能到全能——似懂非懂的分辨率
  17. 手机毒霸去广告功能分析二:广告View的识别
  18. 【如何成为学习高手】学习是有方法的,按照正确的方法练习,每个人都可以成为学霸
  19. 混合硬盘计算机,解决方法:混合硬盘分区技巧[图形教程]
  20. 浅析修理厂的5s管理内容及效用

热门文章

  1. 共事三年多的一同事离职了
  2. 人和机器人的自然交互
  3. 矩阵对角化对有什么作用(1)
  4. 你知道吗,Nero也能当虚拟光驱使
  5. html 代码块压缩
  6. kafka前台启动命令与后台启动命令
  7. 运营数据采集难?集成华为动态标签管理服务轻松搞定!
  8. 【手工Root】Amazon Kindle Fire 6.3
  9. Service Mesh在腾讯云中间件团队的实践与思考
  10. 黑帽seo需要懂编程吗?