1. 程式人生 > >《JAVA 技術》第二次作業

《JAVA 技術》第二次作業

ase 思想 程序 for循環 想法 內部類 內容 類的設計 get

一、學習要點

認真看書並查閱相關資料,掌握以下內容:

理解對象的創建與引用的關系
掌握構造方法的重載
掌握String類
掌握類的設計方法
掌握this關鍵字
掌握static關鍵字
理解引用傳遞並掌握基本應用
掌握單例模式
理解內部類
二、作業要求

發布一篇隨筆,主要包括以下幾部分的內容:

(一)學習總結

1.什麽是構造方法?什麽是構造方法的重載?下面的程序是否可以通過編譯?為什麽?

public class Test {
    public static void main(String args[]) { 
       Foo obj = new Foo();       
    }     
}
class Foo{
    int value;
    public Foo(int intValue){
        value = intValue;
    }
}

<1>構造方法是完成對對象初始化的方法,一般應為public,定義格式為:public 類名(參數表),也可以定義無參的構造方法,不定義構造方法時,系統會自動生成一個無參的構造方法(註意:已編寫了構造方法時,系統就不會自動生成)
<2>構造方法的重載是表示構造方法可以有多個,但是參數表應不同,當參數表也相同時,會報錯
<3>不可以,已經定義了一個含一個參數的構造方法,系統將不會再生成一個無參的構造方法,並且Foo類中也沒有無參的構造方法,所以當Test類調用Foo的無參構造方法會報錯

2.運行下列程序,結果是什麽?分析原因,應如何修改。

public class Test {
    public static void main(String[] args) {
        MyClass[] arr=new MyClass[3];
        arr[1].value=100;
    }
}
class MyClass{
    public int value=1;
}

結果如下:
技術分享圖片
提示是說在第四行有空指針異常的問題,
原因:
對象數組內的元素沒有實例化,對象數組內的每一個元素都是一個對象,都需要單獨實例化
修改:

public class Test {
       public static void main(String[] args) {
           MyClass[] arr=new MyClass[3];
           for(int i=0;i<arr.length;i++) {
               arr[i]=new MyClass();
           }
           arr[1].value=100;
           System.out.println(arr[1].value);//測試語句
       }
}

測試結果:
技術分享圖片

3.運行下列程序,結果是什麽?說明原因。

public class Test {
    public static void main(String[] args) {
        Foo obj1 = new Foo();
        Foo obj2 = new Foo();
        System.out.println(obj1 == obj2);
    }
}
class Foo{
    int value = 100;
}

結果:
技術分享圖片
原因:因為obj1和obj2中存的是引用的地址,obj1和obj2是兩個不同Foo類型的對象,兩個引用地址當然不一樣,所以返回的是false,應該做比較的是obj1的屬性value中所存的值和obj2的屬性value中所存的值
修改:

public class Test {
    public static void main(String[] args) {
        Foo obj1 = new Foo();
        Foo obj2 = new Foo();
        System.out.println(obj1.value==obj2.value);
    }
}

測試結果:
技術分享圖片

4.什麽是面向對象的封裝性,Java中是如何實現封裝性的?試舉例說明。
<1>將成員變量定義好了以後,不能在類外隨意改變,保護了對象本身數據,而其他對象則通過該對象的訪問方法與之聯系
<2>要對數據進行封裝一般用private關鍵字來聲明屬性,再用屬性相應的getter和setter方法獲取和設置
<3>構造方法實現對象的初始化封裝
舉例:
例如:銀行存款,其存款、余額屬性應該由其對象自己來處理,所以不能用public聲明,應定義為private的,這樣只能在初始化和調用setter方法時才能對數據進行更改,保護了數據本身

import java.util.Scanner;
import java.util.Scanner;
class Chuzhi {
       private int deposit;//存款
       private int blance;//余額
       public Chuzhi(int deposit) {
           this.deposit=deposit;
           this.blance=deposit;
       }
    public void setdeposit(int despoit) {
           this.deposit=deposit;
       }
       public int getdeposit() {
           return deposit;
       }
       public void setblance(int draw) {
           if(draw>blance)
               System.out.println("false");
           blance =blance-draw;
       }
       public int getblance() {
           return blance;
       }
}

