java是面向对象的高级编程语言,类和对象是java程序的构成核心。java面向对象的三大特征:封装,继承,多态。

1.面向对象编程(Object-Oriented Programming,OOP)是当今主流的程序设计思想,简单的说就是由动作的执行者变为动作的操控者。是一种以对象为中心的编程思想,不去关心实现的过程,而是关注调用谁来实现此功能。

面向对象有以下特点:

  (1)面向对象是一种常见的思想,比较符合人们的思考习惯;

  (2)面向对象可以将复杂的业务逻辑简单化,增强代码复用性;

  (3)面向对象具有抽象、封装、继承、多态等特性。

2.类和对象的关系

    类:

        对某类事物的普遍一致性特征、功能的抽象、描述和封装,是构造对象的模版,用 Java 编写的代码都会在某些类的内部。类之间主要有:依赖、聚合、继承等关系

    对象:

  使用 new 关键字或反射技术创建的某个类的实例。同一个类的所有对象,都具有相似的数据(比如人的年龄、性别)和行为(比如人的吃饭、睡觉),但是每个对象都保存着自己独特的状态,对象状态会随着程序的运行而发生改变,需要注意状态的变化必须通过调用方法来改变,这就是封装的基本原则。

3.面向对象的三大特征

3.1、封装

封装就是将一个类的某些信息隐藏在类的内部,不允许外界直接访问,而是提供某些方法实现对隐藏信息的访问和操作。
封装的好处就是减少代码的耦合性,使代码更加精简,提高代码的复用性,增强了数据安全性以及隐藏了类的实现细节,统一了接口也提高了系统的可维护性。使用者无需了解具体实现细节,只需通过特定的接口进行访问,这样也方便类自身的实现和修改。

注意:类只能访问其他类的public和protected修饰的属性和方法,不能访问到private修饰的。

我们程序的设计追求"高内聚,低耦合"。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合是仅暴露少量的方法给外部使用。

3.2、继承

继承是类与类之间的一种关系,即子类继承父类的特征和行为,使得子类具有和父类相同的属性和行为。Java只存在单继承且只能继承父类的非私有成员,使用extends 关键字,在调用子类构造方法时会调用父类无参构造方法,若父类没有无参构造,注意为其添加无参构造方法。super()方法可调用父类方法或变量。继承提高了程序的复用性、扩展性,也是 多态特征的前提。
继承的好处在于子类继承了父类的属性和方法从而实现了代码的复用

super和this的区别

super(参数):调用父类的某一构造函数

super.方法:调用父类中的方法;

super.变量名:调用父类中的变量

super:代表父类对象的应用(只能在继承条件下可以使用)

this:代表当前对象名(没有继承条件也可以使用)

this与super如果要在构造函数里使用则都必须在构造函数的第一行,所以不能同时存在与构造函数里。

因为static不包含对象,this和super代表对象,所以不能在static域中使用super和this。

3.3、多态

多态是指一个类对象的相同方法在不同情形下有不同的表现形式。多态使得具有不同内部结构的对象可以共享相同的外部接口。

多态存在的三个必要条件:继承    子类重写父类的方法    父类引用指向子类

注意:

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

    在多态的情况下,只能调用父类已有的对象成员,不能调用子类新增的成员。
    多态的特征的表现行为是:一个引用类型变量可能指向(引用)多种不同类型的对象。

    如果父类对象、子类对象定义了同名属性,在多态情况下使用父类对象的。
    如果子类对象重写了父类对象的方法,在多态的状态下,调用的是子类的重写方法。

    子类和父类中定了静态成员,在多态情况下使用父类的。

java的多态中涉及到向上转型和向下转型

//父类引用指向子类 自动向上转型
Father f = new Child(); 
//向下转型 可以使用instanceof关键字判断是否是指定类对象
Child c = (Child) f;

当类型转换错误时会出现ClassCastException异常。

最后简单了解下类的实例化过程

  (1)JVM 读取指定 classpath 路径下的 class 文件,加载到内存,如果有直接父类,也会加载父类;

  (2)堆内存分配空间;

  (3)执行父类、子类静态代码块;

  (4)对象属性进行默认初始化;

  (5)调用构造方法;

  (6)在构造方法中,先调用父类构造方法初始化父类数据;

  (7)初始化父类数据后,显示初始化,执行子类的构造代码块;

  (8)再进行子类构造方法的特定初始化;

  (9)初始化完毕后,将地址赋值给引用