新聞中心
java代碼解析
一樓的說的夠全面了,不過稍有誤解.
成都創(chuàng)新互聯(lián)公司長期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為昌平企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),昌平網(wǎng)站改版等技術(shù)服務(wù)。擁有10年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
再來表示抱歉,我對編程語言中的中文名詞非常不了解,所以如果以下的回復(fù)對你的閱讀或者理解造成困難,請見諒.
1.首先,要明白這個問題的答案,需要了解call?(pass)?by?value?和?call?(pass)?by?reference?的區(qū)別.簡單來說:
call?by?value通常是復(fù)制這個parameter的值去另外一塊內(nèi)存里,然后傳給function,?所以在method/function里邊對這個變量的所有變更,實際上都是對復(fù)制過來的鏡像進(jìn)行操作,不會對原本的variable有任何影響.
call?by?reference是將parameter的reference傳給function,簡單點理解就是直接把variable傳給function.所以說這個variable的值是可以被function改變的.這個用法在c/c++中非常常見,用法是variable_name.
2.再來,在Java里邊,你可以很簡單的理解為:?Java中只有call?by?value,?也就是說,所以所有傳給function的parameter本身都不會被改變.?(這是最簡單直白的理解,當(dāng)然也有另一種常從sun的人那邊聽到的說法:Java是call?by?value?+?call?by?reference?by?value)
3.那么現(xiàn)在的問題就是為什么第二個結(jié)果是2了.?首先說一下sun官方的解釋:?對于reference?type在作為parameter/argument的時候,也是call?by?value,?但是在你擁有足夠權(quán)限時(比方說那個變量是public的,?不是final的等等各種符合的情況),可以修改這個object中fields的值(也就是屬于這個object(嚴(yán)謹(jǐn)點講是an?instance?of?the?object)?內(nèi)部的變量,?在你的例子中,?ko?里邊的?a?就是一個field,?所以update(ko)會使ko.a變成2).
4.如果你是一個有過c/c++學(xué)習(xí)經(jīng)驗的人或者你以上的解釋很難理解,以下這種說法或許更適合你?(當(dāng)然了,這只是大多包括我在內(nèi)有c經(jīng)驗的人的一種理解方式)
這里可以引入一個新的概念,pointer.?這是一種比較特殊的變量,它內(nèi)部所儲存的東西,其實只是另外一個變量的內(nèi)存地址.?如果對內(nèi)存沒有概念,你可以把它簡單理解為是風(fēng)箏的線軸,雖然看它本身看不出什么端倪,但是順著摸過去總會找到風(fēng)箏,看到它是什么樣子.?以pointer方式理解Java的人,通常會說:?Type?variable?=?new?Type();?這個過程中,最后生成的這個variable其實就是一個pointer,而不是instance本身.
在Java中,?有c/c++經(jīng)驗的人通常認(rèn)為Java是call?by?value.同時,當(dāng)一個變量用在儲存reference?type的時候,實際上儲存的是它的pointer,這也一樣可以解釋為什么ko.a會有2這個結(jié)果,因為雖然pointer被傳到function里邊時,本身是call?by?value,無法被改變.但這并不影響function本身對這個pointer指向的object的內(nèi)容做任何改變.?當(dāng)然,再次聲明,這只是一種幫助有c/c++經(jīng)驗的人理解的方法.?Sun本身嚴(yán)正聲明Java里邊沒有pointer這個東西的存在.
5.?再來解釋一下為什么說樓上所說的(或者說樓上引用的)理解略有偏差.
引用"我們上面剛學(xué)習(xí)了JAVA的數(shù)據(jù)類型,則有:值類型就是按值傳遞的,而引用類型是按引用傳遞的"?這句話很明顯的有兩點錯誤.?第一點,如果我上面所說的,Java是沒有call?by?reference的.
第二點,暫且假設(shè)Java里邊是有call?by?reference的,?這句話依然不成立.
Java中的變量有兩種類型:?primitive?types?和?reference?type.
primitive?type包括byte,?short,?int,?long,?char,?boolean,?float和double.
而這8種之外的所有的,都是reference?type.
下面是一段對你的貼上來的code的一點延伸,希望可以幫助你更好的理解Java中的argument?/?parameter到底是如何運作的.
public?class?Test?{
public?static?void?main(String[]?args)?{
int?a?=?1;
Koo?koo?=?new?Koo();
Object?o?=?new?Integer(1);
Koo?newKoo?=?new?Koo();
update(a);
update(koo);
update(o);
update(newKoo);
newUpdate(newKoo);
System.out.println(a);
System.out.println(koo.a);
System.out.println(o);
System.out.println(newKoo.a);
}
static?void?update(int?a)?{
a++;
}
static?void?update(Koo?koo)?{
koo.a++;
}
static?void?update(Object?o)?{
o?=?(int)?(Integer.parseInt(o.toString())?+?1);
}
static?void?newUpdate(Koo?koo)?{
koo?=?new?Koo();
}
}
class?Koo?{
int?a?=?1;
}
/*
o?=?(int)?(Integer.parseInt(o.toString())?+?1);?這一行中的(int)純粹是多余的,是否有這個casting對code本身沒有任何影響.?如果你高興也可以用
o?=?new?Integer(Integer.parseInt(o.toString())?+?1);
或者干脆
o?=?Integer.parseInt(o.toString())?+?1;
*/
以上這些code運行之后會得到1?2?1?2的結(jié)果.?后面兩個結(jié)果可以很好的說明,?即使對objects?(reference?type?variables)?來看,?Java所應(yīng)用的也并不是call?by?reference.?否則的話,以上code運行結(jié)果應(yīng)該是1?2?2?1
希望你可以真正理解這個新的例子中,產(chǎn)生1212這個結(jié)果的原因,從而對Java中的arguments有一個系統(tǒng)全面的認(rèn)識.
圖片是相關(guān)資料的鏈接,知道里貌似不能加網(wǎng)址
各位大佛們,JAVA問題
import?java.awt.BorderLayout;
import?java.awt.Color;
import?java.awt.GridLayout;
import?javax.swing.JButton;
import?javax.swing.JFrame;
import?javax.swing.JPanel;
import?javax.swing.JTextField;
public?class?JiSuanQi{?
String?s="",s1=null,s2=null;?
JFrame?f=new?JFrame("計算器");?
JTextField?tf=new?JTextField(30);?
JPanel?p1=new?JPanel();?
JPanel?p2=new?JPanel();?
JPanel?p3=new?JPanel();?
JButton?bt1=new?JButton("=");?
JButton?bt2=new?JButton("刪除");
JButton[]?bt=new?JButton[16];?
int?id=0;?
public?static?void?main(String[]?args)?{?
new?JiSuanQi().init();
}?
public?void?init()?{?
f.setBackground(new?Color(85,247,253));?
f.setLayout(new?BorderLayout(4,4));?
p2.setLayout(new?GridLayout(4,4,4,4));?
p3.setLayout(new?BorderLayout(4,4));
f.setResizable(false);?
f.add(p1,BorderLayout.NORTH);?
f.add(p2);
p3.add(bt2,BorderLayout.NORTH);
p3.add(bt1);?
p1.add(tf);?
f.add(p3,BorderLayout.EAST);?
String[]?b={"1","2","3","+","4","5","6","-","7","8","9","*","0",".","復(fù)位","/"};
for(int?i=0;i16;i++)?{?
bt[i]=new?JButton(b[i]);?
p2.add(bt[i]);?
}?
bt[0].setForeground(Color.blue);
bt[1].setForeground(Color.blue);?
bt[2].setForeground(Color.blue);
bt[4].setForeground(Color.blue);?
bt[5].setForeground(Color.blue);?
bt[6].setForeground(Color.blue);?
bt[8].setForeground(Color.blue);
bt[9].setForeground(Color.blue);?
bt[10].setForeground(Color.blue);?
bt[12].setForeground(Color.blue);?
bt[13].setForeground(Color.blue);?
bt[3].setForeground(Color.red);?
bt[7].setForeground(Color.red);?
bt[11].setForeground(Color.red);?
f.pack();
f.setVisible(true);
f.setDefaultCloseOperation(3);
}
}
java中要求用戶輸入的代碼
你的程序的問題,一個是數(shù)組arr1還沒有輸入完全就比較是否有重復(fù)字符串,是比較不出來的,二是字符串比較內(nèi)容是否相同要用equals函數(shù)而不是用雙等號==.
你的Java程序我?guī)湍愀暮昧?你看看吧.
package?找重復(fù);
public?class?string?{
public?static?void?main(String[]?args)?{
System.out.println("請輸入5個字符串:");
String[]?arr1=new?String[5];
java.util.Scanner?sc=new?java.util.Scanner(System.in);
for(int?i=0;iarr1.length;i++){
arr1[i]=sc.nextLine();
}
for(int?i=0;iarr1.length;i++){
for(int?j=i+1;jarr1.length;j++){
if(arr1[i].equals(arr1[j])){
System.out.println(arr1[i]);
}
}
}
}
}
運行結(jié)果
請輸入5個字符串:
we
are
the
world
the
the
在Java中,有如下代碼,
我真不知道樓上是怎么測試的?。。。?!考慮東西一點都不全面,太過短視了?。。。?!
答案是: A 、C
是復(fù)選的答案!經(jīng)過測試得出的結(jié)果?。?!
B和D答案編譯都通過不了!
現(xiàn)在說一下why!
子類對象如果想正確初始化,需要先初始化父類對象,這個是規(guī)則,可以死記!
這道題改一下你就能更好的理解,請看:
public class Animal {
private String yanjing;
private String erdou;
public Animal(String yanjing,String erdou){
this.yanjing = yanjing;
this.erdou =erdou;
System.out.println("奧名");
}
}
public class Dog extends Animal {
private String yachi;
public class Dog extends Animal {
private String yachi;
public Dog(String yanjing,String erdou,String yachi){
super(yanjing,erdou);
this.yachi = yachi;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Dog dog = new Dog("眼睛","耳朵","牙齒");
}
}
父類中多了兩個屬性,眼睛和耳朵,子類中多了一個屬性,也是自己特有的牙齒屬性。
按照先前的規(guī)則,子類要初始化需先初始化父類??创a:
public Dog(String yanjing,String erdou,String yachi){
super(yanjing,erdou);
this.yachi = yachi;
}
這段是子類的構(gòu)造方法,其中super關(guān)鍵字有兩種用法,用來顯式的調(diào)用父類中的方法和在構(gòu)造方法中的用法,這里就是super使用在構(gòu)造方法中的例子,super在構(gòu)造方法中可以調(diào)用父類的構(gòu)造方法。
分享文章:關(guān)于java中的大佛代碼的信息
轉(zhuǎn)載來源:http://www.dlmjj.cn/article/hoiojh.html