面向对象(this关键字)-第11天

来源:互联网 发布:mac 从远程拷贝文件夹 编辑:程序博客网 时间:2024/06/08 13:42

面向对象(this关键字)

1、面向对象(this关键字)

class Person

{

private String name;

private int age;

private Person(Stringn)//构造函数私有化

{

name=n;

}

Person(String n,int a)

{

name=n;

age=a;

}

public void speak();

{

system.out.println("name="+name+"...age"+age);

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi"); //打印错误。Person函数被本地私有化了。对象找不到值。

}

 

class Person

{

private String name;//这个name是成员变量

private int age;

Person(String name)//当局部也定义了name

{

name=name;//那么这两个name都是局部的name。即局部name=局部name

}

Person(String n,int a)

{

name=n;

age=a;

}

public void speak();

{

system.out.println("name="+name+"...age="+age);

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi");//此时name=lisi是局部变量。

p.speak();//打印name=null...age=0。为什么不是name=lisi???打印的时候是打印的成员变量name,没有赋初值,默认初始化值为null。

}

}

 

把name改成n

class Person

{

private String name;

private int age;

Person(String n)

{

name=n;//这时局部没有定义name,那么返回到成员变量中找name

}

Person(String n,int a)

{

name=n;

age=a;

}

public void speak();

{

system.out.println("name="+name+"...age="+age);

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi");

p.speak();//打印name=lisi...age=0

}

}

 

用this:看上去,是用于区分局部变量和成员变量同名的情况。

this为什么可以解决这个问题?

this到底代表的是什么呢?

 

this:就代表本类的对象。(成员变量)

 

class Person

{

private String name;

private int age;

Person(String name)//当局部定义了name

{

this.ame=name;//那么这时,类变量(成员变量)this.name=局部name

}

Person(String n,int a)

{

name=n;

age=a;

}

public void speak();

{

system.out.println("name="+name+"...age="+age);

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi");

p.speak();//打印name=lisi...age=0

}

}

 

this代表它所在函数所属对象的引用

简单说,那个对象在调用this所在的函数,this就代表哪个对象。

class Person

{

private String name;

private int age;

Person(String name)

{

this.name=name;//局部name,赋给成员name

}

Person(String name,int age)

{

this.name=name;

this.age=age;

}

public void speak();

{

system.out.println("name="+this.name+"...age="+this.age);

this.show();//可以省略成show();

}

public void show()

{

system.out.println(this.name);

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi"); //第一次用时,this.name代表p.name

Person p1=new Person("zhangsan");//第二次用时,this.name代表p1.name

p.speak();//打印name=lisi...age=0         lisi

p1.speak();//打印name=zhangsan...age=0            zhangsan

}

}

 

 

2、面向对象(this关键字的应用)

this的应用:当定义类中功能时,该函数内部要用到调用函数的对象时,这时用this来表示这个对象

但凡本类功能内部使用到了本类对象,都用this表示。

 

//需求:给人定义一个用于比较年龄是否相同的功能。也就是是否是同龄人。

 

class Person

{

private String name;

private int age;

Person(int age)//多建立一个age年龄函数。 

{

this.age=age;

}

Person(String name)

{

this.ame=name;

}

Person(String name,int age)

{

this.name=name;

this.age=age;

}

public void speak();

{

system.out.println("name="+this.name+"...age="+this.age);

this.show();

}

public void show()

{

system.out.println(this.name);

}

//public boolean compare(int age)传一个人。这样传是错的。

public boolean compare(Person p)//这样才是传人。!!!

{

if(this.age==age)// 对p1.compare(p2);所以这时p1引用的this.age代表的是p1.age。后面的age代表的是p2.age

return true;

else

return false;//这里可以简化。

}

class PersonDemo

{

public static void main(string[] args)

{

Person p1=new Person(20);//此时p1.age=20;

Person p2=new Person(25);//然后p2.age=25

boolean b=p1.compare(p2);//p1.compare(p2)对应p1和p2做比较对应p1.age==p2.age;。compare(p2)说明是接受p2。p1.compare(p2)说明调用的是p1,故this代表的是p1的值。返回的是布尔值。

system.out.println(b);

}

 

简化版-程序员版的。!!!

class Person

{

private String name;

private int age;

Person(int age)//多建立一个age函数。 

{

this.age=age;

}

Person(String name)

{

this.ame=name;

}

Person(String name,int age)

{

this.name=name;

this.age=age;

}

public void speak();

{

system.out.println("name="+this.name+"...age="+this.age);

this.show();

}

public void show()

{

system.out.println(this.name);

}

//public boolean compare(int age)传一个人。这样传是错的。

public boolean compare(Person p)//这样才是传人。

{

return this.age==p.age;//简化的版本。!!!对应p1.age==p2.age;

}

class PersonDemo

{

public static void main(string[] args)

{

Person p1=new Person(20);

Person p2=new Person(25);

boolean b=p1.compare(p2);//p1.compare(p2)对应p1和p2做比较对应p1.age==p2.age;。compare(p2)说明是接受p2。p1.compare(p2)说明调用的是p1。。返回的是布尔值。

system.out.println(b);

}

 

 

3、面向对象(this关键字在构造函数间调用)

this语句:用于构造函数之间进行互相调用。(只能用this语句)

 

class Person

{

private String name;

private int age;

Person(String name)//this(name)=p.name调用到了这个函数

{

this.ame=name;

}

Person(String name,int age)

{

//this.name=name;用下面这个代替。

//Person(name);错误,构造函数中不可以这样写的。

this(name);//this()带括号的是语句。this(name)代表的是p.name,这样就调用到了Person(String name)

this.age=age;

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi",30);

Person p1=new Person("lisi1",36);

}

 

this()语句只能放在构造函数的第一行

class Person

{

private String name;

private int age;

Person()

{

 

}

Person(String name)

{

this.name=name;

}

Person(String name,int age)

{

this.age=age;

this(name);//语句执行报错。 必需要第一句使用。

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi",30);

}

 

class Person

{

private String name;

private int age;

Person()

{

}

Person(String name)

{

this.name="haha";

}

Person(String name,int age)

{

this.name=name;//执行lisi。

this(name);//执行haha。调用上面的Person(String name)语句。lisi变成了haha

this.age=age;

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi",30);

}

 

this()语句只能定义在构造函数的第一行,因为初始化要先执行

class Person

{

private String name;

private int age;

Person()

{

}

Person(String name)

{

this.name="haha";

}

Person(String name,int age)

{

//这就是为什么this在构造函数间要放在首行的位置。

this(name);//执行lisi。同时传给Person(String name)。this.name由haha变成lisi。

this.name=name;//重新在赋值一次lisi。

this.age=age;

}

}

class PersonDemo

{

public static void main(string[] args)

{

Person p=new Person("lisi",30);

}

 

class Person

{

private String name;

private int age;

Person()//第步:初始化时调用Person()

{

this("hah");//this调用到Person(String name)

}

Person(String name)//第二步:初始化时调用Person(String name)

{

this();//this调用到Person()。又回到了第一步。变成了一个死循环

this.name=name;

}

Person(String name,int age)

{

this.age=age;

}

}

class PersonDemo

{

public static void main(string[] args)

{

new Person();

}

 

总结:this的

第1个用法:用于区分同名变量的情况。成员变量和局部变量的区别。

第2个用法:用于构造函数间调用。一般函数不能直接调用构造函数的。this不能用在一般语句中。 this能用在构造函数间。

 

0 0
原创粉丝点击