一、封装

  封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和方法都是类的成员。封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

  • 理解
    • 开车时,我们不需要知道发动机的运转原理;
    • 开飞机时,我们不需要知道是什么驱动螺旋桨来转动的;
  • 思想
    • 高内聚,低耦合;
  • 原则
    • 把尽可能多的东西藏起来.对外提供简捷的接口,尽量降低对外的暴露;
    • 把所有的属性藏起来;

如何实现封装:

1、权限修饰符

  • public
    • 公开的,作用范围一个工程内;
  • protected
    • 保护的,作用范围一个体系内;
  • 默认
    • 默认的,作用范围一个包内;
  • private
    • 私有的,作用范围一个类内;

作用点:

  • 修饰类
  • 修饰方法
  • 修饰属性
  • 修饰构造器

总结:

  • 在不同的包内,只能调用修饰符为public的属性和方法;
  • 在不同的包内,如果是继承父类,则可调用修饰符为public和protected的属性和方法;
  • 在同一个包内,可以调用修饰符为public、protected和默认的属性和方法;
  • 在同一个包内,如果是继承父类,则可调用修饰符为public、protected和默认的属性和方法;

Java学习之==>面向对象编程 Part2

2、getter&setter方法

我们先来看下面一个类:

public class User {

  private Integer id;

  private String name;

  private Integer age;

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

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

再来看下这个类中getter和setter方法的调用

public class Test {

  public static void main(String[] args) {

    User user = new User();

    user.setId(1);
    System.out.println("id = " + user.getId());

    user.setName("jack");
    System.out.println("name = " + user.getName());

    user.setAge(25);
    System.out.println("age = " + user.getAge());
    System.out.println("user = " + user);
  }
}

private的属性只有对象自己才可以访问,其他任何对象不行,包括它的子类和父类。安全性高,其他对象只能通过它的public方法(getter&setter)来获取或设置原对象的private属性。如果属性设置为public,其他对象可以直接访问,安全性就不高了。定义为private,实现数据的隐藏和封装;

3、静态工厂方法(of)

我们再来看下下面这个类:

public class User {

  private Integer id;

  private String name;

  private Integer age;

  private User() {
  }

  private User(String name) {
    this();
    this.name = name;
  }

  private User(Integer id, String name) {
    this(name);
    this.id = id;
  }

  private User(Integer id, String name, Integer age) {
    this(id,name);
    this.age = age;
  }

  public static User of() {
    return new User();
  }

  public static User of(String name) {
    return new User(name);
  }

  public static User of(Integer id, String name) {
    return new User(id, name);
  }

  public static User of(Integer id, String name, Integer age) {
    return new User(id, name, age);
  }

  public Integer getId() {
    return id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }

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

可以看到,我们在类中提供了多个 public 的方法 of(),返回的是该类的对象,这样我们使用时就不用再 new 一个对象出来,只要使用 User.of() 方法就可以了,如下:

public class Demo {

  public static void main(String[] args) {

  User user = User.of(1,"jack", 22);

    System.out.println("user = " + user);
  }
}

类中的 of() 是我们自己定义的名称,可以根据传入的参数不同来自定义,其中除了可以返回当前类的对象,还可以返回其子类的对象。

二、继承

  • 优点
    • 减少了重复代码的编写,提高了代码的复用性;
  • 语法
    • extends关键字
    • class Sub extends Super {}
  • 注意
    • Java中不支持多继承,一个类只能继承自一个父类;
    • 可以多个子类继承同一个父类;
    • 多层继承时,继承依然有效;
  • 思考
    • 实例化子类时,父类会被实例化吗?

super关键字:

  • 定义
    • 指向父类的指针;
  • 作用
    • 在子类中,调用父类的属性、方法、构造器;
  • 语法
    • super.name
    • super.run()
    • super("jack", 35)
  • 注意
    • super查找顺序是先找自己的直接父类;
    • super调用父类的构造器必须在首行;

总结:

  • 语法
    • 基于关键字extends实现类和类之间的继承关系;
    • 实现继承之后,属性、方法等都会被子类继承;
    • 在子类中如果有和父类相同的属性和方法,且想调父类的实现时,可使用关键字super;
  • 思想
    • 把相同的东西抽出来,don't copy yourself;
  • 继承的弊端
    • 破坏了类的封装性;

三、多态

多态,简单解释就是一种事物的多种形态,我们先来看下以下几段代码:

public class Car {

  /**
   * 品牌
   */
  private String brand;

  /**
   * 排量
   */
  private String output;

  /**
   * 速度
   */
  private int speed;

  public Car(String brand, String output) {
    this.brand = brand;
    this.output = output;
  }

  public int getSpeed() {
    return speed;
  }

  public void setSpeed(int speed) { 
    this.speed = speed; }

  public String getBrand() {
    return brand;
  }

  public void setBrand(String brand) {
    this.brand = brand;
  }

  public String getOutput() {
    return output;
  }

  public void setOutput(String output) {
    this.output = output;
  }
}
Car.java

相关文章:

  • 2022-12-23
  • 2022-02-09
  • 2021-07-19
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2021-05-14
  • 2022-01-17
  • 2021-12-01
  • 2021-10-30
  • 2021-10-30
相关资源
相似解决方案