《Java技術》第二次作業--面向對象基礎
(一)學習總結
1.什麽是構造方法?什麽是構造方法的重載?下面的程序是否可以通過編譯?為什麽?
public class Test {
public static void main(String args[]) {
Foo obj = new Foo();
}
}
class Foo{
int value;
public Foo(int intValue){
value = intValue;
}
}
構造方法:沒有返回值,名字與類名相同,當創建對象時會調用構造方法(如果沒有寫構造方法,那麽編譯器會自動添加無參構造方法);
構造方法的重載:當有多個構造方法時(無參,有參,以及參數不同的多種構造方法)會用到構造方法的重載;
該程序不能通過編譯。因為定義了有參的構造方法,在編譯時編譯器不會再自動創建無參構造方法,而在調用構造方法時卻又想調用無參構造方法;
解決辦法:手動創建無參構造方法。
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;
}
結果:運行錯誤;
原因:創建了對象數組後沒有對數組每一個元素分別進行實例化。
解決方法:arr[1]=new MyClass();arr[1].value=100;
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;
}
結果:false;
原因:每次實例化一個對象時,系統會分配一塊內存地址給這個對象,用==判斷的時候時是判斷的地址,因為兩個對象的地址不同,所以它們不會相等。
4.什麽是面向對象的封裝性,Java中是如何實現封裝性的?試舉例說明。
封裝性:封裝性是指有些信息是封閉的,並不是所有人都可以看到;
封裝性的實現:Java的封裝是通過private修飾符來聲明屬性和方法實現的;
例子:
public class Date {
private int year;
public int month;
public int day;
}
這個Date類裏面的year是封裝的,當你定義一個對象Date d=new Date();,關於對象d,可以使用d.month和d.day;但是不能使用d.year;
5.閱讀下面程序,分析是否能編譯通過?如果不能,說明原因。
(1)
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();
}
}
編譯不能通過,以為x不是static類型的,所以不能再static類型的 method裏面用;
解決方法:在x前面加static。
6.使用類的靜態變量和構造方法,可以跟蹤某個類創建的對象個數。聲明一個圖書類,數據成員為編號,書名,書價,並擁有靜態數據成員冊數記錄圖書的總數。圖書編號從1000開始,每產生一個對象,則編號自動遞增(利用靜態變量和構造方法實現)。下面給出測試類代碼和Book類的部分代碼,將代碼補充完整。
class Book{
int bookId;
String bookName;
double price;
static int x;// 聲明靜態變量
static{
x=1000; // x=0;//定義靜態代碼塊對靜態變量初始化
}
public Book(String bookName,double price) {//構造方法
this.bookName=bookName;
this.price=price;
this.bookId=x;
x++;
}
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 x-1000;
}
public String toString() { //重寫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。
單例模式:核心結構中只包含一個被稱為單例的特殊類。
特點:通過單例模式可以保證系統中,應用該模式的類一個類只有一個實例。即一個類只有一個對象實例。
public class Sun{
private static Sun instance=null;
public static synchronized Sun getInstance(){
if(instance==null){
instance=new Sun();
}
return instance;
}
private 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;
原因:char型傳遞的是地址,所以結果會改變,而String在傳遞的時候是新建了一個地址來儲存要傳遞的內容,新地址的內容發生改變,原地址的不會發生改變;
(二)實驗總結
1.用面向對象思想完成評分系統
程序設計思路:輸入選手數,評委數,然後輸入選手信息,讓所有評委對輸入的選手進行打分,打完分之後將結果排序,去掉最高分和最低分,在算出平均分,將最終的平均分傳到選手的信息中,作為選手的成績;
問題1:不了解封裝性的意思,錯誤的以為不能再封裝裏面進行任何的信息輸入;
解決方法:在評委類裏面輸入打分數據;
2.Email驗證
這個題沒問題。
3.查找子串
這個題沒問題。
4.統計文件
問題1:對於一些特殊的情況,考慮的不夠全面,比如當一個文件名裏面包含多個‘.‘;
解決方法:這種情況下我們需要找到最後一個‘.‘,然後去這‘.‘後面的東西,用一個循環來處理不停的查找‘.‘,然後去‘.‘後面的內容,知道該內容裏面不含有‘.‘;
5.類的設計
問題1:將兩個類之間建立聯系;
解決方法:兩個類之間互相建立對方的對象,然後進行調用;
例如:d[i].getE()[c].toString();d為Department類的對象,而getE()為Employee類的函數;
https://gitee.com/jiamusi/java-hebau/tree/master/daima
《Java技術》第二次作業--面向對象基礎