java内部类 引用外部类对象this问题

问题描述

java内部类 引用外部类对象this问题

在内部类里,想引用外部类的对象,为什么是外部类.this而不是外部类加引用变量,还有.操作应该是成员操作符吧,这样this不就成了外部类成员了

解决方案

你好,实际上我们代指当前类对象的this是个简写形式,完整的形式就是 类名字.this,举个例子来说吧

  class OuterClass
{
    private String outAttribute = "我是外部类属性";

    public void printOutAttribute(){
        //return outAttribute;
        //return this.outAttribute;
        //上面写法都可以
        System.out.println(OuterClass.this.outAttribute);
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        new OuterClass().printOutAttribute();
    }
}

像上面这种情况,在类的非静态方面中,对当前类对象的引用,可以用OuterClass.this,也可以直接用this。
但是下面代码里,InnerClass对当前OuterClass的类对象引用就只能用OuterClass.this,不能用this。

 class OuterClass
{
    private String outAttribute = "我是外部类属性";

    public void printOutAttribute(){
        new Thread(new Runnable(){
            public void run(){
                //这里引用外部类对象只能用OuterClass.this
                System.out.println(OuterClass.this.outAttribute);
            }
        }).start();
    }

    public static void main (String[] args){

        new OuterClass().printOutAttribute();
    }
}

原因很简单,在内部类非静态方法中使用this会被编译器认定为InnerClass.this,只有使用完成写法OuterClass.this才能找到正确的对象引用。

解决方案二:

因为类.变量表示静态变量,this.变量才是当前实例的变量

解决方案三:

Java内部类的this问题
Thinking in Java 内部类访问外部类
Java.内部类方法对外部类对象的引用x-this.x-Test.this.x

解决方案四:

当成员变量和局部变量重名时,在方法中使用this时,表示的是该方法所在类中的成员变量。(this是当前对象自己)
把自己当作参数传递时,也可以用this.(this作当前参数进行传递)

解决方案五:

this有作用域的,默认是内部类实例。使用内部类的一个好处就是用外部类.this可以拿到外部类的当前实例。

时间: 2024-10-29 10:13:52

java内部类 引用外部类对象this问题的相关文章

引用外部类对象

若想生成外部类对象的句柄,就要用一个点号以及一个this来命名外部类.举个例子来说,在Sequence.SSelector类中,它的所有方法都能产生外部类Sequence的存储句柄,方法是采用Sequence.this的形式.结果获得的句柄会自动具备正确的类型(这会在编译期间检查并核实,所以不会出现运行期的开销). 有些时候,我们想告诉其他某些对象创建它某个内部类的一个对象.为达到这个目的,必须在new表达式中提供指向其他外部类对象的一个句柄,就象下面这样:   //: Parcel11.jav

java 内部类-在外部类中为什么可以直接访问内部类的私有成员?

问题描述 在外部类中为什么可以直接访问内部类的私有成员? 在外部类中为什么可以直接访问内部类的私有成员?比如,root=root.next,这条语句出现在外部类的方法中,这里,root是定义在外部类中的一个内部类对象,而next是root对象的一个私有属性,为什么可以这样写? 解决方案 内部类是一个特例,相当于友元类(java本身没有友元这个概念) 从语法的角度来说,这样做是方便的.封装性主要是避免调用者随意操作对象的私有成员,调用他们不知道的代码引起问题.但是你定义了外部类,显然内部类也是你定

java 内部类-为什么外部类能访问内部类的私有成员?

问题描述 为什么外部类能访问内部类的私有成员? 在学习单例时发现,外部类可以访问内部类的私有成员 如下面代码所示: //Initialization on Demand Holder class Singleton { private Singleton() { } private static class HolderClass { private final static Singleton instance = new Singleton(); } public static Single

内部类和外部类的一个问题

问题描述 class Car{class Wheel{}}class PlaneWheel extends Car.Wheel{PlaneWheel(Car car){car.super();//这里怎么理解??}public static void main(String[] args){Car car=new Car();PlaneWheel pw=new PlaneWheel(car);}} 解决方案 也许下面代码更有说服力:引用class Car {public Car() {super

python中的嵌套类(内部类调用外部类中的方法函数)

在为书中版本是3.X的,但2.X不太支持直接调用. 所以,在PYTHON2.X中,要在内部类中调用外部类的方法,就必须得实例化外部类,然后,传入实例进行调用. 花了我两个小时啊,资料没找到,自己一个一个想法调试,真的失败了三四十次,PRINT了N多~~~:) ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 4

Java内部类this$0字段产生的一个小bug

首先查看下面一段代码,我指出了问题代码的所在,读者先自己思考一下这段代码会有什么问题. 这是用clone方法完整拷贝一个二项堆(BinomialHeap)结构的代码.二项堆中包含一个内部类BinomialHeapEntry,这个内部类的对象即二项堆中的每一个结点,除了包含结点对应的关键字外,还记录父节点parent,下一个兄弟结点sibling和第一个孩子结点child三个指针.二项堆的根表通过每棵二项树根节点的sibling指针链接. cloneBinomialTree(BinomialHea

Java内部类的使用小结

内部类是指在一个外部类的内部再定义一个类.类名不需要和文件夹相同. *内部类可以是静态static的,也可用public,default,protected和private修饰.(而外部顶级类即类名和文件名相同的只能使用public和default).   注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为outer的外部类和其内部定义的名为inner的内部类.编译完成后出现outer.class和outer$inner.class两类.所以内部类的成员变量/方法

java-Java静态内部类怎么调用外部类的泛型

问题描述 Java静态内部类怎么调用外部类的泛型 Java静态内部类怎么调用外部类的泛型,2个泛型可以名字一样,但是没有任何关系啊....... 解决方案 http://zhidao.baidu.com/link?url=GkDla2jig8PJLNVmNocRJCFgYmDCJx-xmnCdIpjk16jhFGwsWusJIkevnmN-UpOxyJopRo0kj3o-lWrsBKQVbCrdUPnqfUNyqep_Az8pARm 解决方案二: Java 内部类与静态类外部类 调用内部类Jav

内部类引用局部变量与外部类成员变量的问题思考

昨天有一个比较爱思考的同事和我提起一个问题:为什么匿名内部类使用的局部变量和参数需要final修饰,而外部类的成员变量则不用?对这个问题我一直作为默认的语法了,木有仔细想过为什么(在分析完后有点印象在哪本书上看到过,但是就是没有找到,难道是我的幻觉?呵呵).虽然没有想过,但是还是借着之前研究过字节码的基础上,分析了一些,感觉上是找到了一些答案,分享一下:也希望有大牛给指出一些不足的地方. 假如我们有以下的代码: interface Printer {      public void print