2、面向对象

1.面向对象概念

面向对象和面向过程的区别

面向过程:将问题分解成步骤,然后按照步骤实现函数,执行时依次调用函数。数据和对数据的操作是分离的。

面向对象:将问题分解成对象,描述事物在解决问题的步骤中的行为。对象与属性和行为是关联的。

面向过程的优点是性能比面向对象高,不需要面向对象的实例化;缺点是不容易维护、复用和扩展。

面向对象的优点是具有封装、继承、多态的特性,因而容易维护、复用和扩展,可以设计出低耦合的系统;缺点是由于需要实例化对象,因此性能比面向过程低。

对象和类

对象是现实世界中可以明确标识的实体,**对象有自己独有的状态和行为。**对象的状态由数据域的集合构成,对象的行为由方法的集合构成。

**类是定义同一类型对象的结构,是对具有相同特征的对象的抽象。**类是一个模板,用来定义对象的数据域和方法。可以从一个类创建多个对象,创建对象称为实例化。

2.构造方法

构造方法是一种特殊的方法,调用构造方法可以创建新对象。构造方法可以执行任何操作,实际应用中,构造方法一般用于初始化操作,例如初始化对象的数据域。

定义和调用构造方法

构造方法的名称必须和构造方法所在类的名称相同。构造方法可以被重载,即允许在同一个类中定义多个参数列表不同的构造方法。

使用 new 操作符调用构造方法,通过调用构造方法创建对象。

默认构造方法

类可以不显性声明构造方法。此时类中隐性声明了一个方法体为空的没有参数的构造方法,称为默认构造方法。只有当类中没有显性声明任何构造方法时,才会有默认构造方法。

构造方法与普通方法的区别

构造方法与普通方法有三点区别。

  • 构造方法的名称必须与所在的类的名称相同。
  • 构造方法没有返回类型,包括没有 void
  • 构造方法通过 new 操作符调用,通过调用构造方法创建对象。

3.静态和实例

Java 的类成员(成员变量、方法等)可以是静态的或实例的。使用关键字 static 修饰的类成员是静态的类成员,不使用关键字 static 修饰的类成员则是实例的类成员。

静态和实例的区别

1.外部调用
从外部调用静态的类成员时,可以通过类名调用,也可以通过对象名调用。从外部调用实例的类成员,则只能通过对象名调用。

建议通过类名调用静态的类成员,因为通过类名调用静态的类成员是不需要创建对象的,而且可以提高代码的可读性。

2.内部访问
静态方法只能访问静态的类成员,不能访问实例的类成员。实例方法既可以访问实例的类成员,也可以访问静态的类成员。

为什么静态方法不能访问实例的类成员呢?因为实例的类成员是依赖于具体对象(实例)的,而静态方法不依赖于任何实例,因此不存在静态方法直接或间接地访问实例或实例的类成员的情况。

判断使用静态或实例

如何判断一个类成员应该被定义成静态的还是实例的呢?取决于类成员是否依赖于具体实例。如果一个类成员依赖于具体实例,则该类成员应该被定义成实例的类成员,否则就应该被定义成静态的类成员。

4.初始化块

代码初始化块属于类成员,在加载类时或创建对象时会隐式调用代码初始块。使用初始化块的好处是可以减少多个构造器内的重复代码。

初始化块的分类

初始化块可以分成静态初始化块和非静态初始化块,前者在加载类时被隐式调用,后者在创建对象时被隐式调用。

单个类的初始化块的执行顺序

如果有初始化块,则初始化块会在其他代码之前被执行。具体而言,静态初始化块会在静态方法之前被执行,非静态初始化块会在构造器和实例方法之前被执行。

由于静态初始化块在加载类时被调用,因此静态初始化块会最先执行,且只会执行一次。

由于非静态初始化块在创建对象时被调用,因此每次创建对象时都会执行非静态初始化块以及执行构造器。非静态初始化块的执行在静态初始化块的执行之后、构造器的执行之前。

存在继承关系的初始化块的执行顺序

如果存在继承关系,则在对子类进行类的加载和创建对象时,也会对父类进行类的加载和创建对象。执行顺序仍然是静态初始化块、非静态初始化块、构造器,由于存在继承关系,因此情况较为复杂。

对于两个类的情况,即一个父类和一个子类,执行顺序如下。

  1. 执行父类的静态初始化块。
  2. 执行子类的静态初始化块。
  3. 执行父类的非静态初始化块。
  4. 执行父类的构造器。
  5. 执行子类的非静态初始化块。
  6. 执行子类的构造器。

更一般的情况,对于多个类之间的继承关系(可能超过两个类,例如 B 继承了 A,C 继承了 B),执行顺序如下。

  1. 按照从父类到子类的顺序,依次执行每个类的静态初始化块。
  2. 按照从父类到子类的顺序,对于每个类,依次执行非静态初始化块和构造器,然后执行子类的非静态初始化块和构造器,直到所有类执行完毕。

5.关键字 this

**关键字 this 代表当前对象的引用。**当前对象指的是调用类中的属性或方法的对象。

关键字 this 用于引用隐藏变量

在方法和构造方法中,可能将属性名用作参数名,在这种情况下,需要引用隐藏的属性名才能给属性设置新值。例如,当属性名和参数名都是 var 时,需要通过 this.var = var 对属性进行赋值。

当方法内部有局部变量和属性名相同时,同样需要通过关键字 this 引用对象的属性。

如果方法内部不存在和属性名相同的局部变量,则在使用属性时,属性前面的 this 可以省略。

关键字 this 用于调用其他构造方法

在构造方法中,可以通过关键字 this 调用其他构造方法,具体用法是 this(参数列表)。

Java 要求,在构造方法中如果使用关键字 this 调用其他构造方法,则 this(参数列表) 语句必须出现在其他语句之前。

关键字 this 不能在静态代码块中使用

由于关键字 this 代表的是对象的引用,因此依赖于具体对象,而静态方法和静态初始化块不依赖于类的具体对象,因此静态方法和静态初始化块中不能使用关键字 this。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值