第三章、面向对象-this关键字

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!");

}

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容