java初始化函數
Ⅰ java 構造函數 初始化
第一個問題:必須先聲明(private int x, y; )才能使用point(int x, int y) 答案是:不必須,聲明為private表明x,y這兩個變數只能在point類內部可以使用,類外將無法訪問
第二個問題:子類繼承父類時候是不是也必須聲明 int radius; 才能使用 circle(int r, int x, int y)
答案是:不必須,radius只是子類的一個變數而已,如果不聲明,依然可以使用構造函數circle(int r, int x, int y)
第三個問題: 是不是後面必須初始化 radius=r; 答案是:不必須,radius只是子類的一個變數,在構造函數中是否初始化都沒有關系,就算構造函數體為空也沒有關系
Ⅱ java中初始化
順序如下:
1、靜態的部分在classLoader載入類的時候就會執行,靜態塊中不能引用非靜態的變數(因為這些變數要通過實例化類才能創建,在靜態塊執行的時候都不存在)。也不存在靜態的成員變數,跟後面的兩個初始化有質的不同(後兩個是初始化成員變數)。
2、定義變數時直接賦的值。
3、構造函數。
Ⅲ Java子類構造函數初始化問題
剛剛想當然的回答了一個3,然後發現不妥,試了一下果然不對,就可恥的把回答刪除了,刪除後居然不能重新回答,果斷重新注冊個號回答
首先我們加上點東西
publicclassDemo10{
publicstaticvoidmain(String[]args){
newJoo();
}
}
classIoo{
inta=3;
publicIoo(){
System.out.println("Ioo構造方法執行");
System.out.println("Ioo中this類型為:"+this.getClass().getSimpleName());//查看this是什麼類型
this.t();
System.out.println("Ioo構造方法執行完畢");
}
publicvoidt(){
System.out.println("執行Ioo的t方法");
System.out.println(this.a);
System.out.println("Ioo中的t方法執行完畢");
}
}
classJooextendsIoo{
intb=3;
publicJoo(){
System.out.println("Joo構造方法執行完畢");
}
@Override
publicvoidt(){
System.out.println("執行Joo中的t方法");
System.out.println(this.b);
System.out.println("Joo中的t方法執行完畢");
}
}
輸出結果為:
-------------------------------------
Ioo構造方法執行
Ioo中this類型為:Joo
執行Joo中的t方法
0
Joo中的t方法執行完畢
Ioo構造方法執行完畢
Joo構造方法執行完畢
-------------------------------------
為什麼輸出的是0呢?又為什麼Ioo中this的類型會是Joo呢?
接下來我們反編譯一下class文件
classIoo{
inta;
publicIoo(){
a=3;
System.out.println("Ioo構造方法執行");
System.out.println("Ioo中this類型為:"+getClass().getSimpleName());
t();
System.out.println("Ioo構造方法執行完畢");
}
publicvoidt(){
System.out.println("執行Ioo的t方法");
System.out.println(a);
System.out.println("Ioo中的t方法執行完畢");
}
}
classJooextendsIoo{
intb;
publicJoo(){
b=3;
System.out.println("Joo構造方法執行完畢");
}
publicvoidt(){
System.out.println("執行Joo中的t方法");
System.out.println(b);
System.out.println("Joo中的t方法執行完畢");
}
}
我們可以看出,成員變數的賦值操作是放到了構造方法中執行的,我們根據控制台輸出語句的順序來模擬java的執行順序,由於我們實例化的是子類Joo,他會首先執行父類的構造方法,我們先來看執行順序
a賦值為3
輸出"Ioo構造方法執行"
由於this代表當前對象,那麼既然是實例化Joo時調用的方法,this代表的就是Joo,故輸出Joo
執行t方法(由於class反編譯後,this.被簡化了,所以我們觀察源代碼,this.t(),既然this的類型是Joo,那麼this.t()執行的就是Joo中的t方法)。此時控制台輸出"執行Joo中的t方法"
此時應該執行System.out.println(b),我們想當然的以為應該是3,結果卻輸出了0,原因是這樣:我們在Joo的構造方法中加入了輸出語句,可是在控制台,此時並沒有輸出"Joo構造方法執行完畢",可見Joo的構造方法並沒有執行,就是b = 3的賦值語句同樣沒有執行,此時的b默認值為0,故控制台輸出了0。
此時t方法執行完畢,輸出"Joo中的t方法執行完畢",Ioo的構造方法也執行完畢,輸出"Ioo構造方法執行完畢"
父類Ioo的構造方法執行完畢,最後執行子類Joo的構造方法,我們看到,此時的b才被賦值為3,最後輸出"Joo構造方法執行完畢"
至此,模擬完成,有不懂的可以再hi我,不要hi這個號,這號只是為了臨時回答注冊的,如無意外,不會再上,我常用的叫kq346635081,在這條回答的評論里
Ⅳ java構造函數初始化的問題
1.首先明白構造函數的定義,如下:
java 構造函數
一般我們講的「函數」就是「方法」;構造函數=構造方法;構造方法是一種特殊的方法,具有以下特點。(1)構造方法的方法名必須與類名相同。(2)構造方法沒有返回類型,也不能定義為void,在方法名前面不聲明方法類型。(3)構造方法的主要作用是完成對象的初始化工作,它能夠把定義對象時的參數傳給對象的域。(4)一個類可以定義多個構造方法,如果在定義類時沒有定義構造方法,則編譯系統會自動插入一個無參數的默認構造器,這個構造器不執行任何代碼。(5)構造方法可以重載,以參數的個數,類型,或排列順序區分。
2.請注意這句話:(3)構造方法的主要作用是完成對象的初始化工作,它能夠把定義對象時的參數傳給對象的域。也就是上面你的構造函數根本就沒有傳遞參數給它,也就是說你在構造函數聲明的int age=10,只是相當於函數里的一個變數,超出這個函數就失去作用了,也就是說為默認的int值為0.
3.如果是要初始化成員變數,最好還是構造有參。
知識水平有限,望請採納!!!呵呵!!!
Ⅳ java初始化
你說「在java初始化時,順序為靜態變數-靜態初始化塊-非靜態變數-非靜態初始化塊-構造函數」
請問你在哪知道的,我也希望了解一下
我一直覺得構造函數會在靜態初始化塊之後
對 非靜態變數-非靜態初始化塊-構造函數 這樣的排列倒是有點...
------------------------------------------------------------------
我在javaEye上找了找相關文章:
1在new B一個實例時首先要進行類的裝載。(類只有在使用New調用創建的時候才會被java類裝載器裝入)
2,在裝載類時,先裝載父類A,再裝載子類B
3,裝載父類A後,完成靜態動作(包括靜態代碼和變數,它們的級別是相同的,安裝代碼中出現的順序初始化)
4,裝載子類B後,完成靜態動作
類裝載完成,開始進行實例化
1,在實例化子類B時,先要實例化父類A
2,實例化父類A時,先成員實例化(非靜態代碼)
3,父類A的構造方法
4,子類B的成員實例化(非靜態代碼)
5,子類B的構造方法
確實~
Ⅵ java構造函數初始化問題
public class A{
String qq;
int ww;
int ee;
public A(String str){
qq = str;
}
public A(String str,int a){
qq=str;
ww=a;
}
public A(String str,int a,int b){
qq=str;
ww=a;
ee=b;
}
}
public class B{
public static void main(String args[]){
A a = new A("ss")
A a = new A("ss",12)
A a = new A("ss",12,5)
}
}
你說的是這意思不
Ⅶ 求教java初始化和main函數之間的關系。
MD5的全稱是message-digest algorithm 5(信息-摘要演算法),在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest開發出來,經md2、md3和md4發展而來。它的作用是讓大容量信息在用數字簽名軟體簽署私人密匙前被"壓縮"成一種保密的格式(就是把一 個任意長度的位元組串變換成一定長的大整數)。不管是md2、md4還是md5,它們都需要獲得一個隨機長度的信息並產生一個128位的信息摘要。雖然這些 演算法的結構或多或少有些相似,但md2的設計與md4和md5完全不同,那是因為md2是為8位機器做過設計優化的,而md4和md5卻是面向32位的電 腦。這三個演算法的描述和c語言源代碼在internet rfcs 1321中有詳細的描述(),這是一份最權威的文檔,由ronald l. rivest在1992年8月向ieft提交。
rivest在1989年開發出md2演算法。在這個演算法中,首先對信 息進行數據補位,使信息的位元組長度是16的倍數。然後,以一個16位的檢驗和追加到信息末尾。並且根據這個新產生的信息計算出散列值。後來,rogier 和chauvaud發現如果忽略了檢驗和將產生md2沖突。md2演算法的加密後結果是唯一的--既沒有重復。
為了加強演算法的安全性, rivest在1990年又開發出md4演算法。md4演算法同樣需要填補信息以確保信息的位元組長度加上448後能被512整除(信息位元組長度mod 512 = 448)。然後,一個以64位二進製表示的信息的最初長度被添加進來。信息被處理成512位damg?rd/merkle迭代結構的區塊,而且每個區塊要 通過三個不同步驟的處理。den boer和bosselaers以及其他人很快的發現了攻擊md4版本中第一步和第三步的漏洞。dobbertin向大家演示了如何利用一部普通的個人電 腦在幾分鍾內找到md4完整版本中的沖突(這個沖突實際上是一種漏洞,它將導致對不同的內容進行加密卻可能得到相同的加密後結果)。毫無疑問,md4就此 被淘汰掉了。
盡管md4演算法在安全上有個這么大的漏洞,但它對在其後才被開發出來的好幾種信息安全加密演算法的出現卻有著不可忽視的引導作用。除了md5以外,其中比較有名的還有sha-1、ripe-md以及haval等。
一年以後,即1991年,rivest開發出技術上更為趨近成熟的md5演算法。它在md4的基礎上增加了"安全-帶子"(safety-belts)的 概念。雖然md5比md4稍微慢一些,但卻更為安全。這個演算法很明顯的由四個和md4設計有少許不同的步驟組成。在md5演算法中,信息-摘要的大小和填充 的必要條件與md4完全相同。den boer和bosselaers曾發現md5演算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發現的加密後結果了。
van oorschot和wiener曾經考慮過一個在散列中暴力搜尋沖突的函數(brute-force hash function),而且他們猜測一個被設計專門用來搜索md5沖突的機器(這台機器在1994年的製造成本大約是一百萬美元)可以平均每24天就找到一 個沖突。但單從1991年到2001年這10年間,竟沒有出現替代md5演算法的md6或被叫做其他什麼名字的新演算法這一點,我們就可以看出這個瑕疵並沒有 太多的影響md5的安全性。上面所有這些都不足以成為md5的在實際應用中的問題。並且,由於md5演算法的使用不需要支付任何版權費用的,所以在一般的情 況下(非絕密應用領域。但即便是應用在絕密領域內,md5也不失為一種非常優秀的中間技術),md5怎麼都應該算得上是非常安全的了。
二、演算法的應用
md5的典型應用是對一段信息(message)產生信息摘要(message-digest),以防止被篡改。比如,在unix下有很多軟體在下載的時候都有一個文件名相同,文件擴展名為.md5的文件,在這個文件中通常只有一行文本,大致結構如:
md5 (tanajiya.tar.gz) =
這就是tanajiya.tar.gz文件的數字簽名。md5將整個文件當作一個大文本信息,通過其不可逆的字元串變換演算法,產生了這個唯一的md5信 息摘要。如果在以後傳播這個文件的過程中,無論文件的內容發生了任何形式的改變(包括人為修改或者下載過程中線路不穩定引起的傳輸錯誤等),只要你對這個 文件重新計算md5時就會發現信息摘要不相同,由此可以確定你得到的只是一個不正確的文件。如果再有一個第三方的認證機構,用md5還可以防止文件作者的 "抵賴",這就是所謂的數字簽名應用。
md5還廣泛用於加密和解密技術上。比如在unix系統中用戶的密碼就是以md5(或其它類似的算 法)經加密後存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成md5值,然後再去和保存在文件系統中的md5值進行比較,進而確定輸入的 密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員許可權的 用戶知道,而且還在一定程度上增加了密碼被破解的難度。
正是因為這個原因,現在被黑客使用最多的一種破譯密碼的方法就是一種被稱為"跑字 典"的方法。有兩種方法得到字典,一種是日常搜集的用做密碼的字元串表,另一種是用排列組合方法生成的,先用md5程序計算出這些字典項的md5值,然後 再用目標的md5值在這個字典中檢索。我們假設密碼的最大長度為8位位元組(8 bytes),同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是p(62,1)+p(62,2)….+p (62,8),那也已經是一個很天文的數字了,存儲這個字典就需要tb級的磁碟陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼md5值的情況 下才可以。這種加密技術被廣泛的應用於unix系統中,這也是為什麼unix系統比一般操作系統更為堅固一個重要原因。
三、演算法描述
對md5演算法簡要的敘述可以為:md5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在md5演算法中,首先需要對信息進行填充,使其位元組長度對512求余的結果等於448。因此,信息的位元組長度(bits length)將被擴展至n*512+448,即n*64+56個位元組(bytes),n為一個正整數。填充的方法如下,在信息的後面填充一個1和無數個 0,直到滿足上面的條件時才停止用0對信息的填充。然後,在在這個結果後面附加一個以64位二進製表示的填充前信息長度。經過這兩步的處理,現在的信息字 節長度=n*512+448+64=(n+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對信息長度的要求。
md5中有四個32位被稱作鏈接變數(chaining variable)的整數參數,他們分別為:a=0x01234567,b=0x89abcdef,c=0xfedcba98,d=0x76543210。
當設置好這四個鏈接變數後,就開始進入演算法的四輪循環運算。循環的次數是信息中512位信息分組的數目。
將上面四個鏈接變數復制到另外四個變數中:a到a,b到b,c到c,d到d。
主循環有四輪(md4隻有三輪),每輪循環都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結 果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之 一。
以一下是每次操作中用到的四個非線性函數(每輪一個)。
f(x,y,z) =(x&y)|((~x)&z)
g(x,y,z) =(x&z)|(y&(~z))
h(x,y,z) =x^y^z
i(x,y,z)=y^(x|(~z))
(&是與,|是或,~是非,^是異或)
這四個函數的說明:如果x、y和z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。
f是一個逐位運算的函數。即,如果x,那麼y,否則z。函數h是逐位奇偶操作符。
假設mj表示消息的第j個子分組(從0到15),
<< ff(a,b,c,d,mj,s,ti) 表示 a=b+((a+(f(b,c,d)+mj+ti)
<< gg(a,b,c,d,mj,s,ti) 表示 a=b+((a+(g(b,c,d)+mj+ti)
<< hh(a,b,c,d,mj,s,ti) 表示 a=b+((a+(h(b,c,d)+mj+ti)
<< ii(a,b,c,d,mj,s,ti) 表示 a=b+((a+(i(b,c,d)+mj+ti)
<< 這四輪(64步)是:
第一輪
ff(a,b,c,d,m0,7,0xd76aa478)
ff(d,a,b,c,m1,12,0xe8c7b756)
ff(c,d,a,b,m2,17,0x242070db)
ff(b,c,d,a,m3,22,0xc1bdceee)
ff(a,b,c,d,m4,7,0xf57c0faf)
ff(d,a,b,c,m5,12,0x4787c62a)
ff(c,d,a,b,m6,17,0xa8304613)
ff(b,c,d,a,m7,22,0xfd469501)
ff(a,b,c,d,m8,7,0x698098d8)
ff(d,a,b,c,m9,12,0x8b44f7af)
ff(c,d,a,b,m10,17,0xffff5bb1)
ff(b,c,d,a,m11,22,0x895cd7be)
ff(a,b,c,d,m12,7,0x6b901122)
ff(d,a,b,c,m13,12,0xfd987193)
ff(c,d,a,b,m14,17,0xa679438e)
ff(b,c,d,a,m15,22,0x49b40821)
第二輪
gg(a,b,c,d,m1,5,0xf61e2562)
gg(d,a,b,c,m6,9,0xc040b340)
gg(c,d,a,b,m11,14,0x265e5a51)
gg(b,c,d,a,m0,20,0xe9b6c7aa)
gg(a,b,c,d,m5,5,0xd62f105d)
gg(d,a,b,c,m10,9,0x02441453)
gg(c,d,a,b,m15,14,0xd8a1e681)
gg(b,c,d,a,m4,20,0xe7d3fbc8)
gg(a,b,c,d,m9,5,0x21e1cde6)
gg(d,a,b,c,m14,9,0xc33707d6)
gg(c,d,a,b,m3,14,0xf4d50d87)
gg(b,c,d,a,m8,20,0x455a14ed)
gg(a,b,c,d,m13,5,0xa9e3e905)
gg(d,a,b,c,m2,9,0xfcefa3f8)
gg(c,d,a,b,m7,14,0x676f02d9)
gg(b,c,d,a,m12,20,0x8d2a4c8a)
第三輪
hh(a,b,c,d,m5,4,0xfffa3942)
hh(d,a,b,c,m8,11,0x8771f681)
hh(c,d,a,b,m11,16,0x6d9d6122)
hh(b,c,d,a,m14,23,0xfde5380c)
hh(a,b,c,d,m1,4,0xa4beea44)
hh(d,a,b,c,m4,11,0x4bdecfa9)
hh(c,d,a,b,m7,16,0xf6bb4b60)
hh(b,c,d,a,m10,23,0xbebfbc70)
hh(a,b,c,d,m13,4,0x289b7ec6)
hh(d,a,b,c,m0,11,0xeaa127fa)
hh(c,d,a,b,m3,16,0xd4ef3085)
hh(b,c,d,a,m6,23,0x04881d05)
hh(a,b,c,d,m9,4,0xd9d4d039)
hh(d,a,b,c,m12,11,0xe6db99e5)
hh(c,d,a,b,m15,16,0x1fa27cf8)
hh(b,c,d,a,m2,23,0xc4ac5665)
第四輪
ii(a,b,c,d,m0,6,0xf4292244)
ii(d,a,b,c,m7,10,0x432aff97)
ii(c,d,a,b,m14,15,0xab9423a7)
ii(b,c,d,a,m5,21,0xfc93a039)
ii(a,b,c,d,m12,6,0x655b59c3)
ii(d,a,b,c,m3,10,0x8f0ccc92)
ii(c,d,a,b,m10,15,0xffeff47d)
ii(b,c,d,a,m1,21,0x85845dd1)
ii(a,b,c,d,m8,6,0x6fa87e4f)
ii(d,a,b,c,m15,10,0xfe2ce6e0)
ii(c,d,a,b,m6,15,0xa3014314)
ii(b,c,d,a,m13,21,0x4e0811a1)
ii(a,b,c,d,m4,6,0xf7537e82)
ii(d,a,b,c,m11,10,0xbd3af235)
ii(c,d,a,b,m2,15,0x2ad7d2bb)
ii(b,c,d,a,m9,21,0xeb86d391)
常數ti可以如下選擇:
在第i步中,ti是4294967296*abs(sin(i))的整數部分,i的單位是弧度。(4294967296等於2的32次方)
所有這些完成之後,將a、b、c、d分別加上a、b、c、d。然後用下一分組數據繼續運行演算法,最後的輸出是a、b、c和d的級聯。
當你按照我上面所說的方法實現md5演算法以後,你可以用以下幾個信息對你做出來的程序作一個簡單的測試,看看程序有沒有錯誤。
md5 ("") =
md5 ("a") =
md5 ("abc") =
md5 ("message digest") =
md5 ("abcdefghijklmnopqrstuvwxyz") =
md5 ("") =
md5 ("1234567890") =
如果你用上面的信息分別對你做的md5演算法實例做測試,最後得出的結論和標准答案完全一樣,那我就要在這里象你道一聲祝賀了。要知道,我的程序在第一次編譯成功的時候是沒有得出和上面相同的結果的。
四、MD5的安全性
md5相對md4所作的改進:
1. 增加了第四輪;
2. 每一步均有唯一的加法常數;
3. 為減弱第二輪中函數g的對稱性從(x&y)|(x&z)|(y&z)變為(x&z)|(y&(~z));
4. 第一步加上了上一步的結果,這將引起更快的雪崩效應;
5. 改變了第二輪和第三輪中訪問消息子分組的次序,使其更不相似;
6. 近似優化了每一輪中的循環左移位移量以實現更快的雪崩效應。各輪的位移量互不相同。
Ⅷ 請問java構造函數如何初始化成員變數的啊
java構造函數如何初始化成員變數的方式如下:
初始化順序依據轉換後對應的class類成員變數的初始化順序依次執行,所以所有的靜態成員變數都是先聲明,後執行賦值的,而且賦值的順序也是依照源代碼對靜態成員變數初始化的順序進行的,注意:定義一個成員變數並直接初始化與在靜態代碼塊中進行初始化是等價的,都是依據它們在源代碼中定義的順序進行的。
Ⅸ java類中構造函數中:數組怎樣初始化
1、java構造函數--數組 在構造函數中初始化數組,如 public class array { private int [][] matrix; public array(int r,int c) { matrix=new matrix[r][c]; } }
matrix=new matrix[r][c];
2、這里是new int[][]; java中8個基本數據類型都是有默認值的,int默認值為0 ,
3、所以數組中默認都為0.
4、但是切記有默認值的變數必須是類的屬性,方法中局部變數必須賦值才可以使用。