关于java语言当中的this关键字:
- 1.this是一个关键字,翻译为:这个
- 2.this是一个引用,this是一个变量,this变量中保存了内存地址指向了自身,this存储在JVM堆内存java对象内部
- 3.创建100个java对象,每个对象都有this,也就是说有100个不同的this
- 4.this可以出现在“实例方法”当中,this指向当前正在执行这个动作的对象
- 5.this在多数情况下是可以省略不写的
- 6.this不能使用在带有static的方法中
示例代码01:
public class Customer {
//顾客名【堆内存的对象内部中存储,所以访问该数据的时候,必须先创建对象,通过引用的方式访问】
String name;//实例变量:必须采用“引用.”的方式访问
//定义顾客购物方法
//每一个顾客购物最终的结果是不一样
//所以购物这个行为是属于对象级别的行为
//由于每一个对象在执行购物这个动作的时候最终结果不同,所以购物这个动作必须有对象参与
//重点: 没有static关键字的方法被称为“实例方法”,实例方法怎么访问?“引用.”
//重点:没有static关键字的变量被称为“实例变量”
//注意:当一个行为/动作执行的过程当中是需要对象参与的,那么这个方法一定要定义为“实例方法”,不要带有static关键字
//以下方法定义为实例方法,因为每一个顾客在真正购物的时候,最终的结果是不同的。所以这个动作在完成的时候必须有对象的参与。
public void shopping(){
System.out.println(this.name + "在购物");
}
public static void doSome(){
//这个执行过程中没有“当前对象”,因为带有static的方法是通过类名的方式访问的
//或者说这个“上下文”当中没有“当前对象”,自然也不存在this(this代表的是当前正在执行这个动作的对象)
//以下程序为什么编译报错
//doSome方法调用不是对象去调用,是一个类名去调用,执行过程中没有“当前对象“
//name是一个”实例变量“,以下代码的含义是:访问当前对象的name,没有当前对象,自然也不能访问当前对象的name
//System.out.println(name);
}
public static void doOther(){
//假设想访问name这个实例变量的话应该怎么做?
//System.out.println(this);
//可以采用以下方案,但是以下方案,绝对不是访问的当前对象的name
//创建顾客对象
Customer c = new Customer();
System.out.println(c.name);//这里访问的name是c引用指向对象的name
}
}
========================================================================================
public class CustomerTest01 {
public static void main(String[] args) {
//创建一个顾客对象
Customer c1 = new Customer();
c1.name = "zhangsan";
//顾客c1调用购物方法
c1.shopping();
//在创建一个顾客对象
Customer c2 = new Customer();
c2.name = "lisi";
//顾客c2调用购物方法
c2.shopping();
//调用doSome方法
//采用“类名.”的方式访问,显然这个方法在执行的时候不需要对象的参加
Customer.doSome();
//调用doOther方法;
Customer.doOther();
}
}
内存分析图:
示例代码02:
public class ThisTest {
//实例变量(引用.的方式访问)
int num = 10;
//带有static的方法
//JVM负责调用main方法,JVM是怎么调用的
//ThisTest.main(String[]);
public static void main(String[] args) {
//没有当前对象this
//以下代码什么意思?
//访问“当前对象”的num属性
//System.out.println(num);
//正确的访问方式
ThisTest tt = new ThisTest();
System.out.println(tt.num);
}
示例代码03:
public class ThisTest02 {
//带有static
//不是实例方法
public static void main(String[] args) {
//调用doSome方法
doSome();
//调用doSme方法
ThisTest02.doSome();
//调用doOther对象
//编译错误
//ThisTest.doOther();//实例对象必须先创建对象,通过引用.的方式访问
//doOther是实例方法
//实例方法调用必须有对象的存在
//以下代码表示的含义:调用当前对象的doOther方法
//但是由于main方法中没有this,所以以下方法不能使用
//doOther();
ThisTest02 tt = new ThisTest02();
// tt.doSome();
tt.run();
}
//实例方法
public static void doSome(){
System.out.println("doSome excute!");
}
//实例方法
public void doOther(){
//this表示当前对象
System.out.println("doOther excute!");
}
//实例方法
//run是实例方法,调用run方法的一定是有对象存在的。
//一定是先创建了一个对象才能调用run方法
public void run(){
//在大括号中的代码执行过程中一定是存在"当前对象"的
//也就是说这里一定是有“this”的
System.out.println("run excute!");
//doOther是一个实例方法,实例方法调用必须有对象的存在
//以下代码表示的含义就是:调用当前对象的doOther方法
doOther();//this.大多数情况下都是可以省略的
//this.doOther();//比较完整的写法
}
}
示例代码04:
class User {
//属性
private int id;//实例变量
private String name;
//无参构造函数
public User(){
}
public User(int id,String name){
//等号前面的this.id是实例变量id
//等号后面的id是局部变量id
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class UserTest {
public static void main(String[] args) {
User u = new User(100,"zhangsan");
System.out.println(u.getId());
System.out.println(u.getName());
//想修改名字
u.setId(500);
u.setName("lisi");
System.out.println(u.getId());
System.out.println(u.getName());
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94332.html