Java面向对象(上)

1.面向对象概述

1.1.定义

  • 面向对象是把构成问题的事务按照一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题

1.2.面向对象特点

  • 封装是面向对象的核心思想,将对象的属性和行为封装起来,不需要让外界知道具体实现细节。
  • 继承主要描述的就是类与类之间的关系,通过继承,可以在无需重新编写原有类的情况下,对原有类的功能进行扩展。
  • 多态指的是在一个类中定义的属性和功能被其他类继承后,当把子类对象直接赋值给父类引用变量时,相同引用类型的变量调用同一个方法所呈现出的多种不同行为特性。

2.Java中的类与对象

2.1.类与对象的关系

2.2.类的定义

2.2.1.定义

  • 类是对象的抽象,它用于描述一组对象的共同特征和行为,例如人都有姓名、年龄、性别等特征,还有学习、工作、购物等行为。
  • 把共同特征作为类的属性(也叫成员变量)
  • 把共同行为作为类的方法(也叫成员方法)

2.2.2.类的定义格式

  • 修饰符可以是public,也可以不写(默认)
  • class关键字用于定以类
  • 定义类的名称,首字母大写且符合标识符
  • extends用于类的继承
  • implements用于类实现接口
1
2
3
[修饰符] class 类名 [extends 父类名] [implements 接口名]{
// 类体,包括类的成员变量和成员方法
}

2.2.3.声明(定义)成员变量

1
2
3
[修饰符] 数据类型 变量名 [ = 值];
private String name; // 声明一个String类型的name;
private int age = 20; // 定义一个int类型的age,并赋值为20;

2.2.4.声明(定义)成员方法

  • 修饰符对访问权限进行限定的(如public、protected、private),也有静态修饰符static,还有最终修饰符final等
  • 返回值类型用于限定方法返回值的数据类型,如果不需要返回值,可以使用void关键字
  • 参数类型用于限定调用方法时传入参数的数据类型
  • 参数名是一个变量,用于接收调用方法时传入的数据
  • 返回值return语句返回的值,该值会返回给调用者
  • return用于结束方法以及返回方法指定类型的值,当方法的返回值类型为void时,return及其返回值可以省略
1
2
3
4
5
[修饰符] [返回值类型] 方法名([参数类型 参数名1,参数类型 参数名2,...]){ 
//方法体
...
return 返回值; //当方法的返回值类型为void时,return及其返回值可以省略
}

2.2.5.成员变量与局部变量

  • 成员变量定义在类中的变量
  • 局部变量定义在方法中的变量
1
2
3
4
5
6
7
public class Person {
int age = 10; // 类中定义的变量被称作成员变量
void speak() {
int age = 30; // 方法内部定义的变量被称作局部变量
System.out.println("我今年" + age + "岁了!");
}
}

2.3.对象的创建与使用

2.3.1.对象创建的语法格式

1
2
类名 对象名称 = new 类名();
Person p = new Person();

2.3.2.对象创建的内存分配

  • Java将内存分为两种,即栈内存和堆内存。其中栈内存用于存放基本类型的变量和对象的引用变量(如Person p),堆内存用于存放由new创建的对象和数组。

2.3.3.对象成员的调用

  • 通过对象的引用来访问对象所有的成员
1
对象引用.对象成员
  • 直接使用创建的对象本身来引用对象成员
1
new 类名().对象成员

2.3.4.成员变量的初始值

成员变量类型初始值
byte、short、int、long0
float、double0.0
char一个空字符,即’\u0000’
booleanfalse
引用数据类型null,表示变量不引用任何对象

2.4.访问控制符

  • private(当前类访问级别):如果类的成员被private访问控制符来修饰,则这个成员只能被该类的其他成员访问,其他类无法直接访问。类的良好封装就是通过private关键字来实现的。

  • default(包访问级别):如果一个类或者类的成员不使用任何访问控制符修饰,则称它为默认访问控制级别,这个类或者类的成员只能被本包中的其他类访问。

  • protected(子类访问级别):如果一个类的成员被protected访问控制符修饰,那么这个成员既能被同一包下的其他类访问,也能被不同包下该类的子类访问。

  • public(公共访问级别):这是一个最宽松的访问控制级别,如果一个类或者类的成员被public访问控制符修饰,那么这个类或者类的成员能被所有的类访问,不管访问类与被访问类是否在同一个包中。

