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