java基础_面向对象


三大特性 封装,继承,多态

封装

利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象

白话理解:
保护对象内部数据,只保留对外一些数据接口与外部发生关系,不需要在乎内部是如何实现的!

优点

  1. 减少耦合: 可以独立的开发,测试,优化,使用
  2. 减少维护负担
  3. 高可用:封装好的,可以在别的地方使用,不用在一步一步重新写逻辑代码
public class Person {
    private String name;
    private int gender;
    private int age;

    public String getName() {
        return name;
    }

    public String getGender() {
        return gender == 0 ? "man" : "woman";
    }

    public void work() {
        if (18 <= age && age <= 50) {
            System.out.println(name + " is working very hard!");
        } else {
            System.out.println(name + " can't work any more!");
        }
    }
}

通过person这个类 可以明确的看出,内部封装了name,gender,age 属性,外界只能通过 getName,getGender,来获取该属性的值,不用在乎内部是如何实现的。

注意到 gender 属性使用 int 数据类型进行存储,封装使得用户注意不到这种实现细节。并且在需要修改 gender 属性使用的数据类型时,也可以在不影响客户端代码的情况下进行。

继承

继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。

继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。

Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为:向上转型 。

Animal cat = new Cat()

优点:
1.提高了代码的复用性
2.提高了代码的维护性
3.这个也是实现多态的前提
缺点:
类的耦合性增强

多态

多态是分为编译时和运行时

  • 编译时期的多态是主要指子类重写父类的方法
  • 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定

那么下来就是运行时的多态的3个必须条件:

  • 继承父类
  • 重写父类方法
  • 向上转型 也就是 父类引用指向子类对象 比如 Animal cat = new Cat(); Cat类继承了Animal类
//父类
public class Animal {
  public String color;
  public int eyes;
  public String name;

  public int getEyes() {
    return eyes;
  }

  public String getColor() {
    return color;
  }

  public void setColor(String color) {
    this.color = color;
  }

  public void setEyes(int eyes) {
    this.eyes = eyes;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
  public void eat(String food){
    System.out.println(name + "在吃" + food);
  }
 static class Dog extends Animal{
   @Override
   public void eat(String food) {
     System.out.println("调用的是" + name + "吃" + food);
   }
 }
 static class Cat extends Animal{
   @Override
   public void eat(String food) {
     System.out.println("调用的是" + name + "吃" + food);
   }
 }

  public static void main(String[] args) {
    Animal animal = new Animal();
    Animal cat = new Cat();
    Animal dog = new Dog();
    animal.setName("我是动物类");
    animal.eat("食肉"); //输出了:我是动物类在吃食肉
    cat.setName("我是猫");
    cat.eat("鱼"); // 输出了:调用的是我是猫吃鱼
    dog.setName("狗");
    dog.eat("骨头");//输出:调用的是狗吃骨头
  }
  
}

从上述代码可以看出,dog和cat都拥有 color,eyes,name属性和eat方法,它们分别重写了animal类的eat方法,打印出了自己对应的执行结果,而不是Animal类中的方法

优点

1.可替换性 多态对于Animal类工作,对于其他任何动物类同样工作;
2.多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。
3.灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
4.简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。