面向对象(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.name=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.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();
}
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.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();
}
public void show() {
System.out.println(this.name);
}
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只能用在构造函数间。