java中,匿名内部类可以使用外部类的成员变量吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中,匿名内部类可以使用外部类的成员变量吗相关的知识,希望对你有一定的参考价值。

java中,匿名内部类可以使用外部类的成员变量的,即使是private的也可以,举例如下:

public class Outer
 private int size;
 public class Inner
   public void dostuff()
       size++;
   
 
 public void testTheInner()
   Inner in = new Inner();
   in.dostuff();
 

运行结果:

注意:static变量也是可以访问的,也就是说非静态内部类都会隐式持有外部类的引用。

参考技术A 可以的,我举个例子,如果你的外部类名是Parent,有个成员变量a,你在匿名内部类中可以
通过Parent.this.a来访问Parent中的成员变最a
参考技术B 你只创建了对象却没有调用方法啊,修改如下

public void test()
new Hello()
public void helloFun()
var = 2;

.helloFun();


其实这段代码体现不出来内部类对外部类field的调用。所以简单说下:

匿名类和内部类中的中的this :
有时候,我们会用到一些内部类和匿名类。当在匿名类中用this时,这个this则指的是匿名类或内部类本身。这时如果我们要使用外部类的方法和变量的话,则应该加上外部类的类名本回答被提问者采纳

java基础04 匿名内部类

内部类
(1)把类定义在另一个类的内部,该类就被称为内部类。
举例:把类B定义在类A中,类B就被称为内部类。
(2)内部类的访问规则
A:可以直接访问外部类的成员,包括私有
B:外部类要想访问内部类成员,必须创建对象
(3)内部类的分类
A:成员内部类
B:局部内部类
(4)成员内部类
A:private 为了数据的安全性
B:static 为了访问的方便性

成员内部类不是静态的:
外部类名.内部类名 对象名 = new 外部类名.new 内部类名();
成员内部类是静态的:
外部类名.内部类名 对象名 = new 外部类名.内部类名();
(5)成员内部类的面试题(填空)

class Outer {
public int num = 10;

class Inner {
public int num = 20;

public viod show() {
int num = 30;

System.out.println(num);
System.out.println(this.num);
System.out.println(Outer.this.num);
}
}
}

输出:30,20,10


(6)局部内部类
A:局部内部类访问局部变量必须加final修饰。
B:为什么呢?
因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。
所以,堆内存还是用该变量,而改变量已经没有了。
为了让该值还存在,就加final修饰。
通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。
(7)匿名内部类(掌握)
A:是局部内部类的简化形式
B:前提
   存在一个类或者接口
C:格式:
new 类名或者接口名() {
    重写方法;
}
D:本质:
其实是继承该类或者实现接口的子类匿名对象
(8)匿名内部类在开发中的使用
我们在开发的时候,会看到抽象类,或者接口作为参数。
而这个时候,我们知道实际需要的是一个子类对象。
如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

如在多线程中:

Thread类的匿名内部类实现

public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}

运行结果:1 2 3 4 5

Runnable接口的匿名内部类实现

public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
}

运行结果:1 2 3 4 5








































以上是关于java中,匿名内部类可以使用外部类的成员变量吗的主要内容,如果未能解决你的问题,请参考以下文章

为啥内部类的private变量可被外部类直接访问

java内部类与匿名内部类作用分别是啥?

这个匿名内部类为何不使用final也可以访问外部成员?

关于Java问题:“内部类可作为其他类的成员,而且可访问它所在类的成员”?

内部类

一个java内部类有几个分类?