A. java 靜態內部類的使用
Java語言允許在類中再定義類,這種在其它類內部定義的類就叫內部類。內部類又分為:常規內部類、局部內部類、匿名內部類和靜態嵌套類四種。
1、靜態內部類定義
靜態內部類,定義在類中,任何方法外,用static定義;靜態內部類只能訪問外部類的靜態成員。
生成(new)一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成:Outer.Inner in=new Outer.Inner();而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類。可以定義私有靜態內部類。
2、java實現靜態內部類注意事項
將某個內部類定義為靜態類,跟將其他類定義為靜態類的方法基本相同,引用規則也基本一致。不過其細節方面仍然有很大的不同。具體來說,主要有如下幾個地方要引起注意。
1)一般情況下,如果一個內部類不是被定義成靜態內部類,那麼在定義成員變數或者成員方法的時候,是不能夠被定義成靜態成員變數與靜態成員方法的。也就是說,在非靜態內部類中不可以聲明靜態成員
2)一般非靜態外部類可以隨意訪問其外部類的成員變數以及方法(包括聲明為private的方法),但是如果一個內部類被聲明為static,則其在訪問包括自身的外部類會有諸多的限制。靜態內部類不能訪問其外部類的非靜態成員變數和方法
3)在一個類中創建非靜態成員內部類的時候,有一個強制性的規定,即內部類的實例一定要綁定在外部類的實例中。然後要在一個外部類中定義一個靜態的內部類,不需要利用關鍵字new來創建內部類的實例。即在創建靜態類內部對象時,不需要其外部類的對象
3、靜態內部類示例
java在實現LinkedList時使用了如下內部類:
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
........
private static class Entry<E> {
E element;
Entry<E> next;
Entry<E> previous;
Entry(E element, Entry<E> next, Entry<E> previous) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
private Entry<E> addBefore(E e, Entry<E> entry) {
Entry<E> newEntry = new Entry<E>(e, entry, entry.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
modCount++;
return newEntry;
}
........
}
這里即靜態內部類的典型用法
B. java本類的靜態方法如何直接調用,其他類的靜態方法如何調用
java本類的靜態方法,直接使用靜態的方法名傳入參數就可以了,如果是其他類的,許可權修飾符必須是public否者無法調用,調用方法是
其他類的類名
.
方法名(參數)
C. JAVA 靜態類寫法和調用
js?還是指JSP的腳本段。先看一般是如何顯示數據吧,最後在介紹js:
我們可以使用JSP頁面的腳本段,首先寫個Bean類:
public class SomeBean{
public String getName(){return "123";}
public void setName(String name){}
}
<!-- test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%
SomeBean bean=new SomeBean();
out.println("Bean-name is "+bean.getName());
%>
就是這樣,腳本段裡面的東西其實就是java代碼,而JSP頁面本質就是servlet。我不太清楚你是否了解JSP的編譯,如果你不知道的話我建議你到網路搜一下"JSP的java代碼"一類的東西看看,這是基礎。
你說的靜態類應該是指類中包含靜態域吧,除了內部類可以是靜態的外,別的類都不行。不論是靜態域還是普通域,用上面的腳本段都可以搞定。
再看看struts,靜態的顯示我放在後面了:
首先我們來寫一個Action類:
public class LoginAction{
public String execute(){
return SUCCESS;
}
public void setValue(SomeBean value){
this.value=value;
}
public SomeBean getValue(){
return this.value;
}
private SomeBean value;
}
再寫出Bean類:
public class SomeBean{
public String getName(){}
public void setName(String name){}
}
配置Action應該不用說了,沒什麼特別的,不會就上網查吧。
我們現在說方法。
方法一:
使用OGNL表達式。你可以使用struts自帶的標簽,他們都支持OGNL,比如s:property。舉個例子:
<!--test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:property value="value.name"/>
你訪問LoginAction的時候s:property標簽就會顯示getValue().getName();
如果你想了解更多的struts2標簽和OGNL表達式建議去找更詳盡的資料。
方法二:
當然是使用JSP本身的性質了。通過request和session來獲取值。
我們把Action類改一下:
public class LoginAction{
public string execute(){
SomeBean value=new SomeBean();
value.setName("sfsfjsfje");
ActionContext context=ActionContext.getContext();
//往request里放attribute
context.put("value",value);
//往session里放
context.getSession().put("value",value);
return SUCCESS;
}
}
接下來我們改頁面:
<!-- test.jsp -->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%= ((SomeBean) request.getAttribute("value")).getName() %>
<%= ((SomeBean) session.get("value")).getName() %>
OGNL也可以顯示靜態域:
public class SomeBean{
public static String name="123";
public static String getAlias(){return "abc";}
}
public class LoginAction{
public String execute(){return SUCCESS;}
}
配置文件不寫了。
頁面:
<!--test.jsp-->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!--還是用s:property-->
<s:property value="@SomeBean@name"/>
<s:property value="@SomeBean@getAlias()"/>
當你訪問LoginAction時就會顯示SomeBean的name和getAlias()。不知道你是不是問的這個。
如果你要在js中調用數據也很容易:
<!-- test.jsp -->
<%@ page contentType="text/html;charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<script language="javascript" type="text/javascript">
var name="<s:property value="@SomeBean@name"/>";
</script>
這樣js中就有相應的數據了。
D. java中靜態方法只能被靜態類調用嗎
Java中當然可以在一個類中調用另一個類的靜態公有方法。
首先公有方法,其他類是可以訪問的。
調用靜態方法的語法是,
類名.方法名(參數...)
所以,比如另一個類叫OtherClass,它的靜態公有方法是publicMethodA(),假設它還兆談有返回值,是int類型,
那麼在你自己悔猜搜的類里調用的方式就是:
int result = OtherClass.publicMethodA();
另碧歷外,調用非靜態方法(也叫成員方法),比如方法叫int publicMethodB(),就必須先創建這個對象再調用其方法,例如:
int result2 = new OtherClass().publicMethodB();
E. java本類的靜態方法如何直接調用,其他類的靜態方法如何調用
java本類的靜態方法,直接使用靜態的方法咐褲困名傳入參數就可以了,如果是其他類的,許可權修飾符必須是public否者純團無法調用,調用方法是 其他類的類名 . 方法名(參數)衡念
F. Java中可以直接調用類中靜態方法,不用實例化么,詳解!原理
好吧,我來試試看,看答案能不能夠讓你滿意。
先通俗的分析下,我們把類看作是一個房子。房子裡面有傢具,桌椅板凳之類的,房子裡面還有人。
房子裡面所有的人都應該是共有一套傢具的。也就是說,這些傢具是唯一的,如果某個傢具壞了,那麼大家都用不了。
我們再看一看定義,java的靜態變數也叫做類變數,它開始於類的創建,結束於類的消亡。非靜態變數叫做實例變數,它開始於類的實例的創建,結束語類的實例的消亡。靜態變數被所有實例所共享。也就是如上面的例子,座椅板凳是類變數,它們是在房子被建好了之後就被添加放置進來,而且基本都是唯一的。人就相當於實例,每個人都能用這些傢具,但是如果傢具一旦損壞,那就是壞了,或者你把某一個傢具搬走,那麼所有的人都用不了這個傢具,房子里也不存在這個傢具了。
但是房子里可以進很多人,可以進張三,也可以進李四。所以這些人就是類的實例對象,他們身上穿的衣服就可以叫做實例變數。
那麼在內存之中又是如何的呢?當一個類被創建並初始化後,內存中會有兩個區域,棧區和堆區。棧中主要存放的是引用變數,堆中主要存放的是真實的被實例化後的類。棧中的引用變數會指向堆中的真實對象地址。比如A a=new A(); a這個變數就會在棧中,實際被new出來的類A的對象會放在堆中,a指向實際被new出來的A對象。
如果一個類中有靜態變數的話,程序首先會把該靜態變數載入進內存中,也就是在堆中開辟一個區域專門存放。以後不管你new多少個類的對象,該靜態變數永遠都是在那裡的。也就是說,靜態變數在類的初始化一次後,系統就不會為該變數開辟新的內存空間。而每new一個類的對象,系統就會重新在
堆內存中開辟一個新空間來存放該類的實例對象,並且棧中也會有一個新的引用變數去指向它。
靜態方法也是類似,但是有一點要強調,靜態方法只中不能調用非靜態方法。因為被static修飾的方法會首先被Classloader對象先載入進內存,而這個時候可能其它的非靜態方法或者變數還沒有被載入進來。就好比我現在想做包子,現在麵粉被static修飾,首先已經拿到你身邊,可是因為包子餡不是static修飾的,所以可能包子餡兒還沒運過來,你說怎麼做的出包子呢。
被static修飾過的都是隨著類的初始化後就產生了,在堆內存中都有一塊專門的區域來存放,所以只需要類名點方法名或者變數名即可。而非靜態的就必須通過類的對象去調相應的。就像是你想要紅色的衣服,你必須是從穿紅色的衣服的人的身上拿過來才行,所以你必須找到穿紅色衣服的人,也就是類的實例對象,而你如果要去找一個桌子,而桌子就在房間里擺著,你只要進到房間里直接走過去拿來就可以了~~
G. java調用某個類的靜態方法時會初始化該類本身么會執行該類的無參構造方法么
不會,只有在實例化類時才會調用構造方法。靜態方法,也就是脊罩使用static聲明的方法,在虛擬機啟動載入類的時候就進行了創建,所以使用到靜態方法時,直接使用類名點靜態氏敏方法即可調用殲野枝。
H. JAVA如果是靜態類在另一類調用時候可以直接用類名.方法嗎而不用創建對象
你好,首先理解一下靜態類。就是類內部的方法和成員變數都是static的。
准確的說,靜態類在另一個類調用的時候可以直接用類名.方法還取決於方法的訪問修飾符(指散private/包級私有/protected/public)。
而並灶不是靜態類,在另一類絕逗扮中調用的時候一定要先創建該類為對象才能調用該類的方法嗎?這說法也太決定,如果該類中有一個方法是static的,那麼調用這個方法是不需要創建對象的。
I. java調用靜態類的方法時是不是可以直接 類名.方法,而調用非靜態類方法時候需要new個類再 對象.方法
你好,你的理解大體上是對的。
但是嚴格的說,上述必須在類外部調用才成立。
而且1.5之後有了靜態方法導入,可以不羨悉笑用寫類名,直接陸頃調用靜態方法。
「調用非靜態類方法時候需要new個類再 對象.方法」這句准確的說
「調用非靜態類方法時候需要new個對象出來,再 對象.方法」
以上的所有調用必須嚴格滿足訪問許可權。
也就是私兄含有、包級私有、受保護、公共。
J. 在Java中,使用靜態類對象應該用New嗎
調用非靜態類方法時候需要new個對象出來,再 對象.方法,,如肢野果你要調用父類中被子類重載的絕純方法,那麼就用super.方法名。要是不需要的話,直接調用就可以了。並飢咐