第一关:
类的定义和对象的创建
练习目标
掌握类定义的方式;
掌握如何在类中定义成员变量和成员方法;
需求分析
在面向对象的思想中最核心就是对象,在程序中创建对象的前提是需要定义一个类。 为了掌握类的定义方式,将设计一个表示学生的类,该类具有表示姓名的属性name和表示年龄的属性age,同时还具有表示说话行为的方法speak(),用于输出学生的姓名和年龄。
设计思路(实现原理)
1)使用class关键字定义一个表示学生类型的类,类名为Student。
2)在Student类中定义两个成员变量name和age,分别用来表示姓名和年龄。其中,name的数据类型为String,变量age的数据类型为int。
3)在Student类中定义一个表示说话行为的speak()方法,用于输出学生的姓名和年龄。
编程要求
根据提示,在右侧编辑器补充代码,完成类的定义、对象的创建和使用。
测试说明
平台会对你编写的代码进行测试:
测试输入:张三
,18
;
预期输出: 我的姓名:张三,年龄:18
代码实现:
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
/**************** begin *****************/
// 定义学生类名
class Student
/**************** end *****************/
{
/**************** begin *****************/
// 在此定义2个成员变量:姓名name和年龄age
String name;
int age;
/**************** end *****************/
void speak() {
System.out.println("我的姓名:"+name+",年龄:"+age);
}
}
public class Task01
{
public static void main(String[] args)
{
Scanner scan = new Scanner(System.in);
Student stu=new Student();
stu.name=scan.next();
stu.age=scan.nextInt();
/**************** begin *****************/
// 定义一个学生对象
// 给学生对象姓名赋值,值为运行时接收从键盘输入
// 给学生对象年龄赋值,值为运行时接收从键盘输入
// 调用学生对象 speak() 方法
stu.speak();
/**************** end *****************/
}
}
第二关:
同一个对象被多个变量引用
练习目标
掌握如何创建类的对象;
掌握如何使用两个或者多个变量引用同一个实例对象。
需求分析
在程序中,一个对象可能在多处使用,这样就可能需要有多个变量来引用这个对象。 为了更好地掌握对象的创建和使用,本实训将创建三个学生对象,它们的引用变量分别是s1、s2和s3,首先分别使用s1和s2引用为name和age赋值,然后调用speak()方法,最后将s2变量赋值给s3,s3也调用speak()方法。
设计思路(实现原理)
1)编写一个测试类
2)在main()方法中,创建Student类的第一个对象,其引用变量为s1,使用s1调用name和age变量分别为它们赋值,然后调用speak()方法。
3)创建Student类的第二个对象,其引用变量为s2,使用s2分别为name和age赋值,然后调用speak()方法。
4)创建Student类的第三个对象,其引用变量为s3,将s2的值赋给s3,然后使用s3调用speak()方法。
编程要求
根据提示,在右侧编辑器补充代码,完成实训要求。
测试说明
平台会对你编写的代码进行测试:
测试输入:李雷
,20
,韩梅梅
,19
;
预期输出: 我的名字是李雷,今年20岁
我的名字是韩梅梅,今年19岁
我的名字是韩梅梅,今年19岁
代码实现:
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
/**************** begin *****************/
// 在此定义学生类名
class Student{
/**************** end *****************/
/**************** begin *****************/
// 在此定义2个成员变量:姓名name和年龄age
String name;
int age;
/**************** end *****************/
void speak(){
System.out.println("我的名字是" + name + ",今年" + age + "岁");
}
}
public class Task02{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
/**************** begin *****************/
/*
* 创建Student类的第一个对象,其引用变量为s1,
* 使用s1分别为name和age赋值,值为运行时接收从键盘输入
* 然后调用speak()方法。
*/
Student s1=new Student();
s1.name=scan.next();
s1.age=scan.nextInt();
s1.speak();
/**************** end *****************/
/**************** begin *****************/
/*
* 创建Student类的第二个对象,其引用变量为s2,
* 使用s2分别为name和age赋值,值为运行时接收从键盘输入,
* 然后调用speak()方法。
*/
Student s2=new Student();
s2.name=scan.next();
s2.age=scan.nextInt();
s2.speak();
/**************** end *****************/
/**************** begin *****************/
/*
* 创建Student类的第三个对象,其引用变量为s3,
* 将s2的值赋给s3,
* 然后使用s3调用speak()方法。
*/
Student s3=new Student();
s3.name=s2.name;
s3.age=s2.age;
s3.speak();
/**************** end *****************/
}
}
简单的的创建类和对象,没有什么难度,多做几次就好了。
第三关:
练习目标
了解为什么要对类进行封装; 掌握如何实现类的封装;
需求分析
对类进行封装,防止外界对类中的成员变量随意访问。 为了掌握类的封装,本练习将使用private关键字对学生类的成员变量name和age进行私有化,同时分别提供一个setName(String n)和setAge(int a)方法用于外界的访问,其中setAge(int a)中需要对age进行判断。
设计思路(实现原理)
1)对Student类进行修改,将name和age属性使用private修饰,然后定义getName()、setName(String n)、getAge()和setAge(int a)四个对外访问name和age的方法。
2)在setAge(int a)方法中对传入的参数进行检查,如果输入值为负数,则打印出“设置的年龄不合法”,如果不为负数,才将其设置为age属性的值。
3)编写测试类,在main()方法中创建Student类的实例对象,通过调用对象的setName(String n)和setAge(int a)方法来设置示例对象的name属性和age属性值,并调用speak()方法。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试1: 测试输入:小吴
,-3
;
预期输出: 设置的年龄不合法
我的名字是小吴,今年0岁
测试2: 测试输入:大强
,25
;
预期输出: 我的名字是大强,今年25岁
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
/**************** begin *****************/
// 在此定义学生类名
class Student
/**************** end *****************/
{
/**************** begin *****************/
// 将名字name和年龄age属性定义为私有的
/**************** end *****************/
private String name;
private int age;
/**************** begin *****************/
/*
* 定义4个公有的方法:getName()、setName(String n)、
* getAge()和setAge(int a),
* 用于对外访问name和age。
*
* 在setAge(int a)方法中对传入的参数进行检查,
* 如果输入值为负数,则打印出“设置的年龄不合法”,
* 如果不为负数,才将其设置为age属性的值。
*/
public String getName(){
return name;
}
public void setName(String n){
this.name=n;
}
public int getAge(){
return age;
}
public void setAge(int a){
if(a<0){
System.out.println("设置的年龄不合法");
}else{
this.age=a;
}
}
/**************** end *****************/
void speak() {
System.out.println("我的名字是" + name + ",今年" + age + "岁");
}
}
public class Task03{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String name1 = scan.next();
int age1 = scan.nextInt();
/**************** begin *****************/
/*
* 创建Student类的实例对象,
* 通过调用对象的setName(String n)和setAge(int a)方法
* 来设置实例对象的name属性和age属性值,
* 方法的参数值为运行时接收从键盘输入,
* 并调用speak()方法。
*/
Student stu=new Student();
stu.setName(name1);
stu.setAge(age1);
stu.speak();
/**************** end *****************/
}
}
在这注意:
在定义私有变量的时候一定要加上private关键字,还有在定义四个方法时要在无返回值类型的里面加参数,在有返回值类型的里面不要放参数。
第四关:
构造方法及重载
练习目标
掌握有参构造方法的定义方式; 掌握如何在类中定义重载的构造方法;
需求分析
如果希望在创建对象的时候直接为其属性赋值,可以定义有参的构造方法。有参构造方法指的是在初始化对象时,接受外部传入的值并赋给对象的属性。
和普通方法一样,构造方法也可以重载。不同的构造方法,可以为不同的属性进行赋值。
本练习将通过创建对象的方式演示不同构造方法的使用方式,并根据构造方法的输出结果对构造方法的重载进行学习。
设计思路(实现原理)
1)对Student类进行修改,在类中定义三个重载的构造方法,包括无参的构造方法,接收一个String类型参数的构造方法,接收String类型和int类型两个参数的构造方法。
2)编写测试类,在main()方法中,分别使用三个重载的构造方法创建三个Student对象。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:
小青
小刘
19
预期输出:
我的名字是null,今年0岁
我的名字是小青,今年0岁
我的名字是小刘,今年19岁
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
/**************** begin *****************/
// 在此定义学生类名
class Student{
/**************** end *****************/
/**************** begin *****************/
// 将姓名name和年龄age属性定义为私有的
private String name;
private int age;
/**************** end *****************/
/**************** begin *****************/
/*
* 定义三个重载的构造方法,
* 无参的构造方法:方法体为空;
* 接收一个String类型参数的构造方法:方法体中用参数为姓名赋值;
* 接收String类型和int类型两个参数的构造方法:方法体中用参数为姓名和年龄赋值;
*/
public void Na_ag(){}
public void Na_ag(String n){
this.name=n;
}
public void Na_ag(String n,int a){
this.name=n;
this.age=a;
}
/**************** end *****************/
void speak() {
System.out.println("我的名字是" + name + ",今年" + age + "岁");
}
}
public class Task04{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
/**************** begin *****************/
// 使用无参的构造方法创建一个Student对象,并调用speak()方法
Student stu=new Student();
stu.speak();
/**************** end *****************/
/**************** begin *****************/
/*
* 使用一个参数的构造方法创建一个Student对象,参数值为运行时接收从键盘输入,
* 然后调用speak()方法
*/
Student stu1=new Student();
String n=scan.next();
stu1.Na_ag(n);
stu1.speak();
/**************** end *****************/
/**************** begin *****************/
/*
* 使用两个参数的构造方法创建一个Student对象,参数值为运行时接收从键盘输入,
* 然后调用speak()方法
*/
Student stu2=new Student();
String n1=scan.next();
int a=scan.nextInt();
stu2.Na_ag(n1,a);
stu2.speak();
/**************** end *****************/
}
}
第五关:
this关键字访问构造方法
任务描述
本关任务:学习使用this关键字调用构造方法的使用。
练习目标
掌握如何在构造方法中使用this关键字访问重载的构造方法
需求分析
如果一个类中定义了多个重载的构造方法,为了避免在重载的构造方法中重复书写代码,可以在一个构造方法中使用this关键字调用其它的构造方法。
为了掌握this关键字访问构造方法的用法,本练习使用this关键字调用其他的构造方法。
设计思路(实现原理)
1)在Student类中创建多个重载的构造方法,包括无参的构造方法、一个参数的构造方法,以及两个参数的构造方法。
2)在一个参数的构造方法中使用this关键字调用无参构造方法,在两个参数的构造方法中调用一个参数的构造方法。
3)编写测试类,在main()方法中,调用两个参数的构造方法创建对象,演示构造方法的执行顺序。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入:小王
,23
;
预期输出: 无参的构造方法
一个参数的构造方法
两个参数的构造方法
我的名字是小王,今年23岁
代码实现:
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
/**************** begin *****************/
// 在此定义学生类名
class Student{
/**************** end *****************/
/**************** begin *****************/
// 将姓名name和年龄age属性定义为私有的
private String name;
private int age;
/**************** end *****************/
/**************** begin *****************/
/*
* 定义一个无参的构造方法:方法体输出一行文字"无参的构造方法";
*/
public void Na_ag(){
System.out.println("无参的构造方法");
}
/**************** end *****************/
/**************** begin *****************/
/*
* 定义一个接收一个String类型参数的构造方法:
* 方法体中:使用this关键字调用无参构造方法,
* 并使用String类型参数为姓名赋值,再输出一行文字"一个参数的构造方法";
*/
public void Na_ag(String n){
this.Na_ag();
this.name=n;
System.out.println("一个参数的构造方法");
}
/**************** end *****************/
/**************** begin *****************/
/*
* 定义一个接收String类型和int类型两个参数的构造方法:
* 方法体中:使用this关键字调用一个参数的构造方法,
* 并使用int类型参数为年龄赋值(不用为姓名赋值),再输出一行文字"两个参数的构造方法";
*/
public void Na_ag(String n,int a){
this.Na_ag(n);
this.age=a;
System.out.println("两个参数的构造方法");
}
/**************** end *****************/
void speak() {
System.out.println("我的名字是" + name + ",今年" + age + "岁");
}
}
public class Task05 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String n=scan.next();
int a=scan.nextInt();
/**************** begin *****************/
/*
* 调用学生类的两个参数的构造方法创建对象,参数值为运行时接收从键盘输入;
* 使用对象调用speak()方法。
*/
Student stu=new Student();
stu.Na_ag(n,a);
stu.speak();
/**************** end *****************/
}
}
第六关:
静态变量的使用
练习目标
了解静态变量的作用
掌握静态变量的定义和使用方式
需求分析
当多个对象存储的数据相同时,可以使用静态变量的方式存储。
设计思路(实现原理)
1)定义一个学生类,并在类中定义两个非私有属性:姓名name属性和学校school属性,学校school属性为静态的,并设置默认值为“北京大学”;类中还定义一个speak方法。
2)改写学生类的school属性值;再通过前面创建的两个对象分别调用speak()方法。
编程要求
根据提示,在右侧编辑器补充代码
测试说明
平台会对你编写的代码进行测试:
测试输入:张三
,李四
,湖南大学
;
预期输出: 我的名字是张三,来自北京大学
我的名字是李四,来自北京大学
我的名字是张三,来自湖南大学
我的名字是李四,来自湖南大学
代码实现:
import java.util.Scanner;
/*
* 说明:根据提示,补充完整 begin 和 end 之间的代码。
* (其他代码可以不用改)
*/
// 定义学生类名
class Student{
/**************** begin *****************/
/*
* 定义两个非私有属性:姓名name属性和学校school属性,
* 学校school属性为静态的,默认值为北京大学。
*/
String name;
static String school="北京大学";
/**************** end *****************/
void speak() {
System.out.println("我的名字是" + name + ",来自" + school);
}
}
public class Task06 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
/**************** begin *****************/
/*
* 定义两个学生类对象,并为每个对象的姓名属性赋值,
* 值为运行时接收从键盘输入;
* 通过每个对象调用speak()方法。
*/
Student stu1=new Student();
Student stu2=new Student();
stu1.name=scan.next();
stu2.name=scan.next();
stu1.speak();
stu2.speak();
/**************** end *****************/
/**************** begin *****************/
/*
* 改写学生类的school属性值,值为运行时接收从键盘输入
*/
Student.school=scan.next();
/**************** end *****************/
/**************** begin *****************/
/*
* 再通过前面创建的两个对象分别调用speak()方法
*/
stu1.speak();
stu2.speak();
/**************** end *****************/
}
}
第七关:
静态代码块
练习目标
了解不同分类的代码块 掌握不同代码块的作用及其执行时机
需求分析
有时候,需要将某一段关联紧密的或者实现了某一功能的代码封装的一个代码块中。
为了让熟悉代码块的应用,本练习将编写一个包含了静态代码块,局部代码块和构造代码块的类,演示不同代码块之间的执行时机。
4、设计思路(实现原理)
1)编写测试类,在类中定义一个静态代码块、一个构造代码块、一个无参的构造方法和一个成员方法localBlock(),在localBlock()方法中定义一个局部代码块。
2)创建测试类的两个实例对象,通过这两个变量的引用分别调用localBlock()方法。
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
预期输出:
静态代码块
---------
构造代码块
构造方法
---------
构造代码块
构造方法
---------
局部代码块
---------
局部代码块
代码实现:
/*
* 说明:根据 TODO 提示,补充完整对应功能代码。
* (其他代码可以不用改)
*/
public class Task07 {
static {
System.out.println("静态代码块");
}
{
System.out.println("构造代码块");
}
public Task07() {
System.out.println("构造方法");
}
void localBlock() {
{
System.out.println("局部代码块");
}
}
public static void main(String[] args) {
System.out.println("---------");
// TODO 在此定义一个测试类的对象
Task07 tk1=new Task07();
System.out.println("---------");
// TODO 在此再定义一个测试类的对象
Task07 tk2=new Task07();
System.out.println("---------");
// TODO 在此使用第一个对象调用localBlock方法
tk1.localBlock();
System.out.println("---------");
// TODO 在此使用第二个对象调用localBlock方法
tk2.localBlock();
}
}