头歌实践:Java类和对象之this关键字
1.任务描述
本关任务:编写一个商品结算的小程序。
2.this 关键字
大部分时候,普通方法访问其他方法、成员变量时无需使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。
接下来我们看个例子:
public class Demo {
String name;
public Demo(String name) {
this.name = name;
}
}
我们可以看到成员变量与形参的名称相同,都为 name,那么我们如何区分呢?
在 Java 语言中规定使用 this 关键字来代表本类对象的引用。在上述代码中, this.name 就指的是 Demo 类中的成员变量 name, 而等于号右边的 name 就是形参,这句话的意思是把形参 name 的值赋值给成员变量 name。
接下来我们进行一个测试。
public class Demo {
String name = "张三";
public Demo(String name) {
this.name = name;
}
public static void main(String[] args) {
Demo demo = new Demo("李四");
System.out.println(demo.name);
}
}
执行结果:
李四
当一个类的属性(成员变量)名与访问该属性的方法参数名相同时,则需要使用 this 关键字来访问类中的属性,以区分类的属性和方法中的参数。
this 关键字最大的作用就是让类中一个方法,访问该类里的另一个方法或实例变量。
来看个例子:
public class Demo {
public void KeyBoard(){
System.out.println("准备好了键盘"); }
// 定义一个方法,该方法需要借助 KeyBoard 方法
public void WritingCode(){
// 使用this引用run方法
this.KeyBoard();
System.out.print("我正在敲代码");
}
public static void main(String[] args) {
Demo demo = new Demo();
demo.WritingCode();
}
}
执行结果:
准备好了键盘我正在敲代码
在现实世界里,对象的一个方法依赖于另一个方法的情形很常见,例如,吃饭方法依赖于拿筷子方法。这种依赖都是同一个对象两个方法之间的依赖。因此,Java 允许对象的一个成员直接调用另一个成员,可以省略 this 前缀。也就是说,将上面的 run( ) 方法改为如下形式也完全正确。
public void run() {
jump();
System.out.println("正在执行run方法");
}
大部分时候,一个方法访问该类中定义的其他方法、成员变量时,加不加 this 前缀的效果是完全一样的。
需要注意的是,对于 static 修饰的方法而言,可以使用类来直接调用该方法,如果在 static 修饰的方法中使用 this 关键字,则这个关键字就无法指向合适的对象。所以,static 修饰的方法中不能使用 this 引用。并且 Java 语法规定,静态成员不能直接访问非静态成员。
省略 this 前缀只是一种假象,虽然程序员省略了调用 WritingCode() 方法之前的 this,但实际上这个 this 依然是存在的。
this( ) 用来访问本类的构造方法,括号中可以有参数,如果有参数就是调用指定的有参构造方法。
下面定义一个 Student 类,使用 this( ) 调用构造方法给 name 赋值,Student 类的代码如下所示:
public class Student {
String name;
// 无参构造方法
public Student() {
this("张三");
}
// 有参构造方法
public Student(String name) {
this.name = name;
}
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.name);
}
}
执行结果:
张三
注意:
- this( ) 不能在普通方法中使用,只能写在构造方法中;
- 在构造方法中使用时,必须是第一条语句。
3.编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。
开始你的任务吧,祝你成功!
3.1参考代码
/**
* 任务:编写一个商品结算的小程序
* 类名为:Shop
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
public class Shop {
// 定义该商品的两个属性:价格(double)和数量(int)
private double price;
private int total;
// 将形参的值赋值给成员变量
public Shop(double price, int total) {
this.price=price;
this.total=total;
}
// 该方法实现计算价钱的功能,将计算结果返回,价钱 = 价格 * 数量
public double sum() {
return price*total;
}
}
/********** End **********/
任务描述
本关任务:定义一个完整的学生类,该类定义了学生的基本信息。
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,按照提示编写程序代码。
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。 可在右侧“测试结果”区查看具体的测试集详情。
开始你的任务吧,祝你成功!
3.2参考代码
/**
* 任务:定义一个完整的学生类,该类定义了学生的基本信息。
* 类名为:Student
*/
// 请在下面的Begin-End之间按照注释中给出的提示编写正确的代码
/********** Begin **********/
// 创建一个名为 Student 的公开类
public class Student {
// 定义学生的两个属性:姓名(name String)和年龄(age int)
private String name;
private int age;
// 获取学生年龄
public int getAge() {
return age;
}
// 设置学生的年龄,将形参的值赋值给成员变量
public void setAge(int age) {
this.age=age;
}
// 获取学生姓名
public String getName() {
return name;
}
// 设置学生姓名,将形参的值赋值给成员变量
public void setName(String name) {
this.name=name;
}
// 该方法实现输出学生信息的功能。 输出格式:学生姓名:xx,年龄:xx
public void info() {
System.out.println("学生姓名:"+name+",年龄:"+age);
}
}
/********** End **********/