public class Test {

    public static void main(String[] args) {
        Chuzhi a = new Chuzhi(200);//初始存款200
         Scanner in = new Scanner(System.in);
         int draw = in.nextInt();
         a.setblance(draw);
         System.out.println("余額:"+a.getblance());

    }

}

結果:
技術分享圖片

5.閱讀下面程序,分析是否能編譯通過?如果不能,說明原因。

class A{
    private int secret = 5;
}
public class Test{
    public static void main(String args[]){
        A a = new A();
        System.out.println(a.secret++);
    }
}

不能,因為secret屬性是private的不能在類外直接進行修改
(2)

public class Test{
    int x = 50;
    static int y = 200;
    public static void method(){
        System.out.println(x+y);
    }
    public static void main(String args[]){
        Test.method();
    }
}

不能,因為static聲明的方法是靜態方法,其中操作的變量只能是static聲明的靜態變量
6.使用類的靜態變量和構造方法,可以跟蹤某個類創建的對象個數。聲明一個圖書類,數據成員為編號,書名,書價,並擁有靜態數據成員冊數記錄圖書的總數。圖書編號從1000開始,每產生一個對象,則編號自動遞增(利用靜態變量和構造方法實現)。下面給出測試類代碼和Book類的部分代碼,將代碼補充完整。

class Book{
    int bookId;
    String bookName;
    double price;
    // 聲明靜態變量
    static int num;
    //定義靜態代碼塊對靜態變量初始化
       static {
       num=1000;
    }
    //構造方法
        public Book(String bookName,double price) {
        this.bookName=bookName;
        this.price=price;
        bookId=num;
        num++;
    }
     public String getBookName() {
        return bookName;
    }
    public void setBookName(String bookName) {
        this.bookName = bookName;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }  
    //定義方法求圖書總冊數
    public static int totalBook() {
        return num-1000;
    }
    //重寫toString方法
    public String toString() {
        return "編號:"+bookId+" 書名:"+bookName+" 價格"+price;
    }
}
public class Test{
    public static void main(String args[]){ 
        Book[] books = {new Book("c語言程序設計",29.3),
                        new Book("數據庫原理",30),
                        new Book("Java學習筆記",68)};
        System.out.println("圖書總數為:"+ Book.totalBook()); 
        for(Book book:books){
            System.out.println(book.toString());
        }
    }   
}

運行結果:
技術分享圖片

7.什麽是單例設計模式?它具有什麽特點?用單例設計模式設計一個太陽類Sun。
在整個程序運行期間,針對該類只生成一個實例對象
特點:整個程序運行期間只存在一個實例對象

 class Sun {
    private static Sun sun = new Sun();//定義一個私有成員對象
    private Sun() {}//構造方法私有化
    public static Sun getsun() {
        return sun;
    }
}

8.理解Java參數傳遞機制,閱讀下面的程序,運行結果是什麽?說明理由。

public class Test {
    String str = new String("你好  ");
    char[] ch = { ‘w‘,‘o‘,‘l‘,‘l‘,‘d‘ };
    public static void main(String args[]) {
        Test test = new Test();
        test.change(test.str, test.ch);
        System.out.print(test.str);
        System.out.print(test.ch);
    }
    public void change(String str, char ch[]) {
        str = "hello";
        ch[0] = ‘W‘;
    }
}

結果:你好 Wolld
理由:
9.其他需要總結的內容。
內部類
<1>運行外部類時,內部類也生成一個.class文件
<2>可以直接在外部類訪問,也可以在其他類中調用
<3>方法內部類也稱局部內部類
(二)實驗總結

