封装、继承、多态

#三大特性

封装

属性私有,get/set

  • 该露的露,该藏的藏
    • 程序设计要求”高内聚,低耦合“
      • 高内聚:类的内部数据操作细节自己来完成,不允许外部干涉
      • 低耦合:仅暴露少量的方法给外部使用
  • 封装(数据的隐藏)
    • 应禁止直接访问一个对象中数据的实际表示,而应通过操作接口来访问 ,这称为信息隐藏

private 私有属性

alt+insert 生成get/set方法快捷键

意义:

  1. 提高数据的安全性
  2. 隐藏代码的实现细节
  3. 统一接口
  4. 提高系统的可维护性

继承

继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模

  • 继承是类与类之间的一种关系,除此之外类和类之间的关系还有依赖、组合、聚合等
  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。
    • 子类继承父类,使用关键字extends来表示,extends的是意思是扩展。子类是父类的扩展
    • 子类继承父类,就会拥有父类的全部方法
    • Java中只有单继承,没有多继承
  • 子类和父类之间,从意义上讲应该具有" Student is a Person"的关系
  • 在Java中,所有的类都直接或者间接继承object类

super关键字

  1. super是调用父类的构造方法,必须在构造方法的第一个
  2. super必须只能出现在子类的方法或者构造方法中
  3. super和this不能同时调用构造方法

super和this

  • 代表的对象不同
    • this:本身调用者这个对象
    • super:代表父类对象的应用
  • 前提
    • this:没有继承也可以使用
    • super:只能在继承条件下使用
  • 构造方法
    • this():本类的构造
    • super():父类的构造

方法的重写

前提:继承关系,子类重写父类的方法

  1. 方法名必须相同
  2. 参数列表必须相同
  3. 修饰符:范围可以扩大 public > protected > default > private
  4. 抛出的异常:范围可以被缩小,不能扩大

子类的方法和父类的必须要一致,方法体不同

为什么需要重写

  1. 父类的功能子类不一定需要或者不一定满足
  2. 快捷键:alt+ins

多态

实现动态编译:类型->可拓展性

同一种方法可以根据发送对象的不同而采取不同的多种行为方式

一个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类或者相关类)

多态是方法的多态,属性没有多态

多态存在的条件

  1. 有继承关系
  2. 子类重写父类的方法
  3. 父类引用指向子类对象

多态注意事项:

  1. 多态是方法的多态,属性没有多态
  2. 父类和子类,有联系---->类型转换异常:ClassCastExcepection
  3. 存在条件:继承关系,方法需要重写,父类的引用指向子类对象

不能重写的方法,即无多态:

static 静态方法,属于类,它不属于实例

final 常量

private方法,私有方法

补充

instanceof和类型转换

instanceof 判断一个对象是什么类型

System.out.println(X instanceof Y);

类型转换:

  1. 父类引用指向子类的对象
  2. 把子类转换为父类,向上直接转型
  3. 把父类转换为子类,向下强制转型
  4. 类型转换可方便方法的调用,减少重复代码,简洁
  5. 子类转换为父类,可能丢失自己本来的一些方法

static关键字

特点

  1. Static是一个修饰符,用于修饰成员。
  2. Static修饰的成员被所有的对象所共享。
  3. Static优先于对象存在,因为static的成员随着类的加载就已经存在了。
  4. Static修饰的成员多了一种调用方式,就可以直接被类名所调用。类名,静态成员。
  5. Static修饰的数据是共享数据,对象中的存储的是特有数据。
  • 静态变量:static关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。局部变量能被声明为static变量。

  • 静态方法:static关键字用来声明独立于对象的静态方法,静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

代码块

package oop.demo08;

public class Person {
    {
        //匿名代码块 2 赋初值
        System.out.println("匿名代码块");
    }
    static{
        //静态代码块 1 只执行一次
        System.out.println("静态代码块");
    }

    public Person() {
        //3
        System.out.println("构造方法");
    }

    public static void main(String[] args) {
        Person person1 = new Person();
        System.out.println("===========");
        Person person2 = new Person();
    }
}
输出:(注意执行顺序)
静态代码块
匿名代码块
构造方法
===========
匿名代码块
构造方法
上一篇:AQS源码阅读-acquire/release


下一篇:iOS 保持界面流畅的技巧 (转载)