3.3 如何创建和使用对象
定义好了 School类,下面就可以根据定义的模板创建对象了。类的作用就是创建对象。由类生成对象,称为类的实例化过程。一个实例也就是一个对象,一个类可以生成多个对象。创建对象的语法如下。
语法
类名 对象名 = new 类名() ;
在创建类的对象时,需要使用Java的new关键字。例如,创建School类的一个对象。
School center = new School()
center对象的类型就是School类型。使用new创建对象时,我们并没有给它的数据成员赋一个特定的值。考虑到每个对象的属性值可能是不一样的,所以在创建对象后再给它的数据成员赋值。
在Java中,要引用对象的属性和方法,需要使用操作符。其中,对象名在圆点的左边,属性或方法的名称在圆点的右边。
语法
对象名.属性 //引用对象的属性
对象名.方法名() //引用对象的方法
例如,创建School类的对象center后,就可以给对象的属性赋值或调用方法,代码如下。
center .name ="北京中心”; //给 name 属性赋值
center. showCenter () ; //调用 showCenter () 方法
掌握了如何创建类的对象,下面就来解决11.3.2节中的问题。
示例3
public class InitialSchool {
public static void main(String[] args) {
School center = new School();
System.out.println("***初始化成员变量前***");
center.showCenter();
center.schoolName = "北京中心"; //给schoolName属性赋值
center.classNumber = 10; //给classNumber属性赋值
center.labNumber = 10; //给labNumber属性赋值
System.out.println("\n***初始化成员变量后***");
center.showCenter();
}
}
程序运行结果如图11.7所示。
下面分析示例3的代码。这里新创建了 Initialschool类,用它来测试School类。大家知道,执行程序需要一个入口。因此,像以前编写过的程序一样,在main()方法中编写代码来使用School类。
图11.7示例3的运行结果
说明:main()方法是程序的入口,可以出现在任何一个类中,但要保证一个Java类中只有一个main()方法。因此,我们可以将main()方法写在School类中。但这里,我们将main()方法放在了 Initialschool类中,目的是使不同的类实现不同的功能。
在示例3的main()中,有以下三点需要大家注意。
使用关键字new创建类的对象 "center"。
School center = new School();
使用操作符访问类的属性。
center.schoolName = "北京中心"; //给schoolName属性赋值
center.classNumber = 10; //给classNumber属性赋值
center.labNumber = 10; //给labNumber属性赋值
使用操作符访问类的方法。
center.showCenter();
下面分析运行结果。showCenter()方法返回一个字符串,由图11.7可知,在没有初始化成员变量时,String类型的schoolName变量的值为null (空),而两个整型变量classNumber和labNumber的值是0。为什么呢?这是因为在定义类时,如果没有给属性赋初始值,Java会给它一个默认值,如表11一2所示。
提示:
在Idea中使用操作符引用类的属性和方法时,发现Idea会弹出一个下拉菜单,如图11.8所示,其中列出了所有的属性和方法。用户只需要选择想要引用的选项就可以了,这是Idea给用户提供的便捷。
图11.8自动提示
3.4 综合示例
前面定义了 School类,下面学习如何定义学员类和教员类。
问题:
编写学员类,输出学员相关信息,如图11.9所示。
编写教员类,输出教员相关信息,如图11.10所示。
图11.9输出学员信息 图11.10输出教员信息
分析:
由图11.9可知,学员类包含的属性有姓名、年龄、班级、爱好;包含的方法为显示个人信息,如示例4所示。
由图11.10可知,教员类包含的属性有姓名、专业方向、教授课程、教龄;包含的方法为显示个人信息,如示例5所示。
示例4
学员类:
public class Student {
String name; //姓名
int age; //年龄
String classNo; //班级
String hobby; //爱好
public void show(){
System.out.println(name + "\n年龄:" + age + "\n就读于:" +
classNo + "\n爱好:" + hobby);
}
}
输出学员信息:
public class InitialStudent {
public static void main(String args[]){
Student student = new Student(); //创建对象
student.name = "张浩"; //给各个属性赋值
student.age = 10;
student.classNo = "S1班";
student.hobby = "篮球";
student.show(); //调用方法
}
}
示例5
教员类:
public class Teacher {
String name; //姓名
String major; //专业方向
String courses; //教授课程
int schoolAge; //教龄
//输出信息方法
public void show(){
System.out.println(name + "\n专业方向:" + major +
"\n教授课程:" + courses + "\n教龄:" + schoolAge);
}
}
输出教员信息:
public class InitialTeacher {
public static void main(String[] args) {
Teacher teacher = new Teacher(); //创建对象
teacher.name = "王老师"; //给各个属性赋值
teacher.major = "计算机";
teacher.courses = "使用Java语言理解程序逻辑";
teacher.schoolAge = 5;
teacher.show(); //调用方法
}
}
下面通过另外一个例子,巩固类的使用。
问题:一个景区根据游人的年龄收取不同价格的门票,其中大于60岁或小于18岁的免费,18〜60岁的20元。请编写游人(Visitor)类,根据年龄段决定能够购买的门票价格并输出。用户输入n则退出程序。
分析:首先要找出与要解决问题有关的对象并抽象出类。很明显,根据要解决的问题,可以得到游人类,该类可以有姓名和年龄两个属性。让用户输入年龄,利用选择结构解决,如示例6所示。
示例6
游人类:
package cn.jbit.dlc1;
import java.util.Scanner;
public class Visitor {
String name; //姓名
int age; //年龄
public void show(){
Scanner input = new Scanner(System.in);
while(!"n".equals(name)){
if(age>=18 && age<=60){ //判断年龄
System.out.println(name + "的年龄为:" + age +
",门票价格为:20元\n" );
}else{
System.out.println(name + "的年龄为:" + age + ",门票免费\n");
}
System.out.print("请输入姓名:");
name = input.next(); //给name属性赋值
if(!"n".equals(name)){
System.out.print("请输入年龄:");
age = input.nextInt(); //给age属性赋值
}
}
System.out.print("退出程序");
}
}
输出门票信息:
package cn.jbit.dlc1;
import java.util.Scanner;
public class InitialVistor {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Visitor v = new Visitor(); //创建对象
System.out.print("请输入姓名:");
v.name = input.next(); //给name属性赋值
System.out.print("请输入年龄:");
v.age = input.nextInt(); //给age属性赋值
v.show(); //调用显示信息方法
}
}
示例6的运行结果如图11.11所示。
为了程序演示的方便,示例6中的代码使用了循环,当ffl户输入n时退出程序。这里主要注意代码中使用new关键字创建对象及给属性赋值两个部分。
图11.11示例6的运行结果
3.5 面向对象的优点
了解了类和对象,也学习了如何定义类、创建对象和使用对象,下面总结面向对象的优点,具体如下。
与人类的思维习惯一致:面向对象的思维方式从人类考虑问题的角度出发,把人类解决问题的思维过程转变为程序能够理解的过程。面向对象程序设计能够让我们使用"类"来模拟现实世界中的抽象概念,用"对象"来模拟现实世界中的实体,从而用计算机解决现实问题。
信息隐藏,提高了程序的可维护性和安全性:封装实现了模块化和信息隐藏,即将类的属性和行为封装在类中,这保证了对它们的修改不会影响到其他对象,有利于维护。同时,封装使得在对象外部不能随意访问对象的属性和方法,避免了外部错误对它的影响,提高了安全性。
提高了程序的可重用性:一个类可以创建多个对象实例,增加了重用性。
面向对象程序设计还有其他优点,在以后的学习中会慢慢介绍。相信通过不断实践,学员的理解会不断加深。