第1周 类与对象
1.1 用类制造对象
-
已经能够使用系统提供的类,比如String,来创建对象和使用对象。
-
对象变量和普通变量的不同,对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。
-
现在,尝试自己定义类,然后用自己定义的类来创建对象。
-
类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象,每个对象有自己的数据。
对象与类
-
对象是实体,需要被创建,可以为我们做事情
-
类是规范,根据类的定义来创建对象
-
对象(这只猫)
- 表达东西或事件
- 运行时响应消息(提供服务)
-
类(猫)
- 定义所有猫的属性
- 就是Java中的类型
- 可以用来定义变量
graph TD
A(类) -->|定义了| B(对象)
B ---> |是...的实体 | A
对象=属性+服务
-
数据:属性或形态(例如画圆时的圆心和半径)
-
操作:函数
-
把数据和对数据的操作放在一起(鸭蛋形态),数据不对外公开, 由操作去保护数据–>封装。
OOP特性
- 一切都是对象
- 程序就是一堆互相发送消息的对象
- 每个对象有自己的存储空间,里面是其他的对象
- 每个对象都有一个类型
- 所有属于某个特定类型的对象可以提供相同的服务
1.2 定义类
-
一个类由两种东西组成:表示对象有什么的成员变量 和 表示对象能做什么的成员函数
-
一旦定义了类,我们就可以创建这个类的多个对象,这些对象都会做那个类所定义的动作(函数),但是各自具有不同的数据。
VendMachine
package vendingmachine;
public class VendingMachine {
int price =80;
int balance;
int total;
void showPrompt()
{
System.out.println("Welcome");
}
void insertMorney(int amount)
{
balance = balance +amount;
}
void showBalance()
{
System.out.println(balance);
}
void getFood()
{
if (balance >= price)
{
System.out.println("Here you are");
balance = balance -price;
total=total +price;
}
}
//设计了这样的类,三个属性四个动作;
public static void main(String[] args) {
VendingMachine vm= new VendingMachine();//创建对象
vm.showPrompt();//让对象做事,.运算符
vm.showBalance();
vm.insertMoney(100);
vm.getFood();
vm.showBalance();
}
}
创建对象
new VendingMachine();
VendingMachine vm= new VendingMachine();
- 对象变量是对象的管理者
让对象做事
.
运算符vm.insertMoney();
v,.getFood();
1.3 成员变量和成员函数
- 类才具有成员,包括”成员变量“和**“成员函数”**
- 理解对象中的成员变量是怎么来的,怎么就能让成员函数明白自己在和哪个对象打交道;
- 写在类里的成员变量只是一个声明,变量并不在那里,变量不在类里,变量在每一个对象里;
- 一定要正确而且充分地理解这里的关系
成员变量
- 类定义了对象中所具有的变量,这些变量称作成员变量;
- 写在类里的变量,生存期是对象的生存期,作用域是类内部的成员函数
- 每个对象都有自己的变量,和同一个类的其他对象是分开的。
- 区别于本地变量
- 定义在类的函数内部的变量;
- 本地变量的作用域和生存期在函数的内部
函数与成员变量
- 在函数中可以直接写成员变量的名字来访问成员变量
- 那么究竟访问的是哪个对象?
- 当通过
vm.showBalance();
这样的方法调用showBalance()
函数时,建立了一个联系,它知道show的balance是vm这个变量的balance - 在类的成员函数与当时调用这个函数的对象之间建立联系
- 在成员函数里,可以用
this
表达这一次调用这个函数的那个对象 this
是一个VendingMachine对象的管理者
- 当通过
- 函数通过对象来调用:
vm.insertMoney();
- 这次调用临时建立了
insertMoney()
和vm
之间的关系,让insertMoney()
内部的成员变量指的是vm
的成员变量
this
-
this
是成员函数特殊的(固有的)本地变量,它表达了这一次调用这个函数时的那个对象 -
在函数内部,可以直接使用
this
-
//比如说定义了一个类veningmachine //我想定义个函数给balance赋值,便可以用到this public class VendingMachine { int price =80; int balance;//成员变量 int total; void showBalance() { System.out.println(this.balance); } void setBalance(int balance) { this.balance=balance; //this.balance是类中的成员变量balance //等号后面的balance是成员函数setBalance()中的本地变量balance } }
-
调用函数
-
通过
.
运算符调用某个对象的函数 -
在一个成员函数内部,可以直接调用自己(this)的另一个成员函数
-
void insertMoney(int amount) { balance = balance + amount; showBalance();//直接调用,调用时this会传进去这个函数 } void showBalance... { ... }
-
-
在成员函数外部,必须用
.
运算符
1.4 对象初始化
- 变量初始化是程序安全很重要的一环。
- Java提供了多种手段来保障对象创建时的初始化,包括给每个成员变量默认的“0”值、定义初始化和构造函数
- 本课时还涉及了函数重载和用this()来调用其他构造函数的方式
成员变量定义和初始化
- 成员变量在定义的地方就可以给出初始值
- 未给出初始值的成员变量会自动获得0值
- 对象变量的0值表示没有管理任何对象,也可以主动给nulI值
- 定义初始化可以调用函数,甚至可以使用已经定义的
成员变量
构造函数
- 如果有一个成员函数的名字和类的名字完全相同,则在创建这个类的每一个对象的时候会自动调用这个函数–>构造函数
- 在构造(对象)的时候会自动调用的函数叫作:构造函数。
- 构造函数不能有返回类型
VendingMachine(){}
没有返回类型的声明void
和return
函数重载
- 一个类可以有多个构造函数,只要它们的参数表不同;它们构成了重载关系(overload)
- 创建对象的时候给出不同的参数值,就会自动调用不同的构造函数;
- 通过this()还可以调用其它构造函数
- 一个类里的同名但参数表不同的函数构成了重载关系