2017年9月14日 星期四

[java教學] java物件的建立與呼叫

在座是資工系背景的各位沒有人不熟"物件導向"這個名詞的

他牽著很多人完成了各項的事業。

(其他大神,請略過)

簡單介紹java的物件

一個類別在建立之前,我們稱他為藍圖,如果這時候有呼叫內部的屬性或是其他方法,編譯器就會拋出錯誤。
類別建立之後,他就是一個物件,他帶有建構子,就算你沒有把建構子寫出來,編譯器在編譯程式碼之後,會自動把建構子加上去。

畫紅線的地方就是建立物件的程式碼。



這是經過專門的軟體反編譯之後出來的原始碼。
從圖片上,很容易可以看出來,編譯器運作後,把建構子加了上去。



我們可以自行加入建構子,編譯器看到了我們有自己加了,他就不會再幫忙了。



這是反編譯後的結果,很清楚的可以觀察到我們自己加的建構子。


一般的沒有建立物件,會導致編譯器拋出錯誤。
下圖就是缺少了Demo d = new Demo(); 這行
事實上,這行的d,可以被改成其他的英文,完全不會影響整個程式碼,因為這個是讓物件命名成我們想要的名字。



物件建立之後,我們就可以利用他的物件名稱來對物件內部的屬性及其他方法進行呼叫。
利用物件的代稱d,來存取整個Demo這個物件裡面的屬性。
d.a 中間這個點,即是存取的意思。



假設,我們根本不想要建立物件這行程式碼,但是我們想存取他裡面的屬性,可不可以?
當然可以,但是要怎麼做?

我們在屬性那行前面增加static即可。再把d.a改成Demo.a,直接呼叫類別的名字來存取,就好了。

如下圖。



這是類別裡面的方法,建立物件即可呼叫method。



不加上建立物件的該行程式碼,但只要把類別寫上去,把方法前面加上static,即可大功告成。



接著,就是帶參數的建構子。
如圖所示。
建立物件之後,把1與2數字分別帶入。



帶參數的方法。




現在來說明一下多類別的物件。
建立第二個物件,編譯器也會自動加入建構子。



跟前面的相同,加上static後,就可以直接呼叫。



物件導向的東西就說到這邊為止,有興趣的讀者,可繼續到其他地方慢慢深入了解。


有著作權,請勿任意轉載。若要分享,請註明本篇來源。


[java程式語言] 分析輸出字串的調用

各位對Java程式語言不陌生,資工系的相關同學也應該都寫過,但是至於字串的調用,不知道各位知道嗎?

本篇要講解一個算是深度文。
(其他大神,請略過)

這是原始碼


這是編譯後的class檔案內部


我們把這16進位轉換成字串,方便觀察。

下圖是轉碼後的資訊。

有些字串很明顯,調用了四大基本檔案

Object.java
System.java
PrintStream
String.java

這四大檔案來說,其實以這篇文章的原始碼來說,String.java只是輔助而已,不算在內。

我們來看一下這四大檔案的過程。

因為Object只是讓Demo這個類別名稱可以釋放出檔案。
所以本檔案就不太需要詳細說明。



首先,先看System.java    他調用了PrintStream  out這個


再來,我們可以追查到這行。下圖。


checkIO()函數先出現,setOut0(out)後出現

下圖就是checkIO()的方法method
至於裡面是什麼現在對java的新手還並不是太重要。
知道是逆向觀察調用的東西就好。

再來,private static mative void setOut0那行也就是他的方法。


System.out 探討到這邊先結束,繼續向println前進。
觀察一下另外一個檔案。
下圖很明顯,PrintStream.java   裡面調用了println(String x)
參數


至於String.java
這邊的valueOf只是輔助而已,對於本篇的程式碼,沒有太大影響。


Java的字串調用,就講解到這邊為止。

有興趣,請自己慢慢分析。



有著作權,請勿任意轉載。若要分享,請註明本篇來源。


[Java編譯教學] java程式語言 編譯教學

本小編的作業系統為Windows 10
這邊就以Win10來講解。

(其他大神,請略過)

在寫Java程式語言之前,請先到Oracle甲骨文官網下載安裝Java相關安裝檔。

安裝後,請在windows下,把Java環境設定完成,以便執行後續的動作。

打開你自己的Cmd命令字元,或是PowerShell,win10系統以PowerShell為主。

這邊是我的java版本。


如果編譯器有安裝完全,下面javac命令就能正常執行。



我先以簡單的程式碼來說明,程式碼現在不是重點,重點是編譯系統。

這是我的Sublime 程式碼編輯器的版本


這是我的原始碼



我們來開啟Powershell,其他人要開cmd也可以,道理都通。
題外話:(Powershell的命令功能會比cmd來得更多)

我把PS目錄轉至桌面。


接下來,就是我們的編譯開始。
我們看一下類別名稱

我這邊class name是Demo,大寫的D,那檔案名稱就要跟類別一樣,不然編譯器他找不到進入點的。

我們開始把java檔編譯處理。
輸入這樣的指令很正常的,但是一定拋出錯誤。

因為我們有在程式碼裡面,輸出的東西是中文字。
一個中文字佔2Bytes,1個英文字母佔1Byte
這樣會造成亂碼,導致該行的中文字成為不明字元,編譯系統就無法判斷了,因此在編譯過後就拋出錯誤。


這就是編譯錯誤的結果



那要如何編譯成功呢?

就是要增加相關編碼指令

指令: javac -encoding utf8
後面就是你存在的進入點檔案名稱(含副檔名)


-encoding 這個指令 就是能夠調整編碼的指令。
utf8 就是編碼系統。

輸入之後,編譯成功,沒拋出任何錯誤。然後產生了class檔
這也證明了 這個檔案是類別

假設一個java檔案內部有寫很多類別的話,產生出來的檔案也會很多,裡面有幾個類別,產生出來的就是幾個檔案,依此類推。

有個重點,就是如果java檔案內,有寫不帶名稱的類別(匿名類別),那麼產生出來的檔案名稱就是在該檔案名稱後面加入"$"的符號。


我們現在讓他執行。
執行的命令: java xxx
xxx就是檔名
java後面加上檔名即可。

中文字正常輸出。





有著作權,請勿任意轉載。若要分享,請註明本篇來源。


Ollydbg 2.01 繁體中文版

Ollydbg 2.01 繁體中文版 Ollydbg 2.01 繁體中文版下載: Mega:   https://mega.nz/#!I2Qy1aQD!-T5zO3PaANjBHU73I4NlkY8SHMxRptbBV8TpmeFt1fo GD: h...