任务描述
本关任务:定义一个 Student 学生公开类,该类具有学号 id(int),年龄 age(int),grade(int) 等属性;它们所具有的行为有学习 study(),考试 examination(),讲话 tell(),它们都无返回值和传入的参数。
study 方法的功能为换行输出:学号为xx的学生正在学习。
; examination 方法的功能为换行输出:xx年级正在考试。
; tell 方法的功能为不换行输出:正在讲话的是一个xx岁的学生。
。
相关知识
为了完成本关任务,你需要掌握:
- 类的基本概念;
- 类的声明;
- 类的成员变量、局部变量和类变量;
- 成员方法。
类
Java 是一门面向对象的编程语言,而面向对象最关键的两个词汇是类与对象。这里我们主要给大家讲解类的概念。
类: 类就是具备某些共同特征的实体的集合,它是一种抽象的数据类型(它属于引用数据类型),它是对所具有相同特征实体的抽象。
对象:是类的一个实例,有状态和行为。每个对象拥有自己独立的属性,依靠属性来区分不同对象。
在面向对象的程序设计语言中,类是对一类“事物”的属性与行为的抽象。属性是事物的状态,行为就是这个事物可以做什么。比如,人就是一个类,那么具体的某个人“小明”就是“人”这个类的对象,而“体重、性别、年龄”等信息就是对象的属性,人的行为比如“吃饭、睡觉和玩”等就是对象的方法。
注意:类只是一个抽象的概念,它仅仅是一个概念,是不存在的实体!
类的声明
在 Java 中定义类,使用关键字 class 完成。语法如下:
1. 权限修饰符 class 类名称 {
2. 属性 (成员变量) ;
3. 行为 (成员方法(函数)) ;
4. }
权限修饰符可写可不写,我们之前见到的 public 就是权限修饰符的一种。在后面的学习任务中,我会为大家详细介绍。
例子:声明一个人类。
1. public class Person {
2. // 属性 (成员变量) ;
3. // 行为 (成员方法(函数)) ;
4. }
public 表示“共有”的意思。如果使用 public 修饰,则可以被其他类和程序访问。每个 Java 程序的主类都必须是 public 类。
创建一个新的类,就是创建一个新的数据类型。定义类其实就是在定义类中的成员(成员变量和成员函数)。
变量
在 Java 中类的成员变量定义了类的属性。例如,一个人类中一般有体重、性别和年龄等属性,这时就需要定义体重、性别和年龄 3 个属性。
那 Java 中的成员变量又是什么呢?
首先我们来看,Java 语言支持的变量类型有:
- 局部变量:在类的方法中定义的变量,且只能在该方法中使用,我们之前学习的变量都是局部变量;定义以后必须赋值才能使用;
- 成员变量:也称为实例变量,它的定义在方法的外部,直接写在类当中;随着对象创建而诞生,随着对象被垃圾回收而消失;如果是对某个对象的特殊描述,可以用该变量;定义时如果不赋值的话,会采用默认初始值;
- 静态变量:也称为类变量,实质上是一个全局变量。它的定义在方法的外部,直接写在类当中,与类共存亡,它用 static 修饰,如果某个内容是被所有对象所共享,那么该内容就应该用 static 修饰;定义时如果不赋值的话,会采用默认初始值。
例子:
1. public class Demo {
2. static int a; // 类变量
3. int b; // 实例变量
4. public static void main(String[] args) {
5. int c; // 局部变量
6. }
7. }
我们再来看一下它们是如何被引用的:
- 局部变量可以直接在方法中赋值或引用,就像我们之前学习的一样;
- 成员变量必须得通过创建一个对象后引用;
- 类变量在这个类中可以直接拿来用,若是在另一个类中要用到该类的类变量,需要通过类名.变量名引用。
现在我们对成员变量已经有了一定的了解,接下来看个例子吧。
在 Person 类中定义该类的成员变量,也就是该类的属性。
1. public class Person {
2. // 属性 (成员变量) ;
3. double weight ; // 为该类定义一个表示体重的成员变量
4. char sex; // 为该类定义一个表示性别的成员变量
5. int age; // 为该类定义一个表示年龄的成员变量
6. }
成员方法
在 Java 中类的成员方法定义了类的行为。例如,一般人会有吃饭、睡觉和玩等行为,在定义人的类时,就需要定义吃饭、睡觉和玩 3 个方法。
类的各种功能操作都是用方法来实现的,属性只不过提供了相应的数据。一个完整的方法通常包括方法名称、方法主体、方法参数和方法返回值类型。
成员方法的声明语法:
1. [权限修饰符] 返回值类型 方法名([参数类型 参数名]) {
2. // 方法体
3. // 返回值
4. }
注意:[ ] 表示可写可不写。
返回值类型:我们之前学到的八种基本类型和 void 都可以用来做方法的返回值类型。要注意的是 void 表示没有返回值,所以不需要写返回值语句,而其他类型都需要返回一个该类型的值。
返回值语句:
1. return 返回值;
参数类型 参数名:可以有多个,这些参数都要有自己的数据类型,可以是原始数据类型,也可以是复杂数据类型,一个方法主要依靠参数来传递消息。方法主体是方法中执行功能操作的语句。
例子:
1. public int a(){ // 定义一个名为a,返回值类型为int的成员方法
2. // 返回值语句: return 返回值;
3. return 0; // 由于返回值类型为 int,所以需要返回一个int型的常量或变量
4. }
5. public void c(){ // 定义一个成员方法,它的名为c,返回值类型为void,该方法不需要返回值。
6. }
以上是没有携带参数的,那携带参数的又是怎么回事呢?
例子:
1. public double b(int a,double b){ // 定义一个名为c,返回值类型为double的成员方法,其携带的参数有两个,一个为int型的变量a,一个double型的变量b
2. double c = a*b;
3. return c; // 由于返回值类型为 int,所以需要返回一个int型的常量或变量
4. }
成员方法的调用必须通过实例一个对象来调用。
同样方法也可以被 static 修饰,变为静态方法,只不过变为静态方法以后,就不能调用实例变量,而成员方法却可以调用静态变量。如果在该类中调用静态方法的话,我们可以直接调用,而如果不在同一个类中,需要通过类名.方法名()或者实例一个对象,通过该对象调用静态方法。
例子:在人的类中定义它的成员方法(行为)。
1. public class Person {
2. // 属性 (成员变量) ;
3. double weight = 100.00; // 为该类定义一个表示体重的成员变量
4. char sex = '男'; // 为该类定义一个表示性别的成员变量
5. int age = 18; // 为该类定义一个表示年龄的成员变量
6. // 定义一个名为a,返回值类型为int的成员方法
7. public void eat(){ // 该成员方法表示吃饭这个行为
8. System.out.printf("我喜欢吃饭,所以我的体重高达%f千克\n",weight);
9. }
10. // 定义一个名为a,返回值类型为int的成员方法
11. public void sleep(){ // 该成员方法表示睡觉这个行为
12. System.out.println("我正在睡觉!");
13. }
14. public void play(){ // 该成员方法表示玩这个行为
15. System.out.printf("我的性别为%c,今年%d岁,我喜欢玩耍",sex,age);
16. }
17. }
/**
* 任务:定义一个 Student 学生公开类,该类具有学号 id(int),年龄 age(int),grade(int) 等属性;
* 它们所具有的行为有学习 study(),考试 examination(),讲话 tell(),它们都无返回值和传入的参数。
* 类名为:Student
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:创建一个名为 Student 的公开类
public class Student {
// 第二步:定义学生的属性
int id = 20110624;
int age = 18;
int grade = 12;
// 第三步:定义学生的行为方法
public void study(){
System.out.printf("学号为%d的学生正在学习。\n",id);
}
public void examination(){
System.out.printf("%d年级正在考试。\n",grade);
}
public void tell(){
System.out.printf("正在讲话的是一个%d岁的学生。",age);
}
}
/********** End **********/
/**
* 任务:定义一个 Student 学生公开类,该类具有学号 id(int),年龄 age(int),grade(int) 等属性;
* 它们所具有的行为有学习 study(),考试 examination(),讲话 tell(),它们都无返回值和传入的参数。
* 类名为:Student
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 第一步:创建一个名为 Student 的公开类
public class Student {
// 第二步:定义学生的属性
int id = 20110624;
int age = 18;
int grade = 12;
// 第三步:定义学生的行为方法
public void study(){
System.out.printf("学号为%d的学生正在学习。\n",id);
}
public void examination(){
System.out.printf("%d年级正在考试。\n",grade);
}
public void tell(){
System.out.printf("正在讲话的是一个%d岁的学生。",age);
}
}
/********** End **********/