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,然后就是楼上朋友们都说的方式,返回值。
Java内部调用内部方法主要是通过内部类实现。Java内部类分两种,成员内部类和方法内部类。
代码如下:
1.成员内部类/**
* 成员内部类
*/
public class Outer {
private int outer = 1
class Inner {
public void show() {
System.out.println("outer =" + outer)
}
}
public static void main(String[] args) {
Outer.Inner in = new Outer().new Inner()
in.show()
}
}
2.方法内部类
/**
* 方法内部类
*
*/
public class Outer2 {
private int outer = 1
public void showOut() {
class Inner {
public void show() {
System.out.println("outer =" + outer)
}
}
new Inner().show()
}
public static void main(String[] args) {
Outer2 in = new Outer2()
in.showOut()
}