一、this是什么?
this是一个引用类型,保存在内存的地址
在堆中每一个java对象都有this
this保存内存地址指向自身
举个栗子:
public class p {
public static void main(String [] args) {
// 创建对象
MyDate t1 = new MyDate(2008,8,8);
System.out.println(t1.year + "year " + t1.month + "month " + t1.day + "day");
MyDate t2 = new MyDate(2012,12,20);
System.out.println(t2.year + "year " + t2.month + "month " + t2.day + "day");
}
}
class MyDate{
// field
int year;
int month;
int day;
// Constructor
MyDate(){
}
MyDate(int _year,int _month,int _day){
year = _year;
month = _month;
day = _day;
}
}
来个图:
JVM.png注意:每个对象的 this 都记录本身对象在堆中所在的地址。
二、this能用在哪些地方?
1、this可以用在成员方法中
2、this可以用在构造方法中
1、用在成员方法中
this用在成员方法中,谁去调用这个成员方法,this就代表谁
this. 可以省略
this可以用来区分成员变量和局部变量
this不能用在静态方法中:
静态方法的执行根本不需要java对象的存在,直接使用 类名. 的方式访问
而this代表的是当前对象。所以静态方法根本没有this
举个栗子:(this用在成员方法中,谁去调用这个成员方法,this就代表谁。
this. 可以省略。)
public class p {
public static void main(String [] args) {
// 创建对象
Employee e = new Employee(7369, "HL");
// 工作
e.work();
// 创建对象
Employee e1 = new Employee(7368, "HF");
// 工作
e1.work();
}
}
class Employee{
int empno;
String ename;
Employee(){
}
Employee(int _empno,String _ename){
empno = _empno;
ename = _ename;
}
// 提供员工方法
public void work() {
// System.out.println(ename + " 在工作 ");
System.out.println(this.ename + " 在工作 ");
}
// this用在成员方法中,谁去调用这个成员方法,this就代表谁
// this. 可以省略
}
再举个栗子(this可以用来区分成员变量和局部变量):
public class p {
public static void main(String [] args) {
Manager m1 = new Manager("HL");
Manager m2 = new Manager();
m2.setName("HF");
System.out.println(m1.getName());
System.out.println(m2.getName());
}
}
class Manager{
private String name; // 成员变量
Manager(){};
Manager(String name){
this.name = name;
}
//成员方法
public void setName(String name) {
this.name = name; // this.name 确定成员变量
}
public String getName() {
return name;
// return this.name;
}
}
栗子:(this不能用在静态方法中)
public class p {
public static void main(String [] args) {
Person.m1();
}
}
class Person{
String name;
Person(){};
Person(String name){
this.name = name;
};
// 静态方法
public static void m1() {
// System.out.println(name);
// 报错:静态上下文中,无法访问非静态变量
Person p1 = new Person("HL");
System.out.println(p1.name);
}
}
2、this可以用在构造方法中
语法: this(实参);
通过一个构造方法调用另一个构造方法
目的:代码重用
注意:this(实参)必须出现在构造方法的第一行
举个栗子:
需求: 在创建日期对象时,默认为 1970-1-1
public class p {
public static void main(String [] args) {
// 创建对象
MyDate t1 = new MyDate(2008,8,8);
System.out.println(t1.year + "year " + t1.month + "month " + t1.day + "day");
MyDate t3 = new MyDate();
System.out.println(t3.year + "year " + t3.month + "month " + t3.day + "day");
}
}
class MyDate{
// field
int year;
int month;
int day;
// Constructor
MyDate(){
this(1970,1,1);
// this.year = 1971;
// this.month = 1;
// this.day = 1;
}
MyDate(int _year,int _month,int _day){
year = _year;
month = _month;
day = _day;
}
}
f
网友评论