本次實驗包括實驗二和實驗三兩次的內容:
1.用面向對象思想完成評分系統
程序設計思路:
<1>定義三個類,Competitor(選手類)、Score(評分類)、Test(測試類)
<2>Competitor類在創建時加一個comepareTo接口,成員屬性有編號、選手姓名、選手最終的成績以及他們相應的getter和setter方法、返回選手基本信息的toString方法,還有comepareTo方法;Score類定義評委人數,和分數數組用來存放每位評委打的分,方法有他們對應的setter和getter方法、錄入成績的方法、求平均、求最大值、求最小值的方法,錄入成績方法的參數是一個double類型的數據+下標。采用一層循環來找到最大值和最小值,在求平均中調用,先求出所有評委給出的分的sum,再減去max和min,除以(總評委數-2);Test類先讓用戶輸入選手人數和評委人數,再依據此來創建對象數組,並錄入數據和調用
問題:出現空指針異常問題
原因:原因是沒有將對象數組實例化
解決方案:在循環中將對象數組中的對象一一實例化
2.Email驗證
程序設計思路:
<1>先讓用戶輸入email地址
<2>利用Boolean型的判斷方法,來判定是否有效,有效返回true
<3>判斷方法:
將String字符串利用toCharArrays()的方法拆分成字符數組,判斷第一個是否為@,如果是返回false
定義兩個Boolean類型的變量初始值均為false,創建一個for循環,循環體為:如果字符數組第i個元素為" . ",則將第一個變量置為true,如果為“ @ ”,則將第二個置為true,判斷:如果第一個變量為true並且第二個為false,則返回false,如果第一個變量為true並且第二個變量也為true,則跳出循環
則@不存在,if temp2=0,則有可能‘.’不存在,或者‘.’在@之前,此想法錯誤
原因:若email地址為145@[email protected],則程序會出錯
解決方案:改為現在的方法
問題<2>:在比較用點拆分的字符數組的最後一個元素是否符合規定時,用了“==”比較
原因:字符比較不能用“==”,這樣比較的是引用
解決方案:改為equals方法
3.查找子串
程序設計思路:
<1>得到原始字符串,將原始字符串中的所有子串全部用空串替換
<2>計算原始字符串的長度和更改後的字符串長度以及子串長度
<3>最後返回(原始字符串的長度-更改後字符串的長度)/子串長度
問題:無
4.統計文件
程序設計思路:
<1>讓用戶自己輸入文件字符串,按“,”拆分成字符數組
<2>java中提供了upper和lower方法來實現大小寫轉換,所以將字符數組中每一個元素的第一位截取出來並用Upper方法轉為大寫,再加上從第一位往後的所有字符,賦值給這個元素
<3>將被按“,”拆分後的文件名,再按“.”拆分,將最後一個元素存入kind數組
<4>再定義一個double數組為種類數數組,利用Arrays類的fill方法,將每一位都置為一,設置一個兩層循環,外層循環設置每一個種類的個數,內存循環來一一比較,當本次用來比較的類型不為null時,則發現相同的時,它對應的個數加一,並將相同的種類類名置為null
問題:第一次運行發現只對比了第一個的種類,其他的均為null
原因:equals方法用錯了
解決方案:改為equalsIgnoreCase方法
5.類的設計
程序設計思路:
<1>設置日期類、部門類、職工類、測試類
<2>日期類中定義3個int型變量year、month,day,在構造方法中直接定義賦值,並設置一個toString方法返回成日期格式
<3>職工類中定義編號、姓名、性別、工作部門4個String變量,還定義兩個日期類變量,均置空,生日和工作時間,構造方法中直接賦值,並寫一個toString方法返回職工基本信息
<4>部門類中定義部門編號、部門名稱兩個String的變量和一個職工類的變量manager
<5>測試類中定義一個職工類對象數組,並直接初始化,定義一個部門類的對象數組,經理為職工數組中的一個對象,控制好輸出格式
問題:對象數組不知道如何初始化
解決方案:通過查書得知,對象數組每個對象都需要單獨實例化
問題:對象數組中不知道怎麽初始化日期類
解決方案:設置一個日期類匿名對象
(三)代碼托管(務必鏈接到你的項目)
技術分享圖片

《JAVA 技術》第二次作業