可以事例化調(diào)用! 也能直接調(diào)用!
把要調(diào)用的方法定義為static !
通過類名就可以直接調(diào)用!
如:
Class AA
{
public static void show(String s){
..
System.out.println(s);
}
public void test(){
AA.show("test");
}
}
java類有兩種方法一種是類方法就是用static修飾的,一種是實例方法,就是沒有static修飾的方法。類方法可以同時類名.方法名的方式調(diào)用。而實例方法必須先生存類的實例在通過實例.方法名的方式調(diào)用。例如:
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("這是一個靜態(tài)方法。");
}
public void sayInstance()
{
System.out.println("這是一個實例方法。");
}
}
public class A{
public void a(){
b();
}
public void b(){
class C{
//。。這個方法內(nèi)的不能再方法外被實例化,就像一個變量一樣,有作用域
}
C c = new C();
}
class D
{
//。
}
public static void main(String[] params)
{
D d = new A().new D();
}
}
這個從關(guān)鍵字來理解啊,
1. 如果方法定義前面加final,說明你已經(jīng)知道這個方法提供的功能已經(jīng)滿足你要求,不需要進(jìn)行擴(kuò)展,并且也不允許任何從此類繼承的類來覆寫這個方法,但是繼承仍然可以繼承這個方法,也就是說可以直接使用。
2. 如果方法定義前面加static,表示靜態(tài)方法,方法和類關(guān)聯(lián),直接由類名來調(diào)用。
3. 如果方法定義前面加abstract,表示抽象方法,由繼承類來實現(xiàn)。
4. 對于方法前面的public, private,protected等這些是控制方法可以被調(diào)用的范圍。
5. 如果方法定義前面有native,Native方法是由另外一種語言(如c/c++,FORTRAN,匯編)實現(xiàn)的本地方法。因為在外部實現(xiàn)了方法,所以在java代碼中,就不需要聲明了,有點類似于借口方法,一般用不著。
6.如果方法定義前面加synchronized,表示當(dāng)前方法體是一個臨界區(qū),通過鎖機制來控制多個線程同步,在多線程應(yīng)用里面經(jīng)常使用。
System.out.println(x);//這個是55
System.out.println(In.x);//這個是9
樓主這兩行是對的,樓上是不用兄弟認(rèn)為人家這兒錯了?
1,后面那個是無法做到的那個x是方法 的局部變量,在進(jìn)入方法時被推到棧里,方法結(jié)束后就出棧了。除非有方式可以跑一個在主方法中的線程監(jiān)控當(dāng)前棧中變量,就像是Debug一樣,我也研究好久這個,不過沒發(fā)現(xiàn)有。
2, 也像1一樣沒有侵入性,你可以用字節(jié)碼框架去操作類,動態(tài)地改變方法的行為,也就是說你可以在main方法中用程序語言去改變doit(x)方法里所做的事情。
3, 再侵入點兒,你可以傳進(jìn)那個doit(int)方法一個Callback, 你明白我意思?給你看個回調(diào)式:
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和上一行的應(yīng)該是同一個吧?怎么在主方法里輸出這個量?
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,要返回個其他的東西,怎么去改變返回值完成?
另外運行一下會發(fā)現(xiàn)最后兩行輸出不是55 10, 而是56, 9,你就知道HelloJava.this.x++;做的是什么了。
4,然后就是樓上朋友們都說的方式,返回值。
在靜態(tài)方法中可以直接調(diào)用本類的其他靜態(tài)方法(就是方法有聲明為static的),非靜態(tài)方法則可以直接調(diào)用非靜態(tài)方法或者靜態(tài)方法,靜態(tài)方法如果要調(diào)用非靜態(tài)方法需要先創(chuàng)建類對象,通過對象去調(diào)用類的非靜態(tài)方法,如你有一個方法為public static void xx(){},另一個為public void yy(){}, 那么你在xx方法中要調(diào)用yy方法則必須要先創(chuàng)建這個類的對象,用對象調(diào)用yy方法,但是如果你想在yy方法中調(diào)用xx方法,則可以直接調(diào)用xx();即可。
直接調(diào)用
比如
interface A {
void interfaceMethod();
}
class B {
public void classMethod(A a) {
a.interfaceMethod();
}
}
直接這樣調(diào)用沒有任何問題的 因為他A是接口不能實例化 他傳給你的a對象一定是實現(xiàn)了A接口的 調(diào)用的也就是實現(xiàn)的那個方法 } }
要調(diào)用方法void showInfo()就直接在調(diào)抄用的地方直接寫showInfo();
要調(diào)用方法 boolean showInfo()就在調(diào)用的地方比如寫boolean ect=showInfo();
要調(diào)用方法void showInfo(String message)就在調(diào)用的地方比如寫showInfo("java functions");
有參數(shù)襲的括號里面?zhèn)鲄?shù),無參方法的括號不能省.
有返回值的前面要加一個變量接受返回值。
方法之間是如何調(diào)用的?2113
比如在程序a行遇到調(diào)用方法showInfo()
程序在運行的時候會找到被調(diào)用的showInfo()方法所在的區(qū)域,如果showInfo方法是有參數(shù)的,則把參數(shù)傳過去(傳地址或者5261傳值),然后就初始化showInfo方法開始執(zhí)行,4102當(dāng)showInfo方法執(zhí)行遇到return語句或者執(zhí)行代碼結(jié)束,如果有return語句則返回一個showInfo方法的聲明類型的值到程序行的接受參數(shù)變量;此1653時會返回到程序的a行執(zhí)行。
聲明:本網(wǎng)站尊重并保護(hù)知識產(chǎn)權(quán),根據(jù)《信息網(wǎng)絡(luò)傳播權(quán)保護(hù)條例》,如果我們轉(zhuǎn)載的作品侵犯了您的權(quán)利,請在一個月內(nèi)通知我們,我們會及時刪除。
蜀ICP備2020033479號-4 Copyright ? 2016 學(xué)習(xí)鳥. 頁面生成時間:2.650秒