public abstract class i { public abstract void fight(); i aa=new i(); }
上述代碼會出現以下錯誤
若是子類要繼承抽象父類,那麼它必須繼續標示該方法爲abstract,或者是操做抽象方法。html
public String toString() { return String.format("劍士(%s,%d,%d)",this.name,this.blood,this.level); }
(若是方法中沒有同名函數,this能夠省略)
如上代碼段,(其中String.format語句:String類的format()方法用於建立格式化的字符串以及鏈接多個字符串對象。詳見以下連接).在父類中定義以下函數,便可引用子類的函數。java
public static void drawFight(d role) { System.out.println(role.toString()); }
至此,已經學習了java中關於權限的三個關鍵字,分爲四個權限範圍,以下表git
關鍵字 | 類內部 | 相同包內 | 不一樣包類 |
---|---|---|---|
public | 可存取 | 可存取 | 可存取 |
private | 可存取 | 不可存取 | 不可存取 |
protected | 可存取 | 可存取 | 不可存取但子類可存取 |
無 | 可存取 | 可存取 | 不可存取 |
public class i{ public static void main(String[] args) { other ss=new other(); ss.toString(); } static class a{ a() { System.out.println("some()被調用"); } a(int i) { System.out.println("some(int i)被調用"); } } static class other extends a { other() { super(); System.out.println("other()被調用"); } } }
結果如圖在new other()時,先調用了other版本的構造函數,super(10)表示調用父類some(int i)版本的構造函數,故有上述輸出。若是子類在構造函數中沒有指定執行父類中的那個構造函數,默認會調用父類中無參數構造函數。以下代碼段會顯示編譯出錯bash
static class a{ a(int i) { System.out.println("some(int i)被調用"); } } static class other extends a { other() { System.out.println("other()被調用"); }
以下由於父類中定義了a(int i)構造函數,不會自動加入任何構造函數,而子類默認調用父類中無參數的構造函數,所以編譯失敗。(若是定義了有參數的構造函數,也能夠加入無參數構造函數爲往後使用上的彈性)。ide
Object o1="taylor swif"; Object o2=new Data() ;
System.out.println(swords.toString()); System.out.println(swords);
是相同的。函數
public interface swimmer { public abstract void swim(); }
package src.week3; public class human implements swimmer{ public static void main(String[] args) { human a=new human("hjasdh"); a.swim(); } private String name; public human(String name) { this.name=name; } public String getName() { return name; } @Override public void swim() { System.out.printf("人類%s游泳%n",name); } }
human操做了swimmer,因此都擁有Swimer定義的行爲,但他們沒有繼承Fish。類要操做接口,必須使用implement關鍵字,操做某接口時,對接口中定義的方法有兩種處理方式,一是操做接口中定義的方法,二是再度將該方法表示爲abstract。注意:java中子類只能繼承一個父類。學習
public class Ocean { public static void main(String[] args) { doswim(new human("ads")); doswim(new shark("ads")); doswim(new submarine("ads")); } static void doswim(swimmer a)//只要對象擁有Swimer行爲,就能夠直接引用,無需作新的方法撰寫 { a.swim(); }
在java中類能夠操做兩個以上的類,擁有兩種以上的行爲。代碼以下:ui
public class airplane implements swimmer,flyer{}
public abstract void swim(){}
interface Action { void execute(); } interface some extends Action{ void dosome(); } interface other extends Action{ void doother(); } public class n implements some,other{ public static void main(String[] args) { n aa=new n(); aa.dosome(); aa.doother(); aa.execute(); } @Override public void execute() { System.out.println("execute"); } @Override public void dosome() { System.out.println("some"); } @Override public void doother() { System.out.println("other"); } }
接口能夠繼承別的接口,也能夠同時使用兩個以上的接口,一樣是使用extends關鍵字。this
成員內部類定義在成員位置上,局部內部類定義在局部位置與方法上。內部類的成員能夠直接訪問外部的成員,而外部類要訪問內部類,必須創建內部類對象。當內部類定義了static成員,該內部類必須是static。局部內部類方文局部變量必須用final修飾,由於局部變量會隨着方法的調用而被調用,隨着方法調用完畢而消失,加上final後,這個變量就變成了常量。匿名內部類是一個繼承了該類或者是實現了該接口的子類匿名對象。它必須繼承一個類或者是實現了接口。格式爲new 父類或者接口(){重寫方法}。能夠將其理解爲帶內容的對象。匿名內部類中定義的方法最好不要超過三個。.net
f jiansh=new d();//d類是父類,f類是子類。這行代碼編譯出錯。
public class f extends d{ public static void main(String[] args) { fight(); } public static void fight(){ System.out.println("揮劍攻擊"); d role1=new f();// f jianshi=(f) role1;//告訴編譯程序,f是一種d。 f jiansh=new d();// } }
其中第11行代碼編譯成功,由於你告訴編譯程序,f是一種d。
package src.week3; public class RPG { public static void main(String[] args) { f qq=new f(); qq.setName("Justin"); qq.setLevel(1); qq.setBlood(200); showblood(qq); a bb=new a(); showblood(bb); } static void showblood(d role) { System.out.printf("%s血量 %d%n",role.getName(),role.getBlood()); }
沒法從bb包內取得信息,不然編譯不經過,上述代碼能夠獲得以下結果:
同時能夠藉此回顧上一週學的字符串初始化爲null。
package src.week3; import java.util.Scanner; public class guest { public static void main(String[] args) { k name1=new k(); collectnameto(name1); System.out.println("訪客名單:"); pp(name1); } public static void collectnameto(k names) { while(!(names.equals("quit"))){ System.out.print("訪客姓名: "); Scanner console=new Scanner(System.in);//新建一個Scanner實例 String name=console.nextLine(); if(names.equals("quit")); break; } names.add(names);//收集name } public static void pp(k name1) { for(int i=0;i<name1.size();i++) { String name=(String) name1.get(i); System.out.println(name.toUpperCase()); } } }
此代碼只能輸入一次,雖能夠編譯但運行出錯。提示錯誤所在代碼以下
String name=(String) name1.get(i);
因此索性直接改成
System.out.println(name1.get(i));
但輸出變成想着是呀忘了把它轉換成String類型就直接輸出了。因而繼續修改
System.out.println((String) name1.get(i));
但仍是出錯,如圖:根據輸出判斷應該和第一次代碼的錯誤相同。估計錯誤不在此處,因而與書上比較是否有粗心輸錯的地方,果真我把
name1.add(cc);
放到了循環外側,因而把語句拖入循環中,覺得應該對了,結果直接出錯以下:UNreachable statement的意思是不能到達的語句。我想是否是他的位置有問題,就把它移到了if()語句上面,能夠編譯和運行了,可是隻能輸入一個名字,如圖:我想確定是循環哪裏出了毛病,因而在這個函數開頭設斷點開始單步調試,一開始都是正確的以下圖:但在下一步就是
if(cc.equals("quit")); { break; }
語句處,明明不相等的兩個語句,可是卻break了。因而我開始着手解決if()條件語句。嘗試屢次都在出錯,錯誤都是相同的就是直接跳出循環。此處的問題還沒搞清楚。因而放棄if()語句,將代碼段修改以下
public static void collectnameto(k name1) {int i=0; Scanner console=new Scanner(System.in);//新建一個Scanner實例 while (i==0){ System.out.printf("訪客姓名: "); String cc=console.next(); console.nextLine(); name1.add(cc); i=ww(cc); } } public static int ww(Object o) { if(o.equals("quit")) return 1; else return 0; }
顯示正確。最後能夠正確輸入與輸出以下圖:最後關於
cc=console.next(); console.nextLine();
語句,我曾懷疑是這裏出錯,上網百度後,發現了.nextLine()和.next()其實沒什麼大的分別,但可能出現吃回車問題,因而我在cc=console.next();語句後又加入了console.nextLine();能夠避免這個問題。
public class Game { public static void main(String[] args) { System.out.println(""+52+25); System.out.println(52+25+""); } }
對上述代碼的輸出理解
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 120/120 | 1/1 | 16/16 | 開始了JAVA學習的第一步! |
第二週 | 346/466 | 1/2 | 23/36 | 瞭解並學習了Java基礎語法 |
第三週 | 364/830 | 1/3 | 21/57 | 進一步瞭解java設計語句 |
第四周 | 570/1300 | 2/5 | 20/77 | 初步學習了繼承與多態,接口與多態知識。 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:18小時
實際學習時間:20小時
改進狀況:這周學習任務量比較大,花費的時間比預期要多,但效率還不錯。