中易网

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

答案:5  悬赏:80  
解决时间 2021-01-18 10:34
java 主方法怎么调用内部类的方法
最佳答案
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,然后就是楼上朋友们都说的方式,返回值。
全部回答
在Hellojava类中main方法外写
In in = new In();
因为你的内部类是私有的只针对Hellojava类私有,也就是说在Hellojava类可以实例化它。
这里弄清楚main方法虽然在Hellojava类中但是它并不属于该类。
然后在main方法中
newHellojava().in.doit(x);
就OK了
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
}
}
//这个方法并没有返回变量 。怎么输出。。
public int doit(int x){
x=6;//这个X和上一行的应该是同一个吧?怎么在主方法里输出这个量?
Hellojava.this.x++;
returnx;
}

在main 方法中。。 创建内部类对象ln n1 = new ln();
n1.doit(x);// 这个地方x 为外部类的55
返回值就是6
一般来说,外部类调用内部类的方法分为以下几种情况:
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);
}
};
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
妈妈要买一下三种水果去看望姥姥,已知桃子每
我想去做销售,30好几了,再不努力都老了
冰雪强国相比,中国冰雪运动发展落后在哪儿
ibatis如何无法使用OGNL表达式
lol哪个英雄最难玩?
米二的九九八十一为什么那么久都不更
二副证五年到期没有资历会怎样
学习java到底是巩固所学的知识重要还是拓展重
辞职去上外读英语翻译硕士,值不值得
满16岁不能办农商银行卡,银行说要18岁
夹背山地址有知道的么?有点事想过去
求GD这几张图的高清图,后面两张要原来的高清
LS-DYNA求解后,warning出现无质量节点,是什
英语中的here什么时候放在句尾什么时候在句前
大腿上出现一些小红点,不痛不痒,分不多了,
推荐资讯
吉祥如意,,打一个动物,,在线等急
你不懂我我不怪你原文
怎样制作唐装
台湾专利申请流程是怎样的?
求百练成妖TXT全集,要全啊
刘恺威为什么对娇妻沉默冷淡,视而不见还搞外
我想在黑河娶个俄罗斯女人当老婆,容易吗
地税杯书信你好新时代的作文
大成至圣是不是成语
别人用我的名字担保做贷款,她本人跑了,我怎
【高分求】和“抓住时机”有关的言语俗语成语
有哪些经典老歌适合60年代出生的爸爸听的?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?