本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第三章 面向对象(上)
3.1 面向对象概述
面向对象的概述:
在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系。
面向对象的特点可以概括为封装、继承和多态。
-
封装
是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体的实现细节。
-
继承
描述的是类与类之间的关系,通过继承,无需重写原有类,直接在原有类的基础上对功能进行扩展。 -
多态
指的是在一个类中定义的属性和功能被其它类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一一实现,使用的时候依次调用就可以了。
面向对象则是把构成问题的事物按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题。
3.2 Java中的类与对象
3.2.1 类与对象的关系
类与对象的关系
- 类是对某一类事物的抽象描述,对象是表示现实中该类事物的个体。
- 对象是类的具体化,并且一个类可以对应多个对象。
3.2.2 类的定义
用面向对象的编程思想,将某一类中共同的特征和行为封装起来,把共同特征作为类的属性(成员变量),把共同行为作为类的方法(成员方法)
类的定义格式
【修饰符】class 类名 【extends父类名】【implements 接口名】{
//类体,包括类的成员变量和成员方法
}
Java中的类都是通过class关键字来定义的
方法的语法格式
【修饰符】【返回值类型】方法名(【参数类型 参数名1,参数名2,…】){
//方法体
……
return 返回值;
//当方法的返回值类型为void时,return及其返回值可以省略
}
3.2.3 对象的创建与使用
对象的创建与使用
类名 对象名称 = new 类名();
例:Person p =new Person();
Java将内存分为两种,即栈内存和堆内存。其中栈内存用于存放基本类型的变量和对象的引用变量,堆内存用于存放由new创建的对象和数组。
3.2.4 访问控制符
访问控制符:
private(当前类访问级别)、default(包访问级别)、protected(子类访问级别)、public(公共访问级别)
如果一个Java源文件中定义的所有类都没有用public修饰,那么这个Java源文件的文件名可以是一切合法的文件名;如果一个源文件中定义了一个public修饰的类,那么这个源文件的文件名必须与public修饰的类的类名相同。
3.3 类的封装
3.3.1 为什么需要封装
在设计一个Java类时,应该对成员变量的访问作出一些限定,不允许外界随意访问,这就需要实现类的封装。
3.3.2 如何实现封装
- 类的封装是指将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作访问。
- 具体的实现过程是,在定义一个类时,将类的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于 获取属性值的getXxx()方法和设置属性值的setXxx()方法 。
3.4 方法的重载和递归
3.4.1 方法的重载
Java允许在一个程序中定义多个名称相同,但是参数的类型或个数不同的方法。
方法的重载与返回值类型无关,它只需要满足两个条件,一是 方法名相同 ,二是 参数个数或参数类型不同。
3.4.2 方法的递归
是指在一个方法的内部调用自身的过程。递归必须要有结束条件。
3.5 构造方法
3.5.1 构造方法的定义
在实例化对象的同时就为该对象的属性进行赋值,可通过构造方法实现。构造方法(也称作构造器)是类的一个特殊成员,会在类实例化对象时被自动调用。
语法格式:
【修饰符】方法名 (【参数列表】) {
//方法体
}
语法定义条件:
- 方法名与类名相同
- 在方法名的前面没有返回值类型的声明
- 在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束
在一个类中除了可以定义无参的构造方法外,还可以定义有参的构造方法,通过有参的构造方法就可以实现对属性的赋值。
3.5.2 构造方法的重载
在一个类中可以定义多个构造方法,只要每个构造方法的参数类型和参数个数不同就行。
- 在Java中的每个类都至少有一个构造方法,如果在一个类中没有显示地定义构造方法,系统会自动为这个类创建一个默认的构造方法
- 一旦为该类定义了构造方法,系统将不再提供默认的无参构造方法
- 在一个类中,如果定义了一个有参的构造方法,最好再定义一个无参的构造方法
- 构造方法通常会使用public来修饰
3.6 this关键字
-
通过this关键字调用成员变量,解决与局部变量名称冲突问题
-
通过this关键字调用成员方法(也可以省略this)
-
通过this关键字调用构造方法
- 只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用
- 在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次
- 不能在一个类的两个构造方法中使用this相互调用
3.7 static关键字
3.7.1 静态变量
- 使用static关键字来修饰成员变量,该变量被称作静态变量,它可以被所有实例所共享。
- static关键字只能用于修饰成员变量,不能用于修饰局部变量
3.7.2 静态方法
- 使用static修饰的成员方法即静态方法,可以在不创建对象的情况下直接通过类名调用。
- 在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用的时可以不创建任何对象。
3.7.3 静态代码块
- 在Java类中,使用一对大括号包围起来的若干行代码被称为一个代码块,用static关键字修饰的代码块称为静态代码块。
- 当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块也只执行一次。程序中通常使用静态代码块来对类的成员进行初始化。
- 静态代码块在类第一次使用时才会被加载,并且只会加载一次。
- 静态代码块优于构造代码块
总结
- 面向对象的三大特征
- 类与对象的关系及定义
- 方法
- this和static