中易网

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

答案:5  悬赏:80  
解决时间 2021-01-18 10:34
  • 提问者网友:夢醒日落
  • 2021-01-17 18:48
java 主方法怎么调用内部类的方法
最佳答案
  • 二级知识专家网友:傲气稳了全场
  • 2021-01-17 19:15
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,然后就是楼上朋友们都说的方式,返回值。
全部回答
  • 1楼网友:十年萤火照君眠
  • 2021-01-17 23:57
在Hellojava类中main方法外写
In in = new In();
因为你的内部类是私有的只针对Hellojava类私有,也就是说在Hellojava类可以实例化它。
这里弄清楚main方法虽然在Hellojava类中但是它并不属于该类。
然后在main方法中
newHellojava().in.doit(x);
就OK了
  • 2楼网友:西风乍起
  • 2021-01-17 22:23
package hellojava;
public class Hellojava{
private static int x=55;
private class In{
private static final int x=9;
public void doit(int x){
x=6;
Hellojava.this.x++;
}
}
public static void main(String[] args){
System.out.println(Hellojava.x);//类的静态属性,直接用类调
In inTest=new In();
System.out.println(inTest.doit(9999));//类的普通方法,创建对象后调用,6
}
}
  • 3楼网友:你哪知我潦倒为你
  • 2021-01-17 21:06
//这个方法并没有返回变量 。怎么输出。。
public int doit(int x){
x=6;//这个X和上一行的应该是同一个吧?怎么在主方法里输出这个量?
Hellojava.this.x++;
returnx;
}

在main 方法中。。 创建内部类对象ln n1 = new ln();
n1.doit(x);// 这个地方x 为外部类的55
返回值就是6
  • 4楼网友:我住北渡口
  • 2021-01-17 19:41
一般来说,外部类调用内部类的方法分为以下几种情况:
1.使用static可以声明一个内部类, 可以直接在外部调用

// 定义外部类
class Outer
{
// 定义外部类的私有属性
private static String info = "hello world";
// 使用static定义内部类为外部类
static class Inner
{
// 定义内部类的方法
public void print()
{
// 直接访问外部类的私有属性
System.out.println(info);
}
};
// 定义外部类的方法
public void fun()
{
// 通过内部类的实例化对象调用方法
new Inner().print();
}
};

public class InnerClassDemo03
{
public static void main(String args[])
{
// 调用外部类的fun()方法
new Outer.Inner().print() ;
}
};
2.不使用statc声明一个内部类 ,使外部调用
//定义外部类
class Outer
{
//定义外部类的私有属性
private String info = "hello world";
//定义内部类
class Inner
{
//定义内部类的方法
public void print()
{
//直接访问外部类的私有属性
System.out.println(info);
}
};
//定义外部类的方法
public void fun()
{
//通过内部类的实例化对象调用方法
new Inner().print();
}
};
public class InnerClassDemo04
{
public static void main(String args[])
{
//外部类实例化对象
Outer out = new Outer();
//实例化内部类对象
Outer.Inner in = out.new Inner();
//调用内部类的方法
in.print();
}
};
3.在方法中定义内部类 ,使外部调用

//定义外部类
class Outer
{
//定义外部类的私有属性
private String info = "hello world";
//定义外部类的方法
public void fun(final int temp)
{
//在方法中定义的内部类
class Inner
{
//定义内部类的方法
public void print()
{
//直接访问外部类的私有属性
System.out.println("类中的属性:" + info);
System.out.println("方法中的参数:" + temp);
}
};
//通过内部类的实例化对象调用方法
new Inner().print();
}
};

public class InnerClassDemo05
{
public static void main(String args[]){
//调用外部类的方法
new Outer().fun(30);
}
};
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息