《JAVA 技術》第二次作業
一、學習要點
認真看書並查閱相關資料,掌握以下內容:
理解對象的創建與引用的關系
掌握構造方法的重載
掌握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 技術》第二次作業