周強 201771010141 《面向對象程序設計(java)》第七周學習總結
實驗目的與要求
(1)進一步理解4個成員訪問權限修飾符的用途;
(2)掌握Object類的常用API用法;
(3)掌握ArrayList類用法與常用API;
(4)掌握枚舉類使用方法;
(5)結合本章知識,理解繼承與多態性兩個面向對象程序設計特征,並體會其優點;
(6)熟練掌握Java語言中基於類、繼承技術構造程序的語法知識(ch1-ch5);
(7)利用已掌握Java語言程序設計知識,學習設計開發含有1個主類、2個以上用戶自定義類的應用程序。
一:理論部分。
1.繼承。
1)繼承建立了類與類的關系,同時也是多態特征的前提。
java只支持單繼承,不支持多繼承(避免兩個父類出現同名方法的調用選擇困難)
“is-a”關系是繼承的一個明顯特征。
2)多態:在程序中同一符號在不同情況下有不同解釋。
在Java中,子類數組的引用可以轉換成超類數組的引用,而不需要采用強制類型轉換。
3)final類和方法:final類不允許被繼承(不能做父類)
String類是一個final類的例子(故該類不能被擴展)
父類可以直接引用子類,而子類不能直接父類(必須進行強制轉換類型),。咋進行強制轉換類型前,先檢查是否能夠成功轉換,使用instanceof操作符實現。
super主要有兩種用法:
1.super.成員變量/super.成員方法;
2.super(parameter1,parameter2....)
第一種用法主要用來在子類中調用父類的同名成員變量或者方法;第二種主要用在子類的構造器中顯示地調用父類的構造器,要註意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。
4)抽象類:一個類一定被定義成抽象類,他就是一個專職父類。不能實例化,即不能創建對象,只能產生子類。
5)受保護訪問:如果希望超類的某些方法或域被子類訪問,就需在給超類定義時,將這些方法或域聲明為protected。
Java中用於控制可見性的4個訪問修飾符:
1.僅對本類可見:private
2.對所有類可見:public
3.對本包和所有子類可見:protected
4.對本包可見:默認,不需要修飾符。
2.object類:所有類的超類。
1)equals方法:檢測一個對象是否等於另外一個對象。如果兩個對象具有相同的引用,那麽他們一定相等。
2)equals方法具有以下特性:
自反性、對稱性、傳遞性、一致性
3.hashCode方法(散列碼):由對象導出的一個整型值。
散列碼可以是任意整數。兩個相等的對象要求返回相等的散列碼。
4.枚舉類:比較兩個枚舉類型值是,不用equals,直接用“==”。所有枚舉類都是Enum類的子類。其中toString方法能夠返回枚舉常量名。
每個枚舉類都有一個靜態values方法,它將返回一個包含全部枚舉值的數組。
實驗部分。
實驗1
補充以下程序中主類內main方法體,以驗證四種權限修飾符的用法。
public class Test1 {
public static final String e2 = null;
public static final String e3 = null;
public static final String e4 = null;
private String t1 = "這是TEST1的私有屬性";
public String t2 = "這是TEST1的公有屬性";
protected String t3 = "這是TEST1受保護的屬性";
String t4 = "這是TEST1的默認屬性";
private void test1() {
System.out.println("我是TEST1用private修飾符修飾的方法");
}
public void test2() {
System.out.println("我是TEST1用public修飾符修飾的方法");
}
protected void test3() {
System.out.println("我是TEST1用protected修飾符修飾的方法");
}
void test4() {
System.out.println("我是TEST1無修飾符修飾的方法");
}
}
public class Test2 extends Test1{
private String e1 = "這是TEST1的私有屬性";
public String e2 = "這是TEST1的公有屬性";
protected String e3 = "這是TEST1受保護的屬性";
String e4 = "這是TEST1的默認屬性";
public void demo1() {
System.out.println("我是TEST2用public修飾符修飾的方法");
}
private void demo2() {
System.out.println("我是TEST2用private修飾符修飾的方法");
}
protected void demo3() {
System.out.println("我是TEST2用protected修飾符修飾的方法");
}
void demo4() {
System.out.println("我是TEST2無修飾符修飾的方法");
}
}
public class Main {
public static void main(String[] args) {
Test2 test2 = new Test2();
/*在下面分別調用 demo1 demo2 demo3 demo4 test1 test2 test3 test4方法
和t1 t2 t3 t3 e1 e2 e3 e4屬性,好好理解繼承和權限修飾符的用法與區別*/
Test1 test3 = new Test2();
((Test2) test3).demo1();
((Test2) test3).demo3();
((Test2) test3).demo4();
test3.test2();
test3.test3();
test3.test4();
System.out.println(test3.t2);
System.out.println(test3.t3);
System.out.println(test3.t4);
}
}
第五章測試程序反思,繼承知識總結。
測試程序1:
? 編輯、編譯、調試運行教材程序5-8、5-9、5-10(教材174頁-177頁);
? 結合程序運行結果,理解程序代碼,掌握Object類的定義及用法;
程序如下:
EqualsTest類:
/** * This program demonstrates the equals method. * @version 1.12 2012-01-26 * @author Cay Horstmann */ public class EqualsTest//主類 { public static void main(String[] args) { Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15); Employee alice2 = alice1; Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15); Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); System.out.println("alice1 == alice2: " + (alice1 == alice2)); System.out.println("alice1 == alice3: " + (alice1 == alice3)); System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); System.out.println("alice1.equals(bob): " + alice1.equals(bob)); System.out.println("bob.toString(): " + bob); Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15); Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); boss.setBonus(5000);//在子類中Bouns賦初值為空,主類中用更改器更改為5000 System.out.println("boss.toString(): " + boss); System.out.println("carl.equals(boss): " + carl.equals(boss)); System.out.println("alice1.hashCode(): " + alice1.hashCode()); System.out.println("alice3.hashCode(): " + alice3.hashCode()); System.out.println("bob.hashCode(): " + bob.hashCode()); System.out.println("carl.hashCode(): " + carl.hashCode()); } }
Employee類:
import java.time.*; import java.util.Objects; public class Employee//用戶自定義類 { private String name; private double salary; private LocalDate hireDay; //創建三個私有屬性 public Employee(String name, double salary, int year, int month, int day) { this.name = name; this.salary = salary; hireDay = LocalDate.of(year, month, day); } public String getName() { return name; } public double getSalary() { return salary; } public LocalDate getHireDay() { return hireDay; } //訪問器 public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; }//定義兩個局部變量 public boolean equals(Object otherObject) { //快速測試幾個類的根是否相同,即是否是同一個超類。這個if語句判斷兩個引用是否是同一個,如果是同一個,那麽這兩個對象肯定相等。 if (this == otherObject) return true; //如果顯式參數為空必須返回false if (otherObject == null) return false; //用getclass()方法得到對象的類。如果幾個類不匹配,則它們不相等 if (getClass() != otherObject.getClass()) return false; //其他對象是非空Employee類 //在以上判斷完成,再將得到的參數對象強制轉換為該對象,考慮到父類引用子類的對象的出現,然後再判斷對象的屬性是否相同 Employee other = (Employee) otherObject; //測試字段是否具有相同的值 return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay); } public int hashCode()//重寫hashcode方法,使相等的兩個對象獲取的HashCode也相等 { return Objects.hash(name, salary, hireDay); } public String toString()//把其他類型的數據轉為字符串類型的數據(toString方法可以自動生成) { return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay + "]"; } }
Manager類:
public class Manager extends Employee//子類:Manager類繼承Employee類 { private double bonus;//創建私有屬性bouns public Manager(String name, double salary, int year, int month, int day) { super(name, salary, year, month, day);//子類直接調用超類中已創建的屬性 bonus = 0;//給bouns賦初值為空 } public double getSalary()//訪問器 { double baseSalary = super.getSalary(); return baseSalary + bonus; } public void setBonus(double bonus)//更改器 { this.bonus = bonus; } public boolean equals(Object otherObject)////快速測試幾個類的根是否相同,即是否是同一個超類 { if (!super.equals(otherObject)) return false; Manager other = (Manager) otherObject; //使用super.equals檢查這個類和其他是否屬於同一個類 return bonus == other.bonus; } public int hashCode()//重寫hashcode方法,使相等的兩個對象獲取的HashCode也相等 { return java.util.Objects.hash(super.hashCode(), bonus); } public String toString()//把其他類型的數據轉為字符串類型的數據(toString方法可以自動生成) { return super.toString() + "[bonus=" + bonus + "]"; } }
實驗結果:
測試程序2:
? 編輯、編譯、調試運行教材程序5-11(教材182頁);
? 結合程序運行結果,理解程序代碼,掌握ArrayList類的定義及用法;
程序如下:
ArrayListTest類:
import java.util.*;
/**
* This program demonstrates the ArrayList class.
* @version 1.11 2012-01-26
* @author Cay Horstmann
*/
public class ArrayListTest//主類
{
public static void main(String[] args)
{
//用三個Employee類填充staff數組列表
ArrayList<Employee> staff = new ArrayList<>();//動態數組,可以靈活設置數組的大小
staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15));
staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1));
staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15));
//將每個人的薪水提高5%
for (Employee e : staff)
e.raiseSalary(5);
//打印出所有Employee類的信息
for (Employee e : staff)
System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay="
+ e.getHireDay());
}
}
測試程序3:
? 編輯、編譯、調試運行程序5-12(教材189頁);
? 結合運行結果,理解程序代碼,掌握枚舉類的定義及用法;
import java.util.*;
/**
* This program demonstrates enumerated types.
* @version 1.0 2004-05-24
* @author Cay Horstmann
*/
public class EnumTest//主類
{
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) ");
String input = in.next().toUpperCase();//字符串轉換為大寫
Size size = Enum.valueOf(Size.class, input);
System.out.println("size=" + size);
System.out.println("abbreviation=" + size.getAbbreviation());
if (size == Size.EXTRA_LARGE)
System.out.println("Good job--you paid attention to the _.");
}
}
enum Size//枚舉類型(都是enum的子類)
{
SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");//傳入參數
private Size(String abbreviation) { this.abbreviation = abbreviation; }
public String getAbbreviation() { return abbreviation; }
private String abbreviation;
}
實驗3:采用個人賬號登錄https://pintia.cn/,完成《2018秋季西北師範大學面向對象程序設計(Java)(ch1-ch5)測試題2》,測試時間60分鐘;
實驗4: 課後完成實驗3未完成的測試內容。
實驗總結:進一步驗證了繼承有關的知識,在調試代碼的過程中理解了Object中equals方法、hashCode方法、toString方法的用法,面向對象程序設計是由繼承、多態、封裝組成;通過實驗一的驗證中再一次理解了子類繼承父以及受保護訪問權限的具體使用過程;在幾次實驗當中找到自己許多不足點,自主編程能力太差對Java這門功課努力不夠,程序錯誤太多,以後繼續努力加油吧。
周強 201771010141 《面向對象程序設計(java)》第七周學習總結