日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java_basic_review(5) java继承

發(fā)布時(shí)間:2023/12/3 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java_basic_review(5) java继承 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】README 1)本文主要對(duì) java 繼承的一些 重點(diǎn)知識(shí)進(jìn)行復(fù)習(xí); 2)for source code, please visit?java_basic_review(5)源代碼 3) proj dir tree

【1】super 和 this 的比較 1)this的用途:一是引用隱式參數(shù)+二是調(diào)用該類其它的構(gòu)造器; 2)super的用途:一是調(diào)用超類 的方法 + 二是調(diào)用超類構(gòu)造器;(super只是一個(gè)編譯器調(diào)用超類方法的特殊關(guān)鍵字)
【2】多態(tài) public class Employee {private int age;private String name;private double salary; public class Manager extends Employee{private double bonus;public Manager(int age, String name, double salary) {super(age, name, salary);}@Overridepublic double getSalary() {return super.getSalary() + bonus;}public void setBonus(double bonus) {this.bonus = bonus;} } @Testpublic void testArrayConvert() {Manager[] mArray = new Manager[3];;Employee[] eArray;eArray = mArray; // 編譯器允許數(shù)組對(duì)象轉(zhuǎn)換.eArray[0] = new Employee(1, "zhangfei", 13000); // throws exception.mArray[0].setBonus(1000);System.out.println(mArray[0].getSalary());} 1)intro:多態(tài)指 一個(gè)對(duì)象變量可以指示多種實(shí)際類型的現(xiàn)象 被稱為多態(tài);(如上述代碼中的 Employee e 既可以指向 Manager實(shí)例 也可以指向 Employee實(shí)例) 2)Manager m =?eArray[i] 非法:原因很清楚, 不是所有的雇員都是經(jīng)理; 3)編譯器允許數(shù)組對(duì)象轉(zhuǎn)換: 原因是 數(shù)組都是 Object的子類(Employee[] extends Object, Manager[] extends Object),不管是基本類型數(shù)組 還是 對(duì)象類型數(shù)組;
【3】 動(dòng)態(tài)綁定 1)intro to 方法簽名:?方法的名字和參數(shù)列表稱為方法簽名,不包括返回類型; 2)在覆蓋一個(gè)方法的時(shí)候:子類方法不能低于超類方法的可見性;特別是, 如果超類方法是public, 子類方法一定要聲明為public;
【4】阻止繼承:final 類 和 方法 1)final 類:如果將一個(gè)類聲明為final, 其中的方法自動(dòng)地成為final, 而不包括域; 2)內(nèi)聯(lián):如果一個(gè)方法沒有被覆蓋并且很短,編譯器就能夠?qū)λM(jìn)行優(yōu)化處理,這個(gè)過程就稱為內(nèi)聯(lián);如, 內(nèi)聯(lián)調(diào)用e.getName() 將被替換為 訪問 e.name 域; 3)即時(shí)編譯器對(duì)方法進(jìn)行內(nèi)聯(lián)處理: 虛擬機(jī)中的即時(shí)編譯器比傳統(tǒng)編譯器的處理能力強(qiáng)得多, 這個(gè)編譯器可以準(zhǔn)確誰(shuí)知道類之間的繼承關(guān)系,并能夠檢測(cè)出類中是否真正地存在覆蓋給定的方法, 如果方法很短,被頻繁調(diào)用且沒有真正地被覆蓋,那么即時(shí)編譯器就會(huì)將這個(gè)方法進(jìn)行內(nèi)聯(lián)處理;
【5】強(qiáng)制類型轉(zhuǎn)換(instanceof 關(guān)鍵字) 1)intro:我們應(yīng)該養(yǎng)成一個(gè)良好的程序設(shè)計(jì)習(xí)慣,在進(jìn)行類型轉(zhuǎn)換之前, 先查看一下是否能夠成功地轉(zhuǎn)換, 這個(gè)過程使用 instanceof 就可以實(shí)現(xiàn);? Manager mTemp;Employee eTemp = new Employee();if(eTemp instanceof Manager) { // highlight.mTemp = (Manager)eTemp;} 2)instanceof 其實(shí)并不那么完美(不建議在equals方法中用到 instanceof 來檢測(cè)):java 規(guī)范要求 equals() 方法滿足對(duì)稱性,即 a.equals(b) == b.equals(a);? @Overridepublic boolean equals(Object obj) { // defined in Person.javaif(obj instanceof Person) {return true;}return false;} @Testpublic void testInstanceof() {Person p = new Person();Student s = new Student(); // Student extends PersonSystem.out.println(p.equals(s)); // true. 然而它們卻屬于不同的類.System.out.println(s.equals(p)); // true. 然而它們卻屬于不同的類.} 【6】抽象類 public abstract class Person {private String name;public Person(String n) {name = n;}public abstract String getDescription();public String getName() {return name;} } public class Student extends Person {private String major;public Student(String n, String m) {super(n);major = m;}public String getDescription() {return "a student majoring in " + major;} } 1)由于不能構(gòu)造抽象類 Person的對(duì)象, 所以變量p 永遠(yuǎn)不會(huì)引用 Person對(duì)象:而是引用諸如 Student這樣的具體子類對(duì)象;
【7】Object:所有類的超類 1)在java中, 只有基本類型不是對(duì)象;而所有的數(shù)組類型,不管是對(duì)象數(shù)組還是基本類型的數(shù)組都擴(kuò)展于Object類; 2)equals 方法:該方法用于檢測(cè)一個(gè)對(duì)象是否等于另外一個(gè)對(duì)象;(在Object類中, 這個(gè)方法比較的是內(nèi)存地址,判斷的是兩個(gè)對(duì)象是否具有相同引用) 3)如何重寫equals方法:下面給出編寫一個(gè)完美的 equals 方法的建議 step1)檢測(cè)this 與 otherObject 是否引用同一個(gè)對(duì)象:? if(this == otherObject) return true; // 實(shí)際上, 這是一種經(jīng)常采用的形式, 因?yàn)橛?jì)算這個(gè)等式要比一個(gè)一個(gè)地比較類中的域所付出的代價(jià)小得多; step2)檢測(cè)otherObject 是否為 null, 如果為 null ,則返回 false, 這項(xiàng)檢測(cè)很有必要; if(otherObject == null) return false; step3)比較this 與 otherObject 是否屬于同一個(gè)類,如果equals 的語(yǔ)義在每個(gè)子類中有所改變,就是用 getClass 進(jìn)行檢測(cè): if(getClass() != otherObject.getClass()) return false; step4)將 otherObject 轉(zhuǎn)換為 相應(yīng)的類類型變量: ClassName other = (ClassName)otherObject; step5)現(xiàn)在開始對(duì)所有需要比較的域進(jìn)行比較了;?使用 == 比較基本類型域, 使用 equals比較對(duì)象域, 如果所有的域都匹配返回 true, 否則返回 false; return field1 == other.field1 && Object.equals(field2, other.field2) ; Attention)如果在子類中重新定義 equals, 就要在其中包含 調(diào)用 super.equals(other);?? @Override // defined in Manager.javapublic boolean equals(Object obj) {if(this == obj) { // step1: 檢測(cè)this 與 obj 是否引用同一個(gè)對(duì)象return true;} else if(obj == null) { // step2: 檢測(cè) obj 是否為 nullreturn false;} else if(getClass() != obj.getClass()) { // step3: 比較this 與 obj 是否屬于同一個(gè)類return false;} else { // step4: 將 obj 轉(zhuǎn)換為 相應(yīng)的類類型變量Manager m = (Manager)obj;return getName()==m.getName() && getAge()==m.getAge() && getSalary()==m.getSalary()&& bonus == m.getBonus();}} 【8】使用 @Override 對(duì)覆蓋超類的方法進(jìn)行標(biāo)記 /*@Overridepublic boolean equals(Employee obj){}*/1)這個(gè)方法聲明的顯式參數(shù)類型是 Employee, 其結(jié)果并沒有 覆蓋 Object類的 equals 方法,而是定義了一個(gè)完全無關(guān)的方法; 2)為了避免發(fā)生類型錯(cuò)誤: 可以使用 @Override 對(duì)覆蓋超類的方法進(jìn)行標(biāo)記;
【9】hashCode 方法 1)intro: 散列碼是由對(duì)象導(dǎo)出的一個(gè)整型值, 散列碼沒有規(guī)律的; 2)String類通過下列算法計(jì)算散列碼: int hash = 0; for(int i=0;i<length(); i++) hash = 31 * hash + charAt(i); 3)下面是 Employee類 的 hashCode方法: /*@Overridepublic int hashCode() {return 7*name.hashCode()+ 11*String.valueOf(salary).hashCode()+ 13*String.valueOf(age).hashCode();}*/@Override // defined in Employee via jdk7.public int hashCode() {return Objects.hash(age, name, salary);} @Overridepublic int hashCode() { // defined in Manager.(Manager extends Employee.)return super.hashCode() + Objects.hash(bonus);} @Testpublic void testHashCode() {Manager m1 = new Manager(1, "1", 1);Employee m2 = new Employee(1, "1", 1);System.out.println(m1.equals(m2)); // true.System.out.println(m1.hashCode() == m2.hashCode()); // true.} Attention)equals 方法與 hashCode 的定義必須一致, 如果x.equals(y) 返回 true, 那么 x.hashCode() 就必須與 y.hashCode() 具有相同的值;
【10】toString方法 1)隨處可見toString 方法的原因是: 只要對(duì)象與一個(gè)字符串通過操作符 + 連接起來,java編譯器就會(huì)自動(dòng)地調(diào)用 toString 方法, 以便獲得這個(gè)對(duì)象的字符串描述;? 2)在調(diào)用它 x.toString()的地方可以用 “”+x替代,這條語(yǔ)句將一個(gè)空串與 x 的字符串表示相連接, 這里的x就是 x.toString();
【11】泛型數(shù)組列表ArrayList 1)intro:把初始容量傳給 ArrayList 構(gòu)造器: ArrayList<Employee> staff= new ArrayList<>(100); 2)在填充數(shù)組之前調(diào)用 ensureCapacity方法: staff.ensureCapacity(100); 這個(gè)方法將分配一個(gè)包含100個(gè)對(duì)象的內(nèi)部數(shù)組, 然后調(diào)用100 次add, 而不用重新分配空間了; 3)trimToSize方法:一旦能夠確認(rèn)數(shù)組列表的大小不再發(fā)生變化,就可調(diào)用 trimTSize 方法, 這個(gè)方法將存儲(chǔ)區(qū)域的大小調(diào)整為當(dāng)前元素?cái)?shù)量所需要的存儲(chǔ)空間數(shù)組。垃圾回收器將回收多余的存儲(chǔ)空間; @Testpublic void testArrayList() {ArrayList<Double> list = new ArrayList<>();list.ensureCapacity(3);list.add(Double.valueOf(1));list.add(Double.valueOf(2));list.add(Double.valueOf(3));list.trimToSize();// 不會(huì)報(bào)錯(cuò),只是告訴jvm 回收多余的內(nèi)存.list.add(Double.valueOf(4));System.out.println(list.size()); // 4} 【11.1】訪問數(shù)組列表元素 1)在中間插入和刪除元素 @Testpublic void testArrayList() {ArrayList<Double> list = new ArrayList<>();list.ensureCapacity(3);list.add(Double.valueOf(1));list.add(Double.valueOf(2));list.add(Double.valueOf(3));list.trimToSize();// 不會(huì)報(bào)錯(cuò),只是告訴jvm 回收多余的內(nèi)存.list.add(Double.valueOf(4));System.out.println(list.size());Double[] dArray = new Double[list.size()]; list.toArray(dArray); // 訪問數(shù)組元素for(double d : dArray) {System.out.print(d + ", "); // 1, 2, 3, 4 }int n = list.size() / 2;list.add(n, Double.valueOf(5)); // 在 數(shù)組列表中間插入元素.這種操作如果多的話,建議 LinkedListSystem.out.println("\n" + "new array: ");for (Double temp : list) {System.out.println(temp); // 1, 2, 5, 3, 4} } 【12】參數(shù)數(shù)量可變的方法 @Test // 參數(shù)數(shù)量可變的方法 ( Object... == Object[] )public void testVariableParameters() {System.out.printf("%d %s", new Object[]{new Integer(100), "widgets"});prettyPrint(100, "widgets");prettyPrint(new Object[]{new Integer(100), "widgets"});}public void prettyPrint(Object... args) {System.out.printf("\n%d %s", args);} 100 widgets 100 widgets 100 widgets 【13】枚舉類 1)intro: 定義一個(gè)枚舉類 public enum Size {SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");private String abbreviation;private Size(String abbreviation) {this.abbreviation = abbreviation;}public String getAbbreviation() {return abbreviation;} } 2)所有的枚舉類型都是 Enum類的子類: 它們繼承了這個(gè)類的許多方法,包括toString方法, 它可以返回枚舉常量名;如, Size.SMALL.toString() 將返回字符串 "SMALL";? 3)toString 的逆方法是靜態(tài)方法valueOf:如,Size s = Enum.valueOf(Size.class, "SMALL"); 將s 設(shè)置為 Size.SMALL; 4)每個(gè)枚舉類型都有一個(gè)靜態(tài)的values方法:它將返回一個(gè)包含全部枚舉值的數(shù)組; Size[] values = Size.values(); 5)ordinal :該方法返回enum聲明中枚舉常量的位置, 從0開始計(jì)數(shù); 如, Size.MEDIUM.ordinal() 返回 1; Annotation)Enum類省略了一個(gè)類型參數(shù), 例如,實(shí)際上, 應(yīng)該將枚舉類型 Size 擴(kuò)展為Enum<Size> ;
6)測(cè)試用例 public enum Size {SMALL("S"), MEDIUM("M"), LARGE("L"), EXTRA_LARGE("XL");private String abbreviation;private Size(String abbreviation) {this.abbreviation = abbreviation;}public String getAbbreviation() {return abbreviation;} }@Testpublic void testEnum() {Size[] values = Size.values();for(Size size : values) {System.out.println(size); // 調(diào)用枚舉類中元素.}int ordinal = Size.MEDIUM.ordinal();System.out.println(ordinal); // 枚舉常量的序數(shù)// 將s 設(shè)置為 Size.SMALL;Size s = Enum.valueOf(Size.class, "SMALL");System.out.println(s);} SMALL // console info. MEDIUM LARGE EXTRA_LARGE 1 SMALL

總結(jié)

以上是生活随笔為你收集整理的java_basic_review(5) java继承的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。