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