1.1 用类制造对象
什么是类?
我们可以用类来创建对象和使用对象。类可以由系统提供(String),也可以自己定义。
什么是对象?
对象变量和普通变量的不同,对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。
类和对象的关系:
类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象,每个对象有自己的数据。
1.2 定义类
一个类由两种东西组成:表示对象有什么的成员变量和表示对象能做什么的成员函数。
一旦定义了类,我们就可以创建这个类的多个对象,这些对象都会做那个类所定义的动作(函数),但是各自具有不同的数据。
自动售货机:成员变量(参数属性,输入输出)与成员函数(动作)
package vendingmachine;
public class VendingMachine {
int price=80;
int balance;
int total;
void showPrompt()
{
System.out.println("Welcome");
}
void insertMoney(int amount)
{
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) {
// TODO Auto-generated method stub
VendingMachine vm=new VendingMachine();
vm.showPrompt();
vm.showBalance();
vm.insertMoney(100);
vm.getFood();
vm.showBalance();
}
}
创建变量
new VendingMachine();
VendingMachine v=new VendingMachine();
让对象做事
“.运算符”v.getfood();
1.3 成员变量 成员函数
这里的关键是理解类的定义和对象的关系,理解对象中的成员变量是怎么来的,怎么就能让成员函数明白自己在和哪个对象打交道。
在没有引入类之前,变量是跟着代码走的。代码写到哪儿,变量写在哪里,那么运行的时候变量就在那儿。现在,写在类里的成员变量,只是一个声明,变量并不在那里,变量不在类里,变量在每一个对象里。
(我想这里的成员变量就类似函数里的形参。)
函数与成员变量
写类时,在函数中可以直接写成员变量的名字来访问成员变量。
函数的外部调用对象名.调用函数
函数是通过对象来调用的v.insertMoney()
,这次调用建立了临时的insertMoney()和对象v之间的联系,这个联系是通过this建立的。
this(成员函数内部调用,this.调用函数)
this是成员函数一个特殊的固有的本地变量,它表达了调用这个函数的那个对象。
void setPrice()
{
this.price=price;
}
也是调用成员函数的懒得打字的方法
调用函数:
通过“‘.’”运算符调用某个对象的函数
在成员函数的内部直接调用自己(this)的其他成员函数(this可以省去)
本地变量(定义在函数内部的变量),作用域和生存期都是函数的内部
成员变量(定义在函数外部的变量),成员变量的生存期是对象的生存期,作用域是类内部的成员函数
1.4 对象初始化
变量的初始化是程序安全很重要的一环。一旦创建了一个对象,有什么手段可以保证其中的每一个成员变量都有确定的初始值呢?
Java提供了多种手段来保障对象创建时的初始化,包括给每个成员变量默认的“0”值、定义初始化和构造函数。
- 成员变量在定义的地方就可以给出初始值,没有赋初值的成员变量自动获得0,对象0值表示没有管理任何对象,也可以主动给null值
- 成员变量定义初始化
定义初始化可以调用函数,甚至可以使用已经定义的成员变量
int balance=f();
int f()
{
return 10;
}
- 构造函数(函数重载):如果一个成员函数的名字和类的名字完全相同,则在创建类的每个对象时都会自动调用这个函数。
构造函数
VendingMachine()
{
total=0;
}
构造函数不能有返回类型。
VendingMachine()
{
total=0;
}
VendingMachine(int price)
{
this.price=price;
}
一个类可以有多个构造函数,只要他们的参数表不同。创造对象的时候给出不同的参数值,就会自动调用不同的构造函数。
VendingMachine vm=new VendingMachine();
会跳到前一个构造函数
VendingMachine vm1=new VendingMachine(100);
会跳到后一个构造函数
一个类里同名但参数表不同的函数构成了重载关系。
VendingMachine()
{
total=0;
}
VendingMachine(int price)
{
this();
this.price=price;
}
通过this()还可以调用其他的构造函数。比如上面的this();
就调用了没有参数的那个VendingMachine()。但这个this只能在这个构造函数里出现,只能是第一句并且只能出现一次。
网友评论