广州番禺Python, Java小班周末班培训
第四期线下Java, Python小班周末班已经开课了,培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析, Java中高级工程师培训。授课详情请点击:http://chipscoco.com/?cate=6
7.4.1 对象属性
在7.3.3节讲到了类属性,类属性表示这种数据类型共有的特征。本节要讲的对象属性是指类实例的属性,类实例属性只属于当前对象,举个简单的例子,每个人在银行里都有存款,但每个人的存款数目都不一样,即使一样,别人的存款也不是你的,它只属于该存款账户的所有者。在讲解如何对类进行实例化获得对象之前,读者需要先掌握如何定义对象属性。定义对象属性的基本语法:
[modifier] [modifier] dataType property;
第一个modifier表示访问控制符,以下为修饰对象属性的访问控制符:
访问控制符 | 描述 |
public | 其它所有类都可以访问该属性 |
protected | 只能被类自身,该类的子类,以及同一个包中的其它类访问 |
private | 只能被类自身访问 |
在定义对象属性时同样可以不加访问控制符,则此时的对象属性只能被自身以及同一个包中的类访问。语法中的第二个modifier表示变量的修饰符,同样可以使用final等修饰符来修饰对象属性。property表示属性名,对象属性同类属性一样,通常采用小驼峰命名法。
在定义对象属性时,如需表达只读的语义,也应该使用final来进行修饰。
对象属性也叫做实例属性,在定义对象属性时不能加上static修饰符,否则该属性会变成类属性。现在打开HelloJava项目,在HelloJava.java中定义一个Person类,并为该类添加名为deposit的对象属性:
class Person{ /* (1) 定义的deposit为对象属性,因为没有用static进行修饰 (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0 */ int deposit; } public class HelloJava{ public static void main(String[] args) { // 执行下面的代码时会报错,因为对象实例只能通过对象来访问 System.out.println(Person.deposit); } }读者需注意的是,对象属性只能通过对象来访问,不能通过类来访问,否则会报错。
7.4.2 对象方法
对象方法属于当前的对象。定义对象方法的基本语法:
[modifier] returnType methodName(parameterType parameter1[,parameterType parameter2...]) {
return value;
}
定义对象方法与定义类方法在语法形式上并没有太大区别,只不过在定义对象方法时不需要使用static进行修饰,否则会变成类方法。现在为person类添加一个名为consume的对象方法:
class Person{ /* (1) 定义的deposit为对象属性,因为没有用static进行修饰 (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0 */ int deposit; // consume是一个对象方法 public void consume(int money){ // this是java中的关键字,表示当前的对象 if (this.deposit >= money){ // 存款大于等于消费的金额,才能取款消费 this.deposit -=money; } } } public class HelloJava{ public static void main(String[] args) { // 执行下面的代码时会报错,因为对象实例只能通过对象来访问 // System.out.println(Person.deposit); } }
7.4.3 this引用
Java在对类进行实例化时,会先为对象及其属性分配内存空间,在内存分配的过程中,会为对象属性赋一个默认值。这里的默认值通常是零值,比如整型的0,浮点型的0.0。在7.4.2节的代码实例中使用了this关键字,this在Java中是一个引用,指向当前对象,所以可以通过this来访问对象属性。内存分配结束以后,Java会调用类的构造函数来为对象进行初始化。
7.4.4 构造函数
Java类中的构造函数用来为对象进行初始化操作,以下为类构造函数第一的基本语法
[modifier] ClassName(parameterType parameter1[,parameterType parameter2...]) {
;
}
modifier表示访问控制符,构造函数的访问控制符同类属性访问控制符,不再赘述。ClassName表示类名,构造函数的函数名必须与类名相同。parameter1,parameter2等为构造函数的形参,parameterType为参数的类型。在Java中,可以同时定义多个构造函数,每个构造函数的参数类型和数目不能相同。
在Java中,可以定义多个函数名相同,但参数类型和个数不相同的函数,这种函数定义方式被称为重载(overloading)。在第八章的教程中,会对函数重载进行详细讲解。
读者需注意的是,Java的构造函数虽然也是函数,但它是没有返回值的,构造函数一般用来为对象进行初始化。如果没有显式定义构造函数,那么Java会自动添加一个无参的构造函数。
在Java中,无参的构造函数即为默认的构造函数。
代码实例-为Person类添加构造函数:
class Person{ /* (1) 定义的deposit为对象属性,因为没有用static进行修饰 (2) java会为根据对象属性的类型来设置默认值,如果是整型,则值默认为0 */ int deposit; // consume是一个对象方法 public void consume(int money){ // this是java中的关键字,表示当前的对象 if (this.deposit >= money){ // 存款大于等于消费的金额,才能取款 this.deposit -= money; } } // 构造函数的函数名须与类名同名 public Person(int deposit){ // 通过this来访问对象属性deposit this.deposit = deposit; } } public class HelloJava{ public static void main(String[] args) { // 执行下面的代码时会报错,因为对象实例只能通过对象来访问 // System.out.println(Person.deposit); } }
在上文代码实例中为Person类添加了构造函数,在构造函数内部将参数deposit的值赋值给对象属性deposit。在定义对象属性时,也可以直接在构造函数外部为属性赋值:
class Person{ // 定义对象属性时,直接赋值 int deposit = 1000; // consume是一个对象方法 public void consume(int money){ // this是java中的关键字,表示当前的对象 if (this.deposit >= money){ // 存款大于等于消费的金额,才能取款 this.deposit -= money; } } }
java在执行过程中会将构造函数外部的对象属性赋值,隐式地添加至构造函数中,也就是说,上文代码中的int deposit=1000,其实是在构造函数内部执行的。
7.4.5 new一个对象
在7.4.4节我们了解到了构造函数的作用,构造函数用来为对象进行初始化。那么在Java中,该怎么获得实例化后的对象呢?在Java中可通过new关键字来创建一个实例对象。使用new操作符来创建对象的语法结构:
ClassName instance = new ClassName(argument1, artument2,...);
ClassName表示类名,instance表示实例名,argument1,argument2等为实参。这里的实参与构造函数中的形参一一对应。获得了对象以后,同样可以通过成员操作符来访问对象属性和对象方法。现在结合以上的代码来写一个完整的实例,在代码实例中为Person类添加消费和获取存款余额的对象方法:
class Person{ // 定义类属性count来统计对象的数目 public static int count = 0; // 将对象属性deposit设置为私有 private int deposit; // 构造函数 public Person(int deposit){ this.deposit = deposit; // 每次实例化对象时就给count加1,以统计对象的数目 count +=1; } // 定义consume方法来模拟消费 public void consume(int money){ // 存款大于等于消费的金额,才能取款 if (this.deposit >= money){ this.deposit -=money; } } // 定义get_deposit方法来获取存款 public int get_deposit(){ return this.deposit; } } public class HelloJava{ public static void main(String[] args) { // 通过new来实例化一个Person对象,实参1000对应的是形参deposit Person kitty = new Person(1000); // 消费100块钱。consume方法是公有的,可以在HelloJava类中访问 kitty.consume(100); // get_deposit方法也是公有的,可以在HelloJava类中访问 System.out.println(kitty.get_deposit()); // deposit属性是私有的,不能在HelloJava类中的访问 // System.out.println(kitty.deposit); // 再实例化一个对象 Person lohan = new Person(10000); // 类属性为所有对象共有,可通过lohan对象来访问类属性count System.out.println(lohan.count); } }
读者请注意,类属性表示这种数据类型共有的特征,为所有对象共享,所以在上文代码实例中可通过对象名加成员操作符来访问类属性。类方法也为所有对象共享,同样可通过实例对象来访问。读者在学习面向对象时,需搞清楚类方法,类属性,对象方法,对象属性的语义,写出语义清晰的代码。
7.4.6 课后习题
(1) 简述你对构造函数的理解。
(2) 类属性和对象属性的区别是什么?在什么情况下应该使用类方法,在什么情况下应该使用对象方法?
(3) 定义一个Cat类,为其设计相应的类属性,对象属性,类方法,对象方法。
(4) 在Java中如何获得实例对象?简述类实例化的过程。