Java面向对象(上)
1.面向对象概述
1.1.定义
- 面向对象是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题
1.2.面向对象特点
- 封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节。
- 继承主要描述的就是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展。
- 多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。
2.Java中的类与对象
2.1.类与对象的关系
2.2.类的定义
2.2.1.定义
- 类是对象的抽象,它用于描述一组对象的共同特征和行为,例如人都有姓名、年龄、性别等特征,还有学习、工作、购物等行为。
- 把共同特征作为类的属性(也叫成员变量)
- 把共同行为作为类的方法(也叫成员方法)
2.2.2.类的定义格式
- 修饰符可以是
public
,也可以不写(默认) class
关键字用于定以类- 定义类的名称,首字母大写且符合标识符
extends
用于类的继承implements
用于类实现接口
1 | [修饰符] class 类名 [extends 父类名] [implements 接口名]{ |
2.2.3.声明(定义)成员变量
1 | [修饰符] 数据类型 变量名 [ = 值]; |
2.2.4.声明(定义)成员方法
修饰符
对访问权限进行限定的(如public、protected、private),也有静态修饰符static,还有最终修饰符final等返回值类型
用于限定方法返回值的数据类型,如果不需要返回值,可以使用void关键字参数类型
用于限定调用方法时传入参数的数据类型参数名
是一个变量,用于接收调用方法时传入的数据返回值
被return
语句返回的值,该值会返回给调用者return
用于结束方法以及返回方法指定类型的值,当方法的返回值类型为void时,return及其返回值可以省略
1 | [修饰符] [返回值类型] 方法名([参数类型 参数名1,参数类型 参数名2,...]){ |
2.2.5.成员变量与局部变量
成员变量
定义在类中的变量局部变量
定义在方法中的变量
1 | public class Person { |
2.3.对象的创建与使用
2.3.1.对象创建的语法格式
1 | 类名 对象名称 = new 类名(); |
2.3.2.对象创建的内存分配
- Java将内存分为两种,即栈内存和堆内存。其中栈内存用于存放基本类型的变量和对象的引用变量(如Person p),堆内存用于存放由new创建的对象和数组。
2.3.3.对象成员的调用
- 通过对象的引用来访问对象所有的成员
1 | 对象引用.对象成员 |
- 直接使用创建的对象本身来引用对象成员
1 | new 类名().对象成员 |
2.3.4.成员变量的初始值
成员变量类型 | 初始值 |
---|---|
byte、short、int、long | 0 |
float、double | 0.0 |
char | 一个空字符,即’\u0000’ |
boolean | false |
引用数据类型 | null,表示变量不引用任何对象 |
2.4.访问控制符
private(当前类访问级别):如果类的成员被private访问控制符来修饰,则这个成员只能被该类的其他成员访问,其他类无法直接访问。类的良好封装就是通过private关键字来实现的。
default(包访问级别):如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或者类的成员只能被本包中的其他类访问。
protected(子类访问级别):如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。
public(公共访问级别):这是一个最宽松的访问控制级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。
访问范围 | private | default | protected | public |
---|---|---|---|---|
同一类中 | √ | √ | √ | √ |
同一包中 | √ | √ | √ | |
子类中 | √ | √ | ||
全局范围 | √ |
3.类的封装
3.1.定义
- 将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作访问
3.2.实现封装
- 在定义一个类时,将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getXxx()方法和设置属性值的setXxx()方法。
4.方法的重载和递归
4.1.方法的重载
- 在一个程序中定义多个名称相同,但是参数的类型或个数不同的方法
4.2.方法的递归
- 方法的递归是指在一个方法的内部调用自身的过程。
- 递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。
5.构造方法
5.1.定义
- 构造方法(也被称为构造器)是类的一个特殊成员,它会在类实例化对象时被自动调用。
5.2.语法格式
1 | [修饰符] 方法名 ([参数列表]){ |
5.3.条件
方法名与类名相同。
在方法名的前面没有返回值类型的声明。
在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束
5.4.重载
与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。
在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。
5.5.注意
- 在Java中的每个类都至少有一个构造方法,如果在一个类中没有显示地定义构造方法,系统会自动为这个类创建一个默认的无参构造方法。
- 为了方便实例化对象,构造方法通常会使用public来修饰。
6.this 关键字
6.1.定义
- 关键字
this
来指代当前对象,用于在方法中访问对象的其他成员。
6.2.用法
- 通过this关键字调用成员变量,解决与局部变量名称冲突问题
1 | class Person { |
- 通过this关键字调用成员方法
1 | class Person { |
- 通过this关键字调用构造方法
1 | class Person { |
6.3.注意
只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。
在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次。
不能在一个类的两个构造方法中使用this互相调用。
7.static 关键字
7.1.静态变量
在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。
静态变量被所有实例共享,可以使用
类名.变量名
的形式来访问。static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。
7.2.静态方法
被static关键字修饰的方法称为静态方法。
同静态变量一样,静态方法可以使用
类名.方法名
的方式来访问,也可以通过类的实例对象来访问。在一个静态方法中只能访问用static修饰的成员,原因是没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象
7.3.静态代码块
在Java中,使用一对大括号包围起来的若干行代码被称为一个代码块。
使用static关键字修饰的代码块称为静态代码块。
当类被加载时,静态代码块会执行,并且只会执行一次。
在程序中,经常使用静态代码块来对类的成员变量进行初始化。