⑴ java外部类怎样调用内部类方法
你这里面有两个错:
1、Leis内部类是非静态类,不能在静态方法里初始化,即第三行Leis x=new Leis();报错,可以把Leis类改成静态类,即
public static class Leis{
......
}
2、Leis()是Leis类的构造函数,不能在第4行x.Leis()显示调用
一句话:静态方法里不能访问非静态内部类。但你可以在外部类的一个成员方法里访问非静态内部类,然后你再在静态方法里初始化外部类,通过外部类来访问非静态内部类。
⑵ java内部调用内部方法的问题
Java内部调用内部方法主要是通过内部类实现。Java内部类分两种,成员内部类和方法内部类。
代码如下:
1.成员内部类
/**
*成员内部类
*/
publicclassOuter{
privateintouter=1;
classInner{
publicvoidshow(){
System.out.println("outer="+outer);
}
}
publicstaticvoidmain(String[]args){
Outer.Innerin=newOuter().newInner();
in.show();
}
}
2.方法内部类
/**
*方法内部类
*
*/
publicclassOuter2{
privateintouter=1;
publicvoidshowOut(){
classInner{
publicvoidshow(){
System.out.println("outer="+outer);
}
}
newInner().show();
}
publicstaticvoidmain(String[]args){
Outer2in=newOuter2();
in.showOut();
}
⑶ java外部类怎么调用内部类的方法
首先,你要搞清楚静态方法跟非静态方法的区别:
非静态方法是跟随着类的生命周期的,当类实例化时,非静态方法跟随着实例化对象产生,实例化对象可以调用类中的非静态方法,当实例化对象结束时,非静态方法也跟着结束。就是说,非静态方法是依附于实例化对象的,它的生命周期就是实例化对象的生命周期。
静态方法是不受制于类的实例化对象的,即静态方法从程序开始运行到最后释放内存结束是一直存在的,它的生命周期就是程序的生命周期。
从以上可知,静态方法调用非静态方法会造成一个问题,就是生命周期的不一致,比如说:程序刚刚开始运行时,类的实例化构造函数还没有执行,这时静态方法是调用不了非静态方法的;或者当实例化对象消亡之后,静态方法也是不能够去调用非静态方法的。
静态方法要想调用非静态方法,必须要通过实例化对象去调用;当然也可以把非静态方法变成静态方法,这样就不存在任何障碍了。
希望我的回答对你能够有所帮助。
⑷ java怎么调用另一个类中的方法中的内部类中的方法
class Hello {
public static void pt(){
new A().ppt();
class A {
void ppt(){//ppt()方法不能在其他类中调用,只能在pt()方法中被调用
System.out.println("hello word");
}
}
}
}
public class Test {
public static void main(String[] args){
Hello.pt();
}
}
⑸ 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,然后就是楼上朋友们都说的方式,返回值。
⑹ java外部类main方法调用内部类
main方法是主函数,是程序的入口,调用内部类,首先需要它的外部类,然后才可以获得。
⑺ java 主方法怎么调用内部类的方法
一般来说,外部类调用内部类的方法分为以下几种情况:
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);
}
};