11.3 Java是面向对象的语言
在面向对象程序设计中,类是程序的基本单元。Java是完全面向对象的编程语言,所有程序都是以类为组织单元的。回想自己写过的每一个程序,基本框架是不是都如示例1所示的结构。
示例1
public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!!!"); } }
分析示例1 ,程序框架最外层的作用就是定义了一个类HelloWorld,第1章曾提到HelloWorld是一个类名,原因就在此。
11.3.1 Java 的类模板
学习了类、对象的相关知识,那么如何在Java中描述它们呢?
Java中的类将现实世界中的概念模拟到计算机中,因此需要在类中描述类所具有的属性和方法。Java的类模板如下所示。
语法
public class <类名>{
//定义属性部分
属性 1 的类型属性 1;
属性 2 的类型属性 2;
……
属性 3 的类型属性 3;
//定义方法部分
方法 1;
方法 2;
……
方法 n;
}
在Java中要创建一个类,需要使用一个class、一个类名和一对大括号。
其中,class是创建类的关键字。在class前有一个public,表示"公有"的意思。编写程序时,要注意编码规范,不要漏写public。在class关键字的后面要给定义的类命名,然后写上一对大括号,类的主体部分就写在{}中。类似于给变量命名,类的命名也要遵循一定的规则。
不能使用Java中的关键字。
不能包含任何嵌入的空格或点号 "." ,以及除下划线 "_"、字符 "$" 外的特殊字符。
不能以数字开头。
规范:
类名通常由多个单词组成,每个单词的首字母大写。
另外,类名应该简洁而有意义,尽量使用完整单词,避免使用缩写词,除非该缩写词已被广泛使用,如HTML、HTTP、IP等。
11.3.2 如何定义类
类定义了对象将会拥有的属性和方法。定义一个类的步骤如下。
1.定义类名
通过定义类名,得到程序最外层的框架。
语法
public class 类名{ }
2. 编写类的属性
通过在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量。
3. 编写类的方法
通过在类中定义方法来描述类所具有的行为,这些方法称为类的成员方法。
知道了定义一个类的步骤,下面看一个具体例子。
问题:在不同的北大青鸟培训中心(北京中心、杭州中心等),学员们会感觉到相同的教学环境和教学氛围,用类的思想输出培训中心的信息。
分析:在定义类之前,首先要从问题中找出对象和类,进而分析它所具有的属性和方法。一般利用问题描述中的名词和名词短语来识别对象和类。例如,用特指名词(张浩、我的家、第六次比赛)识别对象,用复数名词(人们、顾客、开发商)及泛指名词(每一个人、不同的教员、一台计算机)识别类。对上面的问题,北京中心和杭州中心是特指名词,这样得到两个对象;不同的北大青鸟培训中心是泛指名词,可以抽象成类。对于每个中心,都具有“中心名称”、“教室数目”和“机房数目”,它们所具有的行为都有“展示本中心的信息”。通过上面的分析,抽象出了这个类的(部分)属性和行为,如图11.6所示,下一步就可以定义类了。根据定义类的步骤,编写代码,如示例2所示。
school类
属性:
中心名称
教室数量
机房数目
方法:
展示中心信息
图11.6 School类的属性和方法
示例2
School类的showCenter()方法
School类的三个属性
public class School { String schoolName; //中心名称 int classNumber; //教室数目 int labNumber; //机房数目 //定义北大青鸟中心的方法 public void showCenter() { System.out.println(schoolName + "培训中心\n" + "配备: " + classNumber + "教" + labNumber + "机"); } }
示例2定义了一个School类,并且定义了三个成员变量:schoolName、classNumber、labNumber。另外,定义了一个类的方法,方法名是showCenter()。这个方法的作用是显示中心的信息,即中心名称及教室和机房的配置情况。第12章将详细讲解如何编写类的方法,这里只对showCenter))方法进行简单说明,该方法代码如下。
public String showCenter() { //方法体 }
编写showCenter()方法时,大家只需要在 "方法体" 部分写出自己要实现的功能即可,showCenter是方法名。在Java中,一个简单方法的框架如下所示。
语法
访问修饰符 返回值类型 方法名(){
//方法体
}
访问修饰符限制了访问该方法的范围,如public,还有其他的访问修饰符,会在以后学习。返回值类型是方法执行后返回结果的类型,这个类型可以是基本类型,或者是引用类型,也可以没有返回值,此时必须使用void来描述。方法名一般使用一个有意义的名字描述该方法的作用,其命名应符合标识符的命名规则。
说明
这里介绍一下Camel(骆驼)命名法和Pascal (帕斯卡)命名法。
骆驼命名法:方法或变量名的第一个单词的首字母小写,后面每个单词的首字母大写,如 showCenter、userName 等。
帕斯卡命名法:每一个单词的首字母都大写,如类名School等。在Java中,定义类的属性和方法使用骆驼命名法,定义类使用帕斯卡命名法。
11.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所示。
表11-2 Java数据类型的默认值
提示:
在Idea中使用操作符引用类的属性和方法时,发现Idea会弹出一个下拉菜单,如图11.8所示,其中列出了所有的属性和方法。用户只需要选择想要引用的选项就可以了,这是Idea给用户提供的便捷。
图11.8自动提示
11.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的运行结果