按照上次的約定,本講我們將要學(xué)習(xí)有關(guān)object指向的知識了。
光名字都聽不懂啊。
可能聽起來比較難懂,但學(xué)起來卻是很簡單的。
.
1. 類與實例
首先讓我們從類與實例學(xué)起吧。
類好像在哪里聽說過。
小尼克糊涂了吧。到目前為止咱們學(xué)的程序的開頭都有“類”不是嗎?
??!是 嗎~
恩。我們一直在使用類,本講就要對類進(jìn)行一下說明了。
1.1. 類
首先要說明一下所謂的類就是程序里類似設(shè)計圖的東西。以設(shè)計圖為基準(zhǔn)來生成實例。
呃
用簡單易懂的車的例子來說明一下。車有設(shè)計圖曉得吧。
恩。根據(jù)設(shè)計圖把車制造出來。
不錯。也就是說,類相當(dāng)于設(shè)計圖,而實例相當(dāng)于制作完成的車。
從類(設(shè)計書)生成
實例(車)。
博士,在類里面具體都寫些什么呀?
類里面定義了要制作實例的結(jié)構(gòu)和動作。我們以車為例來學(xué)習(xí)object指向。下面先看車的類。
類 Car{
int number;//制造編號
String name;//名稱
String maker;//廠家
String color;//顏色
}
車類里有制造編號、名稱、廠家以及車顏色一系列的實例變量。
是的。上面的程序只是定義了車固有的數(shù)據(jù),對其進(jìn)行改良后就成為下面定義車的操作的方法。
類 Car{
int number;//制造編號
String name;//名稱
String maker;//廠家
String color;//顏色
/**
* 行走
**/
void run(){
//行走處理
}
/**
* 轉(zhuǎn)換方向
**/
void turn(int angle){
//轉(zhuǎn)向處理
}
}
增加了run()和turn()方法。
恩。就是在車類里面多了“行走”和“轉(zhuǎn)換方向”的操作。
1.2. 實例化
根據(jù)類這個設(shè)計圖制作實例被稱為實例化。下面就讓我們來看一下使用車類來制作車實例的例子。實例化利用下面的編碼進(jìn)行。
類名 實例名=new 類名;
以前學(xué)的模板的source code也用上了。
不錯。對車類進(jìn)行實例化按下面這樣書寫就可以了。
Car car = new Car();
這個車類的實例變量和方法怎么用呢?
要使用“.”。
實例名.變量名
實例名.方法名
下面的程序是訪問實例的方法的sample。車的行走處理和車的轉(zhuǎn)向處理就是在message panel里顯示字符串的東西。
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
* 車sample programme
*/
public 類 CarApp extends MIDlet {
/**
* 開始處理
*/
protected void startApp() throws MIDletStateChangeException {
//實例化
Car car = new Car();
//設(shè)定實例變量
car.number = 6684;
car.name = "";
car.maker = "NEC";
car.color = "blue";
//調(diào)用方法
car.run();
car.turn();
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
}
類 Car{
int number;//制造編號
String name;//名稱
String maker;//廠家
String color;//顏色
/**
* 行走
**/
void run(){
//行走處理
System.out.println(name + " is running!");
}
/**
* 轉(zhuǎn)換方向
**/
void turn(){
//轉(zhuǎn)向處理
System.out.println(name + " is turning.");
}
}
運(yùn)行程序,如下所示。
2. 封裝
2.1. public interface
這么說來,模板程序里面的“public”和“private”是帶有類、實例變量和方法的定義部分?這是什么意思呢?
哦,問的好啊。使用“public”和“private”是為了進(jìn)行封裝。
封裝…?
就舉車類的例子來看,要生成實例就要設(shè)定制造編號、名稱、廠家和車顏色。這樣生成的實例也是可以更改實例變量的。
是這樣的。
但是,制造編號、名稱以及廠家在車子被制造出來那一刻就是確定的,之后是不能變更的或者說不容易變更的。
制造編號是用來進(jìn)行車的管理的,如果途中隨便更改會增添麻煩。但是,只要制造者自己確定不變更的話就沒關(guān)系吧。
恩。也許吧。但是,如果programme規(guī)模大的話,就有可能涉及多人開發(fā)。這時若有人錯誤的隨便更改制造編碼,就會給別人造成大的麻煩。這樣的事情也是有的。
我沒有考慮到許多人一起做的情況。這么說“public”和“private”可以防止這樣的事情發(fā)生是嗎?
沒錯。使用“private”就禁止了從類外面訪問實例變量或方法。與之相反,若使用“public”則可以從類外面訪問實例變量和方法。使用“public”可以從類外面訪問的實例變量和方法被稱為public interface。車類的實例變量中只有顏色是后來可以變更的。
車可以被制造出來之后再涂顏色是吧。
2.2. 構(gòu)造器
生成實例時,要使用進(jìn)行初始化的構(gòu)造器方法。
??!以前用過啊。就是和類名相同名稱的方法吧。
對呀對呀。如下所示進(jìn)行定義。當(dāng)然作為public interface,為了能從外面訪問要加上“public”。
/**
* 構(gòu)造器
*/
public 類名(){
//初始化處理
}
車類的構(gòu)造器如下方式書寫。
/**
* 構(gòu)造器
*/
public Car(int number,String name,String maker,String color){
this.number = number;
this.name = name;
this.maker = maker;
this.color = color;
}
2.3. accessory method
但是,對實例變量使用“private”,那不就是不能看到實例變量了?如果想要使用變量值時怎么辦呢?
是啊。進(jìn)行private定義后,就不能看到值了。
正因為有這樣的不方便,所以就出現(xiàn)了解決方法,能看到值的accessory method。也就是可以訪問private變量的方法。車類的accessory method如下所示。
/*******************************************
* accessory method
*******************************************/
/**
* 取得顏色
*/
public String getColor() {
return color;
}
/**
* 取得廠家
*/
public String getMaker() {
return maker;
}
/**
* 取得名稱
*/
public String getName() {
return name;
}
/**
* 取得制造編號
*/
public int getNumber() {
return number;
}
/**
* 設(shè)定顏色
*/
public void setColor(String string) {
color = string;
}
真不錯!使用public interface就可以看到“private”的實例變量了。
不錯。下面的程序是封裝的類以及使用它的sample程序。
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
* 車sample pragramme
*/
public 類 CarApp extends MIDlet {
/**
* 開始處理
*/
protected void startApp() throws MIDletStateChangeException {
//實例化
Car car = new Car(6684,"java","NEC","blue");
//調(diào)用方法
car.run();
car.turn();
//涂顏色
System.out.println(car.getName() + "‘s color is " + car.getColor());
car.setColor("Red");//涂顏色
System.out.println(car.getName() + "‘s color is " + car.getColor());
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
}
類 Car{
private int number;//制造編號
private String name;//名稱
private String maker;//廠家
private String color;//顏色
/**
* 構(gòu)造器
*/
public Car(int number,String name,String maker,String color){
this.number = number;
this.name = name;
this.maker = maker;
this.color = color;
}
/**
* 行走
**/
public void run(){
//行走處理
System.out.println(name + " is running!");
}
/**
* 轉(zhuǎn)換方向
**/
public void turn(){
//轉(zhuǎn)向處理
System.out.println(name + " is turning.");
}
/*******************************************
* accessory method
*******************************************/
/**
* 取得顏色
*/
public String getColor() {
return color;
}
/**
* 取得廠家
*/
public String getMaker() {
return maker;
}
/**
* 取得名稱
*/
public String getName() {
return name;
}
/**
* 取得制造編號
*/
public int getNumber() {
return number;
}
/**
* 設(shè)定顏色
*/
public void setColor(String string) {
color = string;
}
}
程序運(yùn)行后結(jié)果如下。
3. 繼承
下面我們就對object指向編程中重要的繼承進(jìn)行說明。所謂的繼承,就是以某個類為基礎(chǔ)定義新的類。
什么意思啊…
確實繼承是object指向中比較難的概念之一。但是學(xué)會了就很簡單了。還以車為例進(jìn)行說明吧。
剛才的車類嗎。
恩。這次我們來用卡車作為新例子吧??ㄜ囈灿?#8220;制造編號”“名稱”“廠家”這些變量。
與車一樣啊。
除此之外為了對卡車運(yùn)輸?shù)奈锲愤M(jìn)行管理,又加入了“負(fù)荷”這個變量。
程序?qū)懗鰜硎沁@樣的。
類 Trailer{
private int number;//制造編號
private String color;//顏色
private String maker;//廠家
private String name;//名稱
private String cargo;//負(fù)荷
/**
* 構(gòu)造器
*/
public Trailer(int number,String name,String maker,String color,String cargo){
this.number = number;
this.name = name;
this.maker = maker;
this.color = color;
this.cargo = cargo;
}
/**
* 行走
**/
public void run(){
//行走處理
System.out.println(name + " is running!");
}
/**
* 轉(zhuǎn)換方向
**/
public void turn(){
//轉(zhuǎn)向處理
System.out.println(name + " is turning.");
}
/*******************************************
* accessory method
*******************************************/
/**
* 取得顏色
*/
public String getColor() {
return color;
}
/**
* 取得廠家
*/
public String getMaker() {
return maker;
}
/**
* 取得名稱
*/
public String getName() {
return name;
}
/**
* 取得制造編號
*/
public int getNumber() {
return number;
}
/**
* 設(shè)定顏色
*/
public void setColor(String string) {
color = string;
}
/**
* 取得負(fù)荷
*/
public String getCargo(){
return cargo;
}
/**
* 設(shè)定負(fù)荷
*/
public void setCargo(String cargo){
this.cargo = cargo;
}
}
卡車類和車類感覺一樣啊,是因為卡車是車的一種嗎?
觀察的不錯啊。當(dāng)然,卡車是車的一種。換一種說法,也就是把卡車進(jìn)行抽象化就是車。
抽選象化是指把類抽象化嗎?
差不多的意思吧。這個程序里面,車類和卡車類只是source code,并沒有表示“卡車抽象化之后就是車”這個概念。
恩,確實只看source code的話,并看不出來車與卡車的關(guān)系。
這就用到了“繼承”。以車類為基礎(chǔ)制作卡車類,就表示“卡車類的抽象概念即為車類”。繼承車類的卡車類的source code如下所示。繼承,需要使用構(gòu)造器調(diào)用繼承之類的構(gòu)造器 method。也就是下面第九行的super()。
類 Trailer extends Car{
private String cargo;//負(fù)荷
/**
* 構(gòu)造器
*/
public Trailer(int number,String name,String maker,String color,String cargo){
super(number,name,maker,color);//調(diào)用繼承之類的構(gòu)造器.
this.cargo = cargo;
}
/*******************************************
* accessory method
*******************************************/
/**
* 取得負(fù)荷
*/
public String getCargo(){
return cargo;
}
/**
* 積荷を設(shè)定する設(shè)定負(fù)荷
*/
public void setCargo(String cargo){
this.cargo = cargo;
}
}
呃?博士,卡車類里面只有負(fù)荷的實例變量嗎?其他的實例變量和方法是不是忘了?
呵,呵,呵。事實上,繼承類后,繼承的類的實例變量和方法就不需要再定義就可以使用了。
呃?也就是說雖然上面的程序里面沒有寫,但是卡車類里也具有車類里面的制造編號和名稱等變量?
不錯,就是這樣,很方便吧。下面就是使用了繼承車類的卡車類的sample programme。
import javax.microedition.midlet.MIDlet;
import javax.microedition.midlet.MIDletStateChangeException;
/**
* 車sample programme
*/
public 類 CarApp extends MIDlet {
/**
* 開始處理
*/
protected void startApp() throws MIDletStateChangeException {
//實例化
Trailer trailer = new Trailer(6684,"java-Trailer","NEC","blue","N820");
//調(diào)用方法
trailer.run();
trailer.turn();
//改變負(fù)荷
trailer.setCargo("N800");
System.out.println(trailer.getName() + "‘s cargo is " + trailer.getCargo());
}
protected void pauseApp() {}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {}
}
類 Trailer extends Car{
private String cargo;//負(fù)荷
/**
* 構(gòu)造器
*/
public Trailer(int number,String name,String maker,String color,String cargo){
super(number,name,maker,color);
this.cargo = cargo;
}
/*******************************************
* accessory method
*******************************************/
/**
* 取得負(fù)荷
*/
public String getCargo(){
return cargo;
}
/**
* 設(shè)定負(fù)荷
*/
public void setCargo(String cargo){
this.cargo = cargo;
}
}
類 Car{
private int number;//制造編號
private String name;//名稱
private String maker;//廠家
private String color;//顏色
/**
* 構(gòu)造者
*/
public Car(int number,String name,String maker,String color){
this.number = number;
this.name = name;
this.maker = maker;
this.color = color;
}
/**
* 行走
**/
public void run(){
//行走處理
System.out.println(name + " is running!");
}
/**
* 轉(zhuǎn)換方向
**/
public void turn(){
//轉(zhuǎn)向處理
System.out.println(name + " is turning.");
}
/*******************************************
* accessory method
*******************************************/
/**
* 取得顏色
*/
public String getColor() {
return color;
}
/**
* 取得廠家
*/
public String getMaker() {
return maker;
}
/**
* 取得名稱
*/
public String getName() {
return name;
}
/**
* 取得制造編號
*/
public int getNumber() {
return number;
}
/**
* 設(shè)定顏色
*/
public void setColor(String string) {
color = string;
}
}
這樣,誰看到source code都不會把程序弄錯了。これだと、誰がソースコードを見ても間違えずにプログラムできそうですね。
呵呵。明白Object指向多重要了吧。
上面程序運(yùn)行后的結(jié)果如下。
4. 下一講
本講講座幾乎沒有涉及Java技術(shù)。覺得怎么樣?
恩,對object了解一些了。但繼承有點難。
本講講的東西是object指向最基礎(chǔ)的東西。事實上,我們今后還要進(jìn)行更深入的學(xué)習(xí)。
明白了,下一講我們學(xué)什么呢?
下一講我們講動畫。學(xué)習(xí)怎樣使圖像在畫面上移動。
這可是制作游戲必須的呀。好期待…