第一周 类与对象
本文是观看翁恺老师《面向对象程序设计Java》时所做
视频来源-中国大学Mooc网
文章目录
1.1 用类制造对象
之前我们学习了如何使用系统提供的类,比如String,来创建对象和使用对象。
尤其重要的是我们理解了对象变量和普通变量的不同,对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。
现在,我们要来尝试自己定义类,然后用自己定义的类来创建对象。
我们从一个已有的程序开始,看看如何用这个程序中定义好了的类来创建多个对象。这个程序是一个图形用户界面的程序,会显示一个图形窗口,在其中画图。图上的每一个形状,都是一个对象。
我们希望通过对这个程序的尝试,让你充分理解类和对象的关系:类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象,每个对象有自己的数据。
对象与类
- 对象是实体,需要被创建,可以为我们做事情
- 类是规范,根据类的定义来创建对象
对象 = 属性 + 服务
- 数据:属性或状态
- 操作:函数
Shapes代码:
完整代码链接
MyPic.java
package shapes;
public class MyPic {
public static void main(String[] args)
{
Picture pic = new Picture(420,300);
Circle c1 = new Circle(320,40,80);
Rectangle r1 = new Rectangle(100, 100, 100, 100);
Triangle t1 = new Triangle(100, 100, 200, 100, 150, 50);
Line l1 = new Line(0,205,400,205);
Circle c2 = new Circle(200,200,50);
pic.add(c1);
pic.add(r1);
pic.add(t1);
pic.add(l1);
pic.add(c2);
pic.draw();
}
}
1.2 定义类
一个类由两种东西组成:表示对象有什么的成员变量和表示对象能做什么的成员函数。
一旦定义了类,我们就可以创建这个类的多个对象,这些对象都会做那个类所定义的动作(函数),但是各自具有不同的数据。
自动售货机:
VendingMachine.java
import java.awt.image.BandCombineOp;
import javax.swing.text.TabableView;
public class VendingMachine {
int price = 80;
int balance;
int total;
VendingMachine ()
{
;
}
void showPrompt()
{
System.out.println("welcome!");
}
void insertMoney(int amount)
{
balance = balance + amount;
showBalance();
}
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) {
// TODO
VendingMachine vm = new VendingMachine();
vm.showPrompt();
vm.showBalance();
vm.insertMoney(100);
vm.getFood();
vm.showBalance();
VendingMachine vm1 = new VendingMachine();
vm1.insertMoney(200);
vm.showBalance();
vm1.showBalance();
}
}
创建对象
- new VendingMachine();
- VendingMachine v = new VendingMachine();
让对象做事
- . 运算符
- v.showPromt()
- v.insertMoney()
1.3 成员变量和成员函数
这里的关键是理解类的定义和对象的关系,理解对象中的成员变量是怎么来的,怎么就能让成员函数明白自己在和哪个对象打交道。
这件事情,很多初学者是不明白的,而且是根本不去想这里有这么个事儿的。但是一旦想进去了而又没想明白,会很可怕的。
在没有引入类之前,变量是跟着代码走的。代码写到哪儿,变量写在哪里,那么运行的时候变量就在那儿。现在,写在类里的成员变量,只是一个声明,变量并不在那里,变量不在类里,变量在每一个对象里。
建议你一定要跟着视频中的方法自己用调试的方法看几遍成员函数的执行,做各种尝试,一定要正确而且充分地理解这里的关系。
函数与成员变量
- 在函数中可以直接写成员变量的名字来访问成员变量
- 那么究竟访问的是哪个对象的呢?
- 函数是通过对象来调用的 – v.insertMoney()
- 这次调用临时的简历了insertMoney()和v之间的关系,让inserMoney()内部的成员变量指的是v的成员变量
this指针
this是成员函数的一个特殊的固有的本地变量,它表达了调用这个函数的那个对象
调用函数
本地变量
- 定义在函数内部的变量是本地变量
- 本地变量的生存期和作用域都是函数内部
- 成员变量的生存期是对象的生存期,作用域是类内部的成员函数
1.4 对象初始化
变量的初始化是程序安全很重要的一环。一旦创建了一个对象,有什么手段可以保证其中的每一个成员变量都有确定的初始值呢?
Java提供了多种手段来保障对象创建时的初始化,包括给每个成员变量默认的“0”值、定义初始化和构造函数。
成员变量定义初始化
- 成员变量在定义的地方就可以给出初始值
- 没有给出初始值的成员变量会自动获得0值
- 对象变量的0值表示没有管理任何对象,也可以主动的给null值
- 定义初始化可以调用函数,甚至可以使用已经定义的成员变量
构造函数
- 如果有一个成员函数的名字和类的名字完全相同,则在创建这个类的每一个对象的时候会自动调用这个函数
- 这个函数不能有返回值
- 可以有多个构造函数
public class VendingMachine {
int price = 80;
int balance;
int total;
VendingMachine () //构造函数
{
total = 0;
}
VendingMachine (int price) { // 函数重载
this.price = price;
}
}
函数重载
- 一个类可以有多个构造函数,只要他们的参数表不同
- 创建对象的时候给出不同参数值,就会自动调用不同的构造函数
- 通过this()还可以调用其他构造函数
- 一个类里的同名但参数表不同的函数构成了重载关系