访问范围privatedefaultprotectedpublic
同一类中
同一包中
子类中
全局范围

3.类的封装

3.1.定义

  • 将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的操作访问

3.2.实现封装

  • 在定义一个类时,将类中的属性私有化,即使用private关键字来修饰,私有属性只能在它所在类中被访问,如果外界想要访问私有属性,需要提供一些使用public修饰的公有方法,其中包括用于获取属性值的getXxx()方法和设置属性值的setXxx()方法。

4.方法的重载和递归

4.1.方法的重载

  • 在一个程序中定义多个名称相同,但是参数的类型或个数不同的方法

4.2.方法的递归

  • 方法的递归是指在一个方法的内部调用自身的过程。
  • 递归必须要有结束条件,不然就会陷入无限递归的状态,永远无法结束调用。

5.构造方法

5.1.定义

  • 构造方法(也被称为构造器)是类的一个特殊成员,它会在类实例化对象时被自动调用。

5.2.语法格式

1
2
3
[修饰符] 方法名 ([参数列表]){
// 方法体
}

5.3.条件

  • 方法名与类名相同。

  • 在方法名的前面没有返回值类型的声明。

  • 在方法中不能使用return语句返回一个值,但是可以单独写return语句来作为方法的结束

5.4.重载

  • 与普通方法一样,构造方法也可以重载,在一个类中可以定义多个构造方法,只要每个构造方法的参数类型或参数个数不同即可。

  • 在创建对象时,可以通过调用不同的构造方法来为不同的属性进行赋值。

5.5.注意

  • 在Java中的每个类都至少有一个构造方法,如果在一个类中没有显示地定义构造方法,系统会自动为这个类创建一个默认的无参构造方法。
  • 为了方便实例化对象,构造方法通常会使用public来修饰。

6.this 关键字

6.1.定义

  • 关键字this来指代当前对象,用于在方法中访问对象的其他成员。

6.2.用法

  • 通过this关键字调用成员变量,解决与局部变量名称冲突问题
1
2
3
4
5
6
class Person {
int age; // 成员变量age
public Person(int age) { // 局部变量age
this.age = age; // 将局部变量age的值赋给成员变量age
}
}
  • 通过this关键字调用成员方法
1
2
3
4
5
6
7
8
class Person {
public void openMouth() {
...
}
public void speak() {
this.openMouth();
}
}
  • 通过this关键字调用构造方法
1
2
3
4
5
6
7
class Person {    
public Person() {
}
public Person(int age) {
this(); // 调用无参的构造方法
}
}

6.3.注意

  • 只能在构造方法中使用this调用其他的构造方法,不能在成员方法中使用。

  • 在构造方法中,使用this调用构造方法的语句必须是该方法的第一条执行语句,且只能出现一次。

  • 不能在一个类的两个构造方法中使用this互相调用。

7.static 关键字

7.1.静态变量

  • 在一个Java类中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。

  • 静态变量被所有实例共享,可以使用类名.变量名的形式来访问。

  • static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。

7.2.静态方法

  • 被static关键字修饰的方法称为静态方法。

  • 同静态变量一样,静态方法可以使用类名.方法名的方式来访问,也可以通过类的实例对象来访问。

  • 在一个静态方法中只能访问用static修饰的成员,原因是没有被static修饰的成员需要先创建对象才能访问,而静态方法在被调用时可以不创建任何对象

7.3.静态代码块

  • 在Java中,使用一对大括号包围起来的若干行代码被称为一个代码块。

  • 使用static关键字修饰的代码块称为静态代码块。

  • 当类被加载时,静态代码块会执行,并且只会执行一次。

  • 在程序中,经常使用静态代码块来对类的成员变量进行初始化。