王之泰201771010131《面向对象程序设计(java)》第七周学习总结
王之泰201771010131《面向對象程序設計(java)》第七周學習總結
第一部分:理論知識學習部分
第五章
第五章內容深度學習:
繼承:如果兩個類存在繼承關系,則子類會自動繼承父類的方法和變量,在子類中可以調用父類的方法和變量,如果想要在子類里面做一系列事情,應該放在父類無參構造器里面。
? ? ? ? ? ? ? ? ? 在java中,只允許單繼承,也就是說一個類最多只能顯示地繼承于一個父類。但是一個類卻可以被多個類繼承,也就是說一個類可以擁有多個子類。
java類不允許多繼承。原因:
1,當不同的父類存在相同屬性方法的時候,無法判定調用哪個。
2,由于子類實例化需要調用父類的無參構造器,無法識別是那個父類的構造器,
1.子類繼承父類的成員變量
當子類繼承了某個類之后,便可以使用父類中的成員變量,但是并不是完全繼承父類的所有成員變量。具體的原則如下:
1)能夠繼承父類的public和protected成員變量;不能夠繼承父類的private成員變量;
2)對于父類的包訪問權限成員變量,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對于子類可以繼承的父類成員變量,如果在子類中出現(xiàn)了同名稱的成員變量,則會發(fā)生隱藏現(xiàn)象,即子類的成員變量會屏蔽掉父類的同名成員變量。如果要在子類中訪問父類中同名成員變量,需要使用super關鍵字來進行引用。super.屬性名
2.子類繼承父類的方法
子類并不是完全繼承父類的所有方法。
1)能夠繼承父類的public和protected成員方法;不能夠繼承父類的private成員方法;
2)對于父類的包訪問權限成員方法,如果子類和父類在同一個包下,則子類能夠繼承;否則,子類不能夠繼承;
3)對于子類可以繼承的父類成員方法,如果在子類中出現(xiàn)了同名稱的成員方法,則稱為覆蓋,即子類的成員方法會覆蓋掉父類的同名成員方法。如果要在子類中訪問父類中同名成員方法,需要使用super關鍵字來進行引用。super.方法名
注意:隱藏和覆蓋是不同的。隱藏是針對成員變量和靜態(tài)方法的,而覆蓋是針對普通方法的。隱藏:調用的時候用誰的引用,則調用誰的版本。
3.構造器
子類是不能夠繼承父類的構造器,但是要注意的是,
如果父類的構造器只帶有參數(shù)的,則必須在子類的構造器中顯示地通過super關鍵字調用父類的構造器并配以適當?shù)膮?shù)列表,如果不想用super調用,那父類一定要有一個顯示聲明的無參構造器。
如果父類有無參構造器,則在子類的構造器中用super關鍵字調用父類構造器不是必須的,如果沒有使用super關鍵字,系統(tǒng)會自動調用父類的無參構造器。
4.super
super主要有兩種用法:
1)super.成員變量/super.成員方法;
2)super(parameter1,parameter2....)
第一種用法主要用來在子類中調用父類的同名成員變量或者方法;第二種主要用在子類的構造器中顯示地調用父類的構造器,要注意的是,如果是用在子類構造器中,則必須是子類構造器的第一個語句。
5.重寫父類的方法:
1)子類必須與父類使用相同的方法名、參數(shù)列表,
2)子類的訪問權限不能比父類的更嚴格
3)子類返回值類型<=父類的返回值類型的范圍
4)如果父類使用static修飾,則子類必須用static
5)如果父類的方法用了final,則子類不能重寫該方法
如果父類必須要自己的每一個子類都重寫自己的某個方法,則把父類的該方法寫成抽象的方法,則子類繼承的時候自動的重寫該方法。
重載:
在同一個類中存在同名的方法
1)重載方法名必須形同
2)參數(shù)列表必須不同
重構
重構就是通過調整程序代碼改善軟件的質量、性能,使其程序的設計模式和架構更趨合理,提高軟件的擴展性和維護性。總的來說就是代碼優(yōu)化。
多態(tài):
1)多態(tài)性是指相同的操作可作用于多種類型的對象上并獲得不同的結果。不同的對象,收到同一消息可以產(chǎn)生不同的結果,這種現(xiàn)象稱為多態(tài)性。
2)父類型的引用可以指向子類型的對象。
多態(tài)是面向對象的程序設計語言最核心的特征。多態(tài),意味著一個對象有著多重特征,可以在特定的情況下,表現(xiàn)不同的狀態(tài),從而對應著不同的屬性和方法。
第二部分:實驗部分
1、實驗目的與要求
(1)進一步理解4個成員訪問權限修飾符的用途;
(2)掌握Object類的常用API用法;
(3)掌握ArrayList類用法與常用API;
(4)掌握枚舉類使用方法;
(5)結合本章知識,理解繼承與多態(tài)性兩個面向對象程序設計特征,并體會其優(yōu)點;
(6)熟練掌握Java語言中基于類、繼承技術構造程序的語法知識(ch1-ch5);
(7)利用已掌握Java語言程序設計知識,學習設計開發(fā)含有1個主類、2個以上用戶自定義類的應用程序。
2、實驗內容和步驟
實驗1? 補充以下程序中主類內main方法體,以驗證四種權限修飾符的用法。
1 public class TEST1 { 2 private String t1 = "這是TEST1的私有屬性"; 3 public String t2 = "這是TEST1的公有屬性"; 4 protected String t3 = "這是TEST1受保護的屬性"; 5 String t4 = "這是TEST1的默認屬性"; 6 private void tese1() { 7 System.out.println("我是TEST1用private修飾符修飾的方法"); 8 } 9 public void tese2() { 10 System.out.println("我是TEST1用public修飾符修飾的方法"); 11 } 12 protected void tese3() { 13 System.out.println("我是TEST1用protected修飾符修飾的方法"); 14 } 15 void tese4() { 16 System.out.println("我是TEST1無修飾符修飾的方法"); 17 } 18 } 19 public class TEST2 extends TEST1{ 20 private String e1 = "這是TEST2的私有屬性"; 21 public String e2 = "這是TEST2的公有屬性"; 22 protected String e3 = "這是TEST2受保護的屬性"; 23 String e4 = "這是TEST2的默認屬性"; 24 public void demo1() { 25 System.out.println("我是TEST2用public修飾符修飾的方法"); 26 } 27 private void demo2() { 28 System.out.println("我是TEST2用private修飾符修飾的方法"); 29 } 30 protected void demo3() { 31 System.out.println("我是TEST2用protected修飾符修飾的方法"); 32 } 33 void demo4() { 34 System.out.println("我是TEST2無修飾符修飾的方法"); 35 } 36 } 37 public class Main { 38 public static void main(String[] args) { 39 TEST2 test2 = new TEST2(); 40 /*以下設計代碼分別調用 demo1 demo2 demo3 demo4 test1 test2 test3 test4方法和t1 t2 t3 t3 e1 e2 e3 e4屬性,結合程序運行結果理解繼承和權限修飾符的用法與區(qū)別*/ 41 } 42 }補充后代碼如下:
1 package test; 2 3 class TEST1 { 4 private String t1 = "這是TEST1的私有屬性"; 5 public String t2 = "這是TEST1的公有屬性"; 6 protected String t3 = "這是TEST1受保護的屬性"; 7 String t4 = "這是TEST1的默認屬性"; 8 private void test1() { 9 System.out.println("我是TEST1用private修飾符修飾的方法"); 10 } 11 public void test2() { 12 System.out.println("我是TEST1用public修飾符修飾的方法"); 13 } 14 protected void test3() { 15 System.out.println("我是TEST1用protected修飾符修飾的方法"); 16 } 17 void test4() { 18 System.out.println("我是TEST1無修飾符修飾的方法"); 19 } 20 } 21 class TEST2 extends TEST1{ 22 private String e1 = "這是TEST2的私有屬性"; 23 public String e2 = "這是TEST2的公有屬性"; 24 protected String e3 = "這是TEST2受保護的屬性"; 25 String e4 = "這是TEST2的默認屬性"; 26 public void demo1() { 27 System.out.println("我是TEST2用public修飾符修飾的方法"); 28 } 29 private void demo2() { 30 System.out.println("我是TEST2用private修飾符修飾的方法"); 31 } 32 protected void demo3() { 33 System.out.println("我是TEST2用protected修飾符修飾的方法"); 34 } 35 void demo4() { 36 System.out.println("我是TEST2無修飾符修飾的方法"); 37 } 38 } 39 public class Main { 40 public static void main(String[] args) { 41 TEST2 test2 = new TEST2(); 42 test2.demo1(); 43 test2.demo3(); 44 test2.demo4(); 45 test2.test2(); 46 test2.test3(); 47 test2.test4(); 48 System.out.println(test2.t2); 49 System.out.println(test2.t3); 50 System.out.println(test2.t4); 51 System.out.println(test2.e2); 52 System.out.println(test2.e3); 53 System.out.println(test2.e4); 54 55 /*以下設計代碼分別調用 demo1 demo2 demo3 demo4 test1 test2 test3 test4方法和t1 t2 t3 t3 e1 e2 e3 e4屬性,結合程序運行結果理解繼承和權限修飾符的用法與區(qū)別*/ 56 } 57 } 58實驗2? 第五章測試程序反思,繼承知識總結。
測試程序1:
? ?編輯、編譯、調試運行教材程序5-8、5-9、5-10(教材174頁-177頁);
? ?結合程序運行結果,理解程序代碼,掌握Object類的定義及用法;
程序5-8如下:
1 package equals; 2 3 /** 4 * This program demonstrates the equals method. 5 * @version 1.12 2012-01-26 6 * @author Cay Horstmann 7 */ 8 public class EqualsTest 9 { 10 public static void main(String[] args) 11 { 12 Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15); 13 Employee alice2 = alice1; 14 Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15); 15 Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1); 16 17 System.out.println("alice1 == alice2: " + (alice1 == alice2)); 18 19 System.out.println("alice1 == alice3: " + (alice1 == alice3)); 20 21 System.out.println("alice1.equals(alice3): " + alice1.equals(alice3)); 22 23 System.out.println("alice1.equals(bob): " + alice1.equals(bob)); 24 25 System.out.println("bob.toString(): " + bob); 26 27 Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 15); 28 Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15); 29 boss.setBonus(5000); 30 System.out.println("boss.toString(): " + boss); 31 System.out.println("carl.equals(boss): " + carl.equals(boss)); 32 System.out.println("alice1.hashCode(): " + alice1.hashCode()); 33 System.out.println("alice3.hashCode(): " + alice3.hashCode()); 34 System.out.println("bob.hashCode(): " + bob.hashCode()); 35 System.out.println("carl.hashCode(): " + carl.hashCode()); 36 } 37 }Manager類
1 package equals; 2 3 public class Manager extends Employee 4 { 5 private double bonus; 6 7 public Manager(String name, double salary, int year, int month, int day) 8 { 9 super(name, salary, year, month, day); 10 bonus = 0; 11 } 12 13 public double getSalary() 14 { 15 double baseSalary = super.getSalary(); 16 return baseSalary + bonus; 17 } 18 19 public void setBonus(double bonus) 20 { 21 this.bonus = bonus; 22 } 23 24 public boolean equals(Object otherObject) 25 { 26 if (!super.equals(otherObject)) return false; 27 Manager other = (Manager) otherObject; 28 // 檢查這個和其他屬于同一個類 29 return bonus == other.bonus; 30 } 31 32 public int hashCode() 33 { 34 return java.util.Objects.hash(super.hashCode(), bonus); 35 } 36 37 public String toString() 38 { 39 return super.toString() + "[bonus=" + bonus + "]"; 40 } 41 }employee類
1 package equals; 2 3 import java.time.*; 4 import java.util.Objects; 5 6 public class Employee 7 { 8 private String name; 9 private double salary; 10 private LocalDate hireDay; 11 12 public Employee(String name, double salary, int year, int month, int day) 13 { 14 this.name = name; 15 this.salary = salary; 16 hireDay = LocalDate.of(year, month, day); 17 } 18 19 public String getName() 20 { 21 return name; 22 } 23 24 public double getSalary() 25 { 26 return salary; 27 } 28 29 public LocalDate getHireDay() 30 { 31 return hireDay; 32 } 33 34 public void raiseSalary(double byPercent) 35 { 36 double raise = salary * byPercent / 100; 37 salary += raise; 38 } 39 40 public boolean equals(Object otherObject) 41 { 42 // 快速檢查對象是否相同 43 // 這里獲得一個對象參數(shù),第一個if語句判斷兩個引用是否是同一個,如果是那么這兩個對象肯定相等 44 if (this == otherObject) return true; 45 46 // 如果顯式參數(shù)為空,則必須返回false 47 if (otherObject == null) return false; 48 49 // getClass()方法是得到對象的類,這里就是如果兩個對象的類不一樣,那么就不相等 50 if (getClass() != otherObject.getClass()) return false; 51 52 // 現(xiàn)在我們知道另一個對象是非空雇員 53 // 在以上判斷完成,再將得到的參數(shù)對象強制轉換為該對象,考慮到父類引用子類的對象的出現(xiàn),然后再判斷對象的屬性是否相同 54 Employee other = (Employee) otherObject; 55 56 // 測試字段是否具有相同的值 57 return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay); 58 } 59 60 public int hashCode() 61 // 哈希散列 62 { 63 return Objects.hash(name, salary, hireDay); 64 } 65 // toString()方法,可自動生成 66 public String toString() 67 { 68 return getClass().getName() + "[name=" + name + ",salary=" + salary + ",hireDay=" + hireDay 69 + "]"; 70 } 71 }程序運行結果:
?
1、Object類是所有java類的基類
如果在類的聲明中未使用extends關鍵字指明其基類,則默認基類為Object類。
2、Object類之equals方法
① Object類中定義有:public boolean equals(Object obj)方法。提供定義對象是否相等的邏輯。
② Objec的equals方法 定義為:x.equals(y)當x和y是同一個對象的應用時返回true,否則返回false.
③ J2SDK提供的一些類,如String,Date等,重寫了Object的equals()方法,調用這些類的equals方法,x.equals(y),當x和y所引用的是同一類對象且屬性內容相等時(并不一定是相等的對象),返回true否則返回false.
④ 可以根據(jù)需要在用戶的自定義類型中重寫equals()方法。
測試程序2:
? ?編輯、編譯、調試運行教材程序5-11(教材182頁);
? ?結合程序運行結果,理解程序代碼,掌握ArrayList類的定義及用法;
程序5-11如下:
1 package arrayList; 2 3 import java.util.*; 4 5 /** 6 * This program demonstrates the ArrayList class. 7 * @version 1.11 2012-01-26 8 * @author Cay Horstmann 9 */ 10 public class ArrayListTest 11 { 12 public static void main(String[] args) 13 { 14 // 用三個雇員對象填充工作人員數(shù)組列表 15 ArrayList<Employee> staff = new ArrayList<>(); 16 17 staff.add(new Employee("Carl Cracker", 75000, 1987, 12, 15)); 18 staff.add(new Employee("Harry Hacker", 50000, 1989, 10, 1)); 19 staff.add(new Employee("Tony Tester", 40000, 1990, 3, 15)); 20 21 // 把每個人的薪水提高5% 22 for (Employee e : staff) 23 e.raiseSalary(5); 24 25 // 打印所有員工對象的信息 26 for (Employee e : staff) 27 System.out.println("name=" + e.getName() + ",salary=" + e.getSalary() + ",hireDay=" 28 + e.getHireDay()); 29 } 30 }employee類
1 package arrayList; 2 3 import java.time.*; 4 5 public class Employee 6 { 7 private String name; 8 private double salary; 9 private LocalDate hireDay; 10 11 public Employee(String name, double salary, int year, int month, int day) 12 { 13 this.name = name; 14 this.salary = salary; 15 hireDay = LocalDate.of(year, month, day); 16 } 17 18 public String getName() 19 { 20 return name; 21 } 22 23 public double getSalary() 24 { 25 return salary; 26 } 27 28 public LocalDate getHireDay() 29 { 30 return hireDay; 31 } 32 33 public void raiseSalary(double byPercent) 34 { 35 double raise = salary * byPercent / 100; 36 salary += raise; 37 } 38 }程序運行結果:
?
ArrayList就是動態(tài)數(shù)組
①?動態(tài)的增加和減少元素
②??實現(xiàn)了ICollection和IList接口
③? 靈活的設置數(shù)組的大小
測試程序3:
? ?編輯、編譯、調試運行程序5-12(教材189頁);
? ?結合運行結果,理解程序代碼,掌握枚舉類的定義及用法;
程序5-12如下:
1 package enums; 2 3 import java.util.*; 4 5 /** 6 * This program demonstrates enumerated types. 7 * @version 1.0 2004-05-24 8 * @author Cay Horstmann 9 */ 10 public class EnumTest 11 { 12 public static void main(String[] args) 13 { 14 Scanner in = new Scanner(System.in); 15 System.out.print("Enter a size: (SMALL, MEDIUM, LARGE, EXTRA_LARGE) "); 16 String input = in.next().toUpperCase(); 17 Size size = Enum.valueOf(Size.class, input); 18 System.out.println("size=" + size); 19 System.out.println("abbreviation=" + size.getAbbreviation()); 20 if (size == Size.EXTRA_LARGE) 21 System.out.println("Good job--you paid attention to the _."); 22 } 23 } 24 25 enum Size 26 { 27 SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL"); 28 29 private Size(String abbreviation) { this.abbreviation = abbreviation; } 30 public String getAbbreviation() { return abbreviation; } 31 32 private String abbreviation; 33 }枚舉是一種特殊的數(shù)據(jù)類型,之所以特殊是因為它既是一種類(class)類型卻又比類型多了些特殊的約束,但是這些約束的存在也造就了枚舉類型的簡潔,安全性以及便捷性。
創(chuàng)建枚舉類型要使用enum關鍵字,隱含了所創(chuàng)建的類型都是java.lang.Enum類的子類(java.lang.Enum是一個抽象類)。
枚舉類型符合通用模式Class Enum<E extends Enum<E>>,而E表示枚舉類型的名稱。
枚舉類型的每一個值都映射到protected Enum(String name,int ordinal)構造函數(shù)中,在這里,每個值的名稱都轉換成一個字符串,并且序數(shù)設置表示了此設置被創(chuàng)建的順序。
實驗3:采用個人賬號登錄https://pintia.cn/,完成《2018秋季西北師范大學面向對象程序設計(Java)(ch1-ch5)測試題2》,測試時間60分鐘;
實驗4: 課后完成實驗3未完成的測試內容。
?第三部分:總結
通過這周的學習,加深了我對第五章生疏知識的理解,提高了編程能力,深入學習了繼承和多態(tài)這兩方面知識點。并且這周的測驗成績并不是很好,一方面是對基礎內容的理解記憶不扎實,另一方面自己在程序設計過程中思維不嚴謹,eclipse可以跑出結果的在pta就會報錯。以后的學習中我會多多利用pta進行聯(lián)系,進一步提高自己的編程思維。
?
轉載于:https://www.cnblogs.com/hackerZT-7/p/9780312.html
總結
以上是生活随笔為你收集整理的王之泰201771010131《面向对象程序设计(java)》第七周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并行计算,网格计算与分布式计算的…
- 下一篇: 暑期培训总结