【Java】继承与接口

【Java】继承与接口


继承

继承的概念

继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

兔子和羊属于食草动物类,狮子和豹属于食肉动物类。

食草动物和食肉动物又是属于动物类。

所以继承需要符合的关系是:is-a,父类更通用,子类更具体。

Tips

  • 子类拥有父类非private 的属性、方法。
  • 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  • 子类可以用自己的方式实现父类的方法。
  • Java 的继承是单继承,单继承就是一个子类只能继承一个父类。
  • 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
  • 使用final关键字可以阻止子类继承:final关键字不仅可以声明在类上,也可以生命在类方法上

Object类——所有类的父类

equals方法

用于判断两个对象是否具有相同的引用,代码实现使用的是“==”

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

重写equals方法应该严格按照规定来做,共5步

hashcode方法

用于返回一个对象的散列值

应用场景:集合Map,不允许出现相同元素,当我们插入一个对象时,如果使用==一个个的去比较是否是同一对象,在数量少的时候,还可以接受,当数量很大时,一个个去比较,显然很不合理,于是我们可以利用hashcode,直接得出为一的标识,去查找目表对象。

toString方法

用于返回对象字符串,常用于打印对象当前的状态信息

cloneable接口

用于标识类是可以被复制的,用protected声明

首先我们先理解一下 浅拷贝和 深拷贝

  • 浅拷贝:对象中的深一层对象,采用的是同一个实例引用
  • 深拷贝:对象中的深层对象,采用的是不用的实例引用

实现深拷贝的方法:

  1. 实现cloneable接口,并自定义clone方法(比较麻烦)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Teacher implements Cloneable {
    String name;
    Integer age;

    @Override
    public String toString() {
    return "Teacher{" +
    "name='" + name + '\'' +
    ", age=" + age +
    '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
    return super.clone();
    }
    }
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class MyClass implements Cloneable {
    Teacher teacher;
    Integer Number;

    @Override
    public String toString() {
    return "MyClass{" +
    "teacher=" + teacher.toString() +
    ", Number=" + Number +
    '}';
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
    MyClass cloned = (MyClass) super.clone();
    cloned.teacher = (Teacher) teacher.clone();
    return cloned;
    }
    }
    public static void main(String[] args) throws Exception {
    Teacher teacher = new Teacher("王华", 32);
    MyClass a = new MyClass(teacher, 100);
    MyClass b= (MyClass) a.clone();
    System.out.println(a.toString());
    System.out.println(b.toString());
    a.teacher.age=11;
    System.out.println(a.toString());
    System.out.println(b.toString());
    }
  2. 使用对象的串行化

  3. 使用已有的工具包

浅谈多继承的优缺点

C++支持多继承,而很多语言例如,java不支持多继承,“不支持”并不是说技术上难以实现,而是多继承存在一些问题

优点:

  • 有利于类的复用,方便与扩展

缺点:

  • 二义性:如果多个父类的方法名相同,则不知道要调用谁的方法

接口

接口的概念

接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过实现接口,从实现对应的功能。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

  • 接口定义:接口是对类的一组需求的描述,这些类要遵从接口的描述进行定义
  • 接口中的所有方法自动的属于public,因此不需要提供关键字public
  • 接口不能被实例化,但可以声明接口的变量
  • 接口中可以定义常量(但不推荐使用),接口中定义的常量应为所有类频繁使用的常量, 但并不是每个类都使用了接口中定义的所有常量,建议常量定义在实现类中
  • JAVA只能单继承,但是可以实现多个接口
  • 接口中可以定义静态方法
  • 接口中,使用default关键字定义的方法,可在接口中实现方法体,并且实现该接口的类,可以选择是否重写该接口

接口和继承

  • 继承:继承是一种泛化的过程,使一个抽象的类更加生动具体,更专注于整个类的定义。
  • 实现接口:接口的实现,像是一种功能的补充,至于功能怎么实现,取决于实现该接口的类。

 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×