java中的this作用域
1. java问题:为什么方法中不能用this调用构造方法
首先你要明白this的作用域,只能在里面用不能再外面用,构造方法你可以这么写this.age=age;其他不可以的,你想用this调构造方法。。。。。。构造方法是在new对象的时候自动运行的,你可以把代码发一下我告诉你哪里有问题
2. java中的this关键字到底指什么
如果有两个同类型的对象,分别叫作a和b,那么您也许不知道如何为这两个对象同时调用一个f()方法:
class Banana { void f(int i) { /* ... */ } }
Banana a = new Banana(), b = new Banana();
a.f(1);
b.f(2);
若只有一个名叫f()的方法,它怎样才能知道自己是为a还是为b调用的呢?
为了能用简便的、面向对象的语法来书写代码——亦即“将消息发给对象”,编译器为我们完成了一些幕后工作。其中的秘密就是第一个自变量传递给方法f(),而且那个自变量是准备操作的那个对象的句柄。所以前述的两个方法调用就变成了下面这样的形式:
Banana.f(a,1);
Banana.f(b,2);
这是内部的表达形式,我们并不能这样书写表达式,并试图让编译器接受它。但是,通过它可理解幕后到底发生了什么事情。
假定我们在一个方法的内部,并希望获得当前对象的句柄。由于那个句柄是由编译器“秘密”传递的,所以没有标识符可用。然而,针对这一目的有个专用的关键字:this。this关键字(注意只能在方法内部使用)可为已调用了其方法的那个对象生成相应的句柄。可象对待其他任何对象句柄一样对待这个句柄。但要注意,假若准备从自己某个类的另一个方法内部调用一个类方法,就不必使用this。只需简单地调用那个方法即可。当前的this句柄会自动应用于其他方法。所以我们能使用下面这样的代码:
class Apricot {
void pick() { /* ... */ }
void pit() { pick(); /* ... */ }
}
在pit()内部,我们可以说this.pick(),但事实上无此必要。编译器能帮我们自动完成。this关键字只能用于那些特殊的类——需明确使用当前对象的句柄。例如,假若您希望将句柄返回给当前对象,那么它经常在return语句中使用。
由于increment()通过this关键字返回当前对象的句柄,所以可以方便地对同一个对象执行多项操作。
1. 在构建器里调用构建器
若为一个类写了多个构建器,那么经常都需要在一个构建器里调用另一个构建器,以避免写重复的代码。可用this关键字做到这一点。
通常,当我们说this的时候,都是指“这个对象”或者“当前对象”。而且它本身会产生当前对象的一个句柄。在一个构建器中,若为其赋予一个自变量列表,那么this关键字会具有不同的含义:它会对与那个自变量列表相符的构建器进行明确的调用。这样一来,我们就可通过一条直接的途径来调用其他构建器。如下所示:
其中,构建器Flower(String s,int petals)向我们揭示出这样一个问题:尽管可用this调用一个构建器,但不可调用两个。除此以外,构建器调用必须是我们做的第一件事情,否则会收到编译程序的报错信息。
这个例子也向大家展示了this的另一项用途。由于自变量s的名字以及成员数据s的名字是相同的,所以会出现混淆。为解决这个问题,可用this.s来引用成员数据。经常都会在Java代码里看到这种形式的应用,本书的大量地方也采用了这种做法。
在print()中,我们发现编译器不让我们从除了一个构建器之外的其他任何方法内部调用一个构建器。
3. JAVA中的This.kind = kind;解释
首先你得明白类是不能直接工作的,在Java中一切都是面向对象的,所以你要使用类就必须得先生成该类的对象。
举个例子,你写的Cube就是个类,而类本身只是个静态的东西,必须用它生成一个对象后才能实实在在的存在于Java虚拟机中,这样对象中的每个成员变量也才是实实在在 存在的。
而this就是指当前你所访问的这个对象,那么this.height就是指当前这个对象的成员变量height,加this是用以区别于同名参数变量height,其实就是通过变量作用域来区别相同名字的变量。
在这里,如果参数变量名不叫height,而叫height0,则可以直接写成
height=height0;就可以了,不会出错。但是当编译该类时,编译器还是会自动在height前加this.的,因为height的作用域就是在Cube的一个对象中。
4. java中this的作用有哪些
首先,this指向方法的隐式参数,即调用此变量或方法的对象(就是你说的当前对象)。
看下面这个例子:
class test{
private String a;
void a(String a){
this.a =a;
}
public static void main(String[] args){
test t1 = new test();
test t2 = new test();
t1.a("a");//调用a这个方法的时候,this指向t1这个对象
t2.a("a");//调用a这个方法的时候,this指向t2这个对象
}
}
第二,如果this(...)出现在构造器或其它方法的第一句,那么说明这个构造器将调用同一类中的其他构造器或方法。
比如:
public a(int x,int y)
{
...
}
public a(int x,int y,String z)
{
this(x,y);//调用a(int x,int y)
z=...
}
5. java中this的作用及用法是什么
使用this调用本类中的属性
现在观察以下代码,看会有那些问题:
public void setName(String name){
name = name ;
}
这里面的两个name都是setName方法中的name参数。
此时,特别希望可以通过一个指定的标识明确的表示要把传入的name参数的值给类中的属性,所以此时就需要使用this关键字,使用this.name就表示类中的属性。
class Person{
private String name ;
private int age ;
public Person(String name,int age){
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
public class Demo35{
public static void main(String args[]){
Person p1 = new Person("张三",30) ;
p1.print() ;
}
};
使用this还可以从一个构造方法中调用其他构造方法。
例如:有以下一个要求,一个类中存在了三个构造方法,但是要求,不管怎么调用,最终都要求可以在对象实例化的时候打印一个“新的对象产生了”的提示。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
System.out.println("新的对象产生了。。。") ;
this.setName(name) ;
}
public Person(String name,int age){
System.out.println("新的对象产生了。。。") ;
this.setName(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
以上代码虽然可以实现功能,但是同样的代码出现了三次,而且后面的两次出现纯属多余吧。用this()的形式可以调用类中的无参构造方法。
class Person{
private String name ;
private int age ;
public Person(){
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
// 最终都是调用无参构造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ;
this.setAge(age) ;
}
public void setName(String name){
this.name = name ;
}
public void setAge(int age){
this.age = age ;
}
public String getName(){
return this.name ;
}
public int getAge(){
return this.age ;
}
public void print(){
System.out.println("姓名:"+this.name+",年龄:"+this.age) ;
}
};
public class Demo36{
public static void main(String args[]){
Person p1 = new Person("张三",30) ;
p1.print() ;
}
};
注意点1:
如果使用了this调用其他构造方法,则此语句,必须写在构造方法的首行。
public void fun(){
// 发现在调用fun方法的时候,必须先设置name的值
this("zhangsan") ;
}
public Person(String name,int age){
this.setAge(age) ;
this(name) ; //--> 必须放在首行
}
注意点2:
使用this可以调用本类中的其他构造方法,但是至少留一个构造方法,作为程序的出口。
public Person(){
this("a",10) ;
System.out.println("新的对象产生了。。。") ;
}
public Person(String name){
// 最终都是调用无参构造方法
this() ;
this.setName(name) ;
}
public Person(String name,int age){
this(name) ; //--> 必须放在首行
this.setAge(age) ;
}
this最重要的特性 —— 表示当前对象
当前对象在程序中用以下形式体现:
· 当前操作此方法的对象,就称为当前对象。
class Demo{
public void print(){
System.out.println(this) ;
}
};
public class Demo38{
public static void main(String args[]){
Demo d1 = new Demo() ;
System.out.println(d1) ;
d1.print() ;
System.out.println("---------------------") ;
Demo d2 = new Demo() ;
System.out.println(d2) ;
d2.print() ;
}
};
回顾:
之前讲解的两个对象比较的程序。
// 在类的内部增加一个比较的方法
public boolean compare(Person p){
Person p1 = this ;
Person p2 = p ;
if(p1.name.equals(p2.name)&&p1.age==p2.age){
return true ;
}else{
return false ;
}
}
分析程序的运行过程:
class A{
private B b = null ;
public A(){
this.b = new B(this) ;
this.b.fun() ;
}
public void hello(){
System.out.println("Hello World!!!") ;
}
};
class B{
private A a = null ;
public B(A a){
this.a = a ;
}
public void fun(){
this.a.hello() ;
}
};
public class OODemo40{
public static void main(String args[]){
A aa = new A() ;
}
};
6. JAVA关键字this是干什么的
我想这个 this 在考试中不会很重要吧
仅用于 C/C++、C# 和 Visual Basic。
“This”和“Me”窗口相同;只是名称不同,这对程序员有帮助作用。这两个窗口都显示三个信息列:
名称
在 C/C++ 或 C# 中显示 this 指针指向的对象,在 Visual Basic 中显示 me 对象。树控件 (Tree Control) 允许展开对象以查看元素。展开对象后,每个元素的名称显示在该列中。
值
显示每个变量包含的值。默认情况下,整数变量以十进制格式表示。可以在“选项”对话框 ->“调试”->“常规”中将表示形式更改为十六进制,也可以通过右击“自动窗口”并从快捷菜单中选择“十六进制显示”选项来进行此操作。
类型
标识“名称”列中列出的每一变量的数据类型。
7. java中this问题
this指前象
this.a=a;
this.b=b;
其实this.a指class C类私变量a(private A a;)
display(A a,B b)a形式参数保存传入参数引用
两者其实掉this.a=athis.b=b
使用象C程与外部象 ab没联系
class C加入测试
public class C {
private A a;
privata B b;
public void display(A a,B b)
{
this.a=a;
this.b=b;
}
public void show()
{
System.out.println(a);
System.out.println(b);
}
}
其实想真弄明白需要弄明白几:
1、this作用
2、参数何传递
3、变量作用域
几容我偷懒解释自找相关资料看看