可以事例化调用! 也能直接调用!
把要调用的方法定义为static !
通过类名就可以直接调用!
如:
Class AA
{
public static void show(String s){
..
System.out.println(s);
}
public void test(){
AA.show("test");
}
}
java类有两种方法一种是类方法就是用static修饰的,一种是实例方法,就是没有static修饰的方法。类方法可以同时类名.方法名的方式调用。而实例方法必须先生存类的实例在通过实例.方法名的方式调用。例如:
public class MethodCall
{
public static void main(String[] args)
{
Test.sayStatic();
Test test = new Test();
test.sayInstance();
}
}
class Test
{
public static void sayStatic()
{
System.out.println("这是一个静态方法。");
}
public void sayInstance()
{
System.out.println("这是一个实例方法。");
}
}
public class A{
public void a(){
b();
}
public void b(){
class C{
//。。这个方法内的不能再方法外被实例化,就像一个变量一样,有作用域
}
C c = new C();
}
class D
{
//。
}
public static void main(String[] params)
{
D d = new A().new D();
}
}
这个从关键字来理解啊,
1. 如果方法定义前面加final,说明你已经知道这个方法提供的功能已经满足你要求,不需要进行扩展,并且也不允许任何从此类继承的类来覆写这个方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。
2. 如果方法定义前面加static,表示静态方法,方法和类关联,直接由类名来调用。
3. 如果方法定义前面加abstract,表示抽象方法,由继承类来实现。
4. 对于方法前面的public, private,protected等这些是控制方法可以被调用的范围。
5. 如果方法定义前面有native,Native方法是由另外一种语言(如c/c++,FORTRAN,汇编)实现的本地方法。因为在外部实现了方法,所以在java代码中,就不需要声明了,有点类似于借口方法,一般用不着。
6.如果方法定义前面加synchronized,表示当前方法体是一个临界区,通过锁机制来控制多个线程同步,在多线程应用里面经常使用。
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,然后就是楼上朋友们都说的方式,返回值。
在静态方法中可以直接调用本类的其他静态方法(就是方法有声明为static的),非静态方法则可以直接调用非静态方法或者静态方法,静态方法如果要调用非静态方法需要先创建类对象,通过对象去调用类的非静态方法,如你有一个方法为public static void xx(){},另一个为public void yy(){}, 那么你在xx方法中要调用yy方法则必须要先创建这个类的对象,用对象调用yy方法,但是如果你想在yy方法中调用xx方法,则可以直接调用xx();即可。
直接调用
比如
interface A {
void interfaceMethod();
}
class B {
public void classMethod(A a) {
a.interfaceMethod();
}
}
直接这样调用没有任何问题的 因为他A是接口不能实例化 他传给你的a对象一定是实现了A接口的 调用的也就是实现的那个方法 } }
要调用方法void showInfo()就直接在调抄用的地方直接写showInfo();
要调用方法 boolean showInfo()就在调用的地方比如写boolean ect=showInfo();
要调用方法void showInfo(String message)就在调用的地方比如写showInfo("java functions");
有参数袭的括号里面传参数,无参方法的括号不能省.
有返回值的前面要加一个变量接受返回值。
方法之间是如何调用的?2113
比如在程序a行遇到调用方法showInfo()
程序在运行的时候会找到被调用的showInfo()方法所在的区域,如果showInfo方法是有参数的,则把参数传过去(传地址或者5261传值),然后就初始化showInfo方法开始执行,4102当showInfo方法执行遇到return语句或者执行代码结束,如果有return语句则返回一个showInfo方法的声明类型的值到程序行的接受参数变量;此1653时会返回到程序的a行执行。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.650秒