第三章、面向对象-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!");

}

}

你可能感兴趣的:(第三章、面向对象-this关键字)