/*Java this?

0.1

 * this 是一个关键字,翻译为:这个;                                                                                             * this是一个引用,是一个变量,this变量中保存了内存地址,指向了自己;                                     * this存储在JVM堆内存Java对象内部;生成多少个对象(每个对象都有一个this)就有多少个this;  当使用c1去访问Customer,整个过程中出现的this就是c1;当使用c2去访问Customer,整个过程中出现的this就是c2。

0.2

图1实现了这条语句:Customer c1 = new Customer();(c1就是一个引用)                                          c1是一块栈内存,存着Customer对象的地址,c1被new出来后,this也随之产生了,this如图,也指向Customer(自身)。图1的this就是c1。

图2中new了两个对象c1和c2,各自有自己的实例变量name,一个为“zhangsan”一个为“lisi” 

 0.3

* 没有static关键字的方法被称为“实例方法”;没有static关键字的变量被称为“实例变量”                   

* 实例方法访问时用 “引用.方法名”的方式。

* 实例变量访问时采用“引用.实参”的方式。 (在堆内存的对象内部存储,所以访问该数据的时候必须先创建对象)

* 当一个行为 / 动作执行的过程中需要对象参与,则该方法一定要定义为“实例方法”,不要带“static”关键字;当一个行为 / 动作执行的过程中不需要对象参与,则该方法则要定义为“静态方法

0.4

this只能实例方法调用,不能在静态环境中使用,谁(对象)调用这个方法,方法里提到的this就是谁。即this指向当前正在执行实例方法的动作的对象。在某个类的方法里出现了实例变量,前面没有“引用.”时,其实是将“this.”省略了。因为这个实例变量不能写成固定的,应该是随调用这个方法的对象变化而变化。

0.5 

总结一下:static方法不能“直接”访问实例变量和实例方法,因为实例方法需要具体对象访问,调用的时候用对象引用变量.方法名,而static的方法里不存在this,也就不能用实例方法。

例:一个实例变量,不能在静态方法中调用,因为访问实例变量时必须用“引用.”的方式,而静态方法执行过程中不需要对象(引用);static的方法调用不需要对象,直接使用类名,所以执行过程中没有当前对象,所以也不能使用this

1. 什么情况下“this. ”不能省略?

1) 用来区分局部变量和实例变量的时候"this."不能省略

package thistest3;

//用户类
public class User {
	//属性
	private int id; //实例变量
	private String name; //实例变量
	
	//(无参)构造函数
	public User() {
		
	}
	
	//(有参)构造函数
	public User(int id, String name) {
		this.id = id;
		this.name = name;
	}
	
	/*
	public void setID1(int a) {
		id = a; //省略了this.
	}
	
	根据就近原则,以下代码的id和实例变量id无关,不能采用这种方式
	public void setID2(int id) {
		id = id; 
	}*/
	
	public void setID(int id) {
		//等号左边的id是实例变量id
		//等号右边的id是局部变量id
		this.id = id; 	
	}
	
	public void setName(String name) {
		//等号左边的name是实例变量name
		//等号右边的name是局部变量name
		this.name = name; 	
	}
	
	public int getID() {
		return id; 	
	}
	
	public String getName() {
		return name;
	}
	
	//为什么在已有构造函数赋值的情况下,还要设置一个setID方法?
	//当我想修改某个对象的名字时,不是重新new一个对象,而应该是用user的set方法修改
}


public class UserTest {

	public static void main(String[] args) {
		User u1 = new User(100,"张三");
		
		System.out.println(u1.getID());
		System.out.println(u1.getName());
		
		//想修改名字时,不能重新new一个对象(其他值又不都改)
		u1.setID(12138);
		System.out.println(u1.getID() + " " + u1.getName());
	}
}

this用法:

1. 可以使用在实例方法中,代表当前对象【语法格式:this. 】

2. 可以使用在构造方法当中,通过当前构造方法调用其它的构造方法【语法格式:this(实参) 】

    ***注:这个语句要想生效,只能出现在当前构造方法的第一行,即第一条语句(由此也可知,在一个构造方法中          调用别的构造方法只能调用一次/一个)。

总结练习:

package Test;

public class Test {
	
	//带有static的方法
	public static void method1() {
		
		//调用dosome
		//完整方式调用
		Test.dosome();
		//省略方式调用
		dosome();
		
		//调用doother
		Test t2 = new Test();
		//完整方式调用
		t2.doother(); //这个方法是静态方法,没有this,只能现new一个对象
		//省略方式调用
		/***/
		
		//访问i
		//完整方式访问
		System.out.println(t2.i);
		//省略方式访问
		/***/
		
	}
	
	//没有static的方法
		public void method2() {
			
			//调用dosome
			//完整方式调用
			Test.dosome();
			//省略方式调用
			dosome(); //???
			
			//调用doother
			//完整方式调用
			this.doother(); //因为当前方法时实例方法,有对象,有this
			//省略方式调用
			doother();
			
			//访问i
			//完整方式访问
			System.out.println(this.i);
			//省略方式访问
			System.out.println(i);
		}
		
		//主方法
		public static void main(String[] args) {
			
			//要求在这里编写程序调用method1
			//使用完整方式调用
			Test.method1();
			//使用省略方式调用
			method1();//同一个类里
			
			//要求在这里编写程序调用method2
			Test t1 = new Test();
			//使用完整方式调用
			t1.method2();
			//使用省略方式调用
			/***/
		}
	
		//实例变量
		int i = 10;
		
		//静态方法
		public static void dosome() {
			System.out.println("do some!");
		}
		
		//实例方法
		public void doother() {
			System.out.println("do other!");
		}
}

***自定义一个类之后,右键单击点击源码-setter and getter,可自动生成方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李 董

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值