1、this关键字
package this_keyword;
{
/**
* 关于java语言当中的this关键字:
* 1、this是一个关键字,翻译为:这个
* 2、this是一个引用,this是一个变量,this变量中保存了内存地址指向自身,this存储在jvm堆内存java对象内部
* 3、创建100个java对象,每一个对象都有this,也就是说有100个不同的this
* 4、从内存图中分析,每个对象的this就是指向这个对象的引用
* 5、当使用c1访问对象时,整个过程中出现的this就是c1,当时使用c2访问对象时,这时出现的this就是c2。
*
*/
public class this_keyword {
public static void main(String[] args)
{
//创建Customer对象
Customer c1=new Customer();
c1.name="zhangsan";
//再创建Customer对象
Customer c2=new Customer();
c2.name="lisi";
c2.shopping();//此时显示lisi在购物
//调用dosome方法(修饰符列表上有static)
//采用“类名.”,的方式访问,
Customer.doome();
Customer.doOther();
}
}
//this存在于堆内存中的java对象内部,是一块内存空间,其保存着自身的内存地址。
package this_keyword;
public class Customer {
String name;//实例变量:必须采用引用.的方式访问,所以访问实例变量必须先创建对象,才能通过引用访问这个变量。成员变量分为实例变量和静态变量,没有static修饰的变量就是实例变量使用引用.的方式调用,有static修饰的就是静态变量使用类名.的方式调用。
public Customer()
{
}
//带static关键字的一个方法,实质上带static的类时一个专用方法,里面的属性都是一样的,不需要变化,因此只需要类名.的方式引用,
//而不带static的类时通用类,这种类随着对象的不同而变化需要用引用名.方法名。
//顾客的购物行为
//每一个顾客购物的最终结果是不一样的
//所以购物这个行为是属于对象级别的行为
//由于每一个对象在执行购物这个动作时最终结果不同,所以购物这个动作必须由“对象”的参与。
//重点:没有static关键字的方法被称为“实例方法”
//重点:没有static关键字的变量被称为“实例变量”
//当一个行为/动作执行的过程中是需要对象参与的,那么这个方法一定定义为“实例方法”,不要带static关键字
//以下方法定义为实例方法,因为每一个顾客在真正购物的时候,最终的结果是不同的,所以在这个动作完成时必须由对象的参与。
//this可以出现在“实例方法当中”,this指向当前正在执行这个动作的对象。(this代表当前对象)
public void shopping()
{
//因为name是一个实例变量,
//所以这个name访问的时候一定访问的是当前对象的name,
//this可以省略不写,也就是System.out.println(name+"在购物!");
System.out.println(this.name+"在购物!");
//这样就可以增加复用性
}
public static void doSome()
{
System.out.println(name);//报错,这个执行过程没有当前对象,因为带有static的方法是通过类名的方式访问的
//或者说这个“上下文”当中没有当前对象,自然也不存在this(this代表的是当前正在执行这个动作的对象)
//name是实例变量,要是用引用.的方式访问,因此必须要用this.name,但是没有对象,因此报错。
//重点:this不能使用带有static的方法当中
}
//修改之后可以运行的东西
public static void doOther()
{
//假设想访问name这个实例变量的话应该怎么做
//System.out.println(name);编译报错
//可以采用以下方案,但是以下方案,绝对不是访问当前对象的name
//创建对象
Customer c=new customer();
System.out.println(c.name)//这里访问的name是c引用指向对象的name。但是这个对象并不是当前对象,因此想要调用只能用类名.的方式调用,而这种方式,只能一次性对一个对象进行操作。
}
}
public class thisTest
{
public static void main(String[] args)
{
//调用dosome方法
thisTest.dosome();
dosome();
//调用doother对象
//编译错误
//thisTest.doother();实例方法必须先创建对象,通过引用.的方式访问
//doother是实例方法
//实例方法调用必须有对象的存在
//以下代码表示含义:调用当前对象的doother方法
//但是由于main方法中的this,所以以下方法不能调用
//doother();编辑错误
//this.doother()编译错误
thisTest tt=new thisTest();
tt.doother();
}
public static void dosome()
{
System.out.println("do some!")
}
public void doother()
{
System.out.println("do other!")
}
public void run()
{
System.out.println("run execute!")
doother();//完整写法是this.doother
//可以通过因为实例方法一定是存在对象才能调用实例方法,也就是说这里一定有this。
//以上方法是调用当前对象的doother()方法
}
}
最终结论:在带有static的方法中无法直接访问实例变量和实例方法,而是必须创建对象去通过引用.的方式引用。
不带static的方法中可以直接访问实例变量和实例方法,这是省略的写法,不省略的写法是this.实力变量/实例方法。
this什么时候不能省?
用来区分局部变量和实例变量的时候
publicclass User
{
private int id;//实例变量
private String name;//实例变量
//构造函数
//setter and getter
public void setid(int a)
{
id=a;
}
//以下程序的id和实例变量id无关,不能采用这样的方式
//public void setid(int id)
//{
//id=id;//报错,此时由于java采取就近原则因此,两个id都成为了setid函数的局部变量因此,必须使用this进行区分。
//}
public void setid(int id)
{
this.id=id;//正确
}
}
public class data
{
private int year;
private int month;
private int day;
//构造函数
public data(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
//需求:当程序员调用以下无参数构造方法的时候,默认创建的日期是“1970-1-1”
public data() {
this.year=1970
this.year=1;
this.day=1;
}
//setter 和 getter
public int getYear() {
return year;
}
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
//对外提供一个方法可以将日期打印输出到控制台
public void print()
{
System.out.println(this.years+"年"+this.month+"月"+this.day+"日");
}
package this_keyword;
public class data_Test {
public.static.void main(String[]args)
//创建日期对象
data time1=new data();
data time2=new data(2008,8,8);
time1.print();
time1.print();
}
//代码可运行但是代码重复了
//下面的代码利用率高
public class data
{
private int year;
private int month;
private int day;
//构造函数
public data(int year, int month, int day) {
super();
this.year = year;
this.month = month;
this.day = day;
public data() {
//需求:当程序员调用以下无参数构造方法的时候,默认创建的日期是“1970-1-1”
//以上代码可以通过调用另一个构造方法来完成
//但前提是不能创建新的对象,以下代码表示创建了一个全新的对象。
//new data(1970,1,1)
//需要采用以下的语法来完成构造方法的调用
//这种方式不会创建新的java对象,但同时又可以达到调用其他的构造方法。
this(1970,1,1);//非常的重要
//代替以下注释的部分功能
// public data() {
// this.year=1970
// this.year=1;
// this.day=1;
// } //
}
//setter 和 getter
public int getYear() {
return year;
}
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
//对外提供一个方法可以将日期打印输出到控制台
public void print()
{
System.out.println(this.years+"年"+this.month+"月"+this.day+"日");
}
this可以使用在哪里
1、可以使用在实例函数中,代表当前对象【语法格式:this.】
2、可以使用在构造方法当中,通过当前的构造方法调用其他的构造方法【语法格式:this(实参);】
重点【记忆】:this()这种语法只能出现在构造方法的第一行。
package this_keyword;
public class data_Test {
public.static.void main(String[]args)
//创建日期对象
data time1=new data();
data time2=new data(2008,8,8);
time1.print();
time1.print();
总结:
public class Test
{ int i=10;
public static void main(String[]args)
{
//要求在这里编写程序调用method1
//使用完整方式调用
Test.method1();//也可以使用引用.的方式调用 Test b=new Test();
// b.method1();
//但是这种方式并不是合法的,只不过java包容了它
//不鼓励用这种方式访问带static的方法。
//使用省略方式调用
method1();//同一类体中调用有static方法,直接用方法名。
//要求在这里编写程序调用method2
//使用完整方式调用
Test b=new Test();
b.method2();
//使用省略方式调用
//无法用省略方法
}
public static void method1()
{
//调用dosome//带static的函数调用带static的函数
//使用完整方式调用
Test.dosome();
//使用省略方式调用
dosome();
//调用doOther//带static的函数调用不带static的函数
//使用完整方式调用
Test a=new Test();
a.doOther();
//使用省略方式调用
//没有省略方式
//访问//带static的函数访问实例变量
//使用完整方式调用
System.out.println(a.i)
//使用省略方式调用
//不能直接访问i,因为是实力变量不能直接访问必须通过引用访问。
public void method2()
{
//调用dosome//不带static的函数调用带static的函数
//使用完整方式调用
Test.dosome();
//使用省略方式调用
dosome();
//调用doOther//不带static的函数调用不带static的函数
//使用完整方式调用
this.doOther();
//使用省略方式调用
doother();
//访问带static的函数访问实例变量
//使用完整方式调用
System.out.println(this.i)
//使用省略方式调用
System.out.println(i)
}
//没有statid变量
int i=10;
//带有static的变量
public static void dosome()
System.out.println("do some!");
}
//没有static的方法
public void doOther()
{
System.out.println("do other!");
}
}