java 主方法怎么调用内部类的方法

 我来答
闭心甫飞捷
2019-06-25 · TA获得超过3755个赞
知道大有可为答主
回答量:3082
采纳率:30%
帮助的人:411万
展开全部
System.out.println(x);//这个是55
System.out.println(In.x);//这个是9
楼主这两行是对的,楼上是不用兄弟认为人家这儿错了?

1,后面那个是无法做到的那个x是方法 的局部变量,在进入方法时被推到栈里,方法结束后就出栈了。除非有方式可以跑一个在主方法中的线程监控当前栈中变量,就像是Debug一样,我也研究好久这个,不过没发现有。

2,
也像1一样没有侵入性,你可以用字节码框架去操作类,动态地改变方法的行为,也就是说你可以在main方法中用程序语言去改变doit(x)方法里所做的事情。

3,
再侵入点儿,你可以传进那个doit(int)方法一个Callback, 你明白我意思?给你看个回调式:
public class HelloJava{
private interface Listener{
public void listenDoit(int x);
}
private static int x=55;
private class In{
private Listener listener;
private static final int x=9;
public In(Listener listener){this.listener=listener;}
public void doit(int x){
listener.listenDoit(x);
x=6;//这个X和上一行的应该是同一个吧?怎么在主方法里输出这个量?
listener.listenDoit(x);
HelloJava.this.x++;
}
}
public static void main(String[] args){
System.out.println(x);//这个是55
System.out.println(In.x);//这个是9
In in =new HelloJava().new In(new Listener(){
@Override
public void listenDoit(int x) {
System.out.println(x);
}});
in.doit(0);
System.out.println(x);//这个是55
System.out.println(In.x);//这个是10
}
}

还有许多方式可以做到,比如代理模式等等,不过都大同小异。该方法好处是不改变方法的原定义模型。如返回值从void改成int,如果doit的返回值本身就是String,要返回个其他的东西,怎么去改变返回值完成?

另外运行一下会发现最后两行输出不是55
10,
而是56,
9,你就知道HelloJava.this.x++;做的是什么了。

4,然后就是楼上朋友们都说的方式,返回值。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
紫衍母娜兰
2019-02-09 · TA获得超过3687个赞
知道大有可为答主
回答量:3179
采纳率:30%
帮助的人:158万
展开全部
内部类的成员方法不能是静态的,所以调用内部类的成员方法,先实例化一个外部类;而后在外部类实例环境下new
一个内部类实例;而后才能调用内部类的成员函数。例如:
public
class
test{
public
t1
t1_instance
=
null;
//外部类必须要有一个内部类的实力才能在外部类里调用内部类的成员,这个实例可以是外部类的成员变量,也可以是外部类的成员方法里的局部变量,作用范围不一样而已!
test(){
t1_instance
=
new
t1();
//实例化内部类对象
}
class
t1{
t1(){
}
public
void
show(){
}
}
public
static
void
main(string
args[])
{
test
t
=
new
test();
//t.
t.t1_instance.show();
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式