/* 教練和運動員案例(學生分析而後講解) 乒乓球運動員和籃球運動員。 乒乓球教練和籃球教練。 爲了出國交流,跟乒乓球相關的人員都須要學習英語。 請用所學知識: 分析,這個案例中有哪些抽象類,哪些接口,哪些具體類。 整個分析過程,我是經過畫圖講解的。 */ //定義一個說英語的接口 interface SpeakEnglish { //說英語 public abstract void speak(); } //定義人的抽象類 abstract class Person { private String name; private int age; public Person() {} public Person(String name,int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //睡覺 public void sleep() { System.out.println("人都是要睡覺的"); } //吃飯 public abstract void eat(); } //定義運動員抽象類 abstract class Player extends Person { public Player() {} public Player(String name,int age) { super(name,age); } //學習 public abstract void study(); } //定義教練抽象類 abstract class Coach extends Person { public Coach() {} public Coach(String name,int age) { super(name,age); } //教 public abstract void teach(); } //定義乒乓球運動員具體類 class PingPangPlayer extends Player implements SpeakEnglish { public PingPangPlayer(){} public PingPangPlayer(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("乒乓球運動員吃大白菜,喝小米粥"); } //學習 public void study() { System.out.println("乒乓球運動員學習如何發球和接球"); } //說英語 public void speak() { System.out.println("乒乓球運動員說英語"); } } //定義籃球運動員具體類 class BasketballPlayer extends Player { public BasketballPlayer(){} public BasketballPlayer(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("籃球運動員吃牛肉,喝牛奶"); } //學習 public void study() { System.out.println("籃球運動員學習如何運球和投籃"); } } //定義乒乓球教練具體類 class PingPangCoach extends Coach implements SpeakEnglish { public PingPangCoach(){} public PingPangCoach(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("乒乓球教練吃小白菜,喝大米粥"); } //教 public void teach() { System.out.println("乒乓球教練教如何發球和接球"); } //說英語 public void speak() { System.out.println("乒乓球教練說英語"); } } //定義籃球教練具體類 class BasketballCoach extends Coach { public BasketballCoach(){} public BasketballCoach(String name,int age) { super(name,age); } //吃 public void eat() { System.out.println("籃球教練吃羊肉,喝羊奶"); } //教 public void teach() { System.out.println("籃球教練教如何運球和投籃"); } } class InterfaceDemo { public static void main(String[] args) { //測試運動員(乒乓球運動員和籃球運動員) //乒乓球運動員 PingPangPlayer ppp = new PingPangPlayer(); ppp.setName("王浩"); ppp.setAge(33); System.out.println(ppp.getName()+"---"+ppp.getAge()); ppp.eat(); ppp.sleep(); ppp.study(); ppp.speak(); System.out.println("----------------"); //經過帶參構造給數據(留給大家) //籃球運動員 BasketballPlayer bp = new BasketballPlayer(); bp.setName("姚明"); bp.setAge(34); System.out.println(bp.getName()+"---"+bp.getAge()); bp.eat(); bp.sleep(); bp.study(); //bp.speak(); //沒有該方法 //測試教練本身作 } }
/* 鏈式編程。 每次調用完畢方法後,返回的是一個對象。 */ class Student { public void study() { System.out.println("Good Good Study,Day Day Up"); } } class StudentDemo { public Student getStudent() { return new Student(); } } class StudentTest3 { public static void main(String[] args) { //如何調用的呢? StudentDemo sd = new StudentDemo(); //Student s = sd.getStudent(); //s.study(); //你們注意了 sd.getStudent().study(); } }
帶包的編譯和運行: A:手動式 a:編寫一個帶包的java文件。 b:經過javac命令編譯該java文件。 c:手動建立包名。 d:把b步驟的class文件放到c步驟的最底層包 e:回到和包根目錄在同一目錄的地方,而後運行 帶包運行。 B:自動式 a:編寫一個帶包的java文件。 b:javac編譯的時候帶上-d便可 javac -d . HelloWorld.java c:回到和包根目錄在同一目錄的地方,而後運行 帶包運行。
/* 修飾符: 權限修飾符:private,默認的,protected,public 狀態修飾符:static,final 抽象修飾符:abstract 類: 權限修飾符:默認修飾符,public 狀態修飾符:final 抽象修飾符:abstract 用的最多的就是:public 成員變量: 權限修飾符:private,默認的,protected,public 狀態修飾符:static,final 用的最多的就是:private 構造方法: 權限修飾符:private,默認的,protected,public 用的最多的就是:public 成員方法: 權限修飾符:private,默認的,protected,public 狀態修飾符:static,final 抽象修飾符:abstract 用的最多的就是:public 除此之外的組合規則: 成員變量:public static final 成員方法:public static public abstract public final */ //此處不容許使用修飾符private //此處不容許使用修飾符protected //此處不容許使用修飾符static public class Demo { //成員變量 private int x = 10; int y = 20; protected int z = 30; public int a = 40; public final int b = 50; public static int c = 60; public static final int d = 70; //此處不容許使用修飾符abstract //abstract int e = 80; //構造方法 private Demo(){} Demo(String name){} protected Demo(String name,int age) {} public Demo(String name,int age,String address) {} //此處不容許使用修飾符static //public static Demo(){} //此處不容許使用修飾符final //public final Demo() {} //此處不容許使用修飾符abstract //public abstract Demo(){} //成員方法 //static void show() {} //abstract void show(); //final void show(){} }
/* 成員內部類: 如何直接訪問內部類的成員。 外部類名.內部類名 對象名 = 外部類對象.內部類對象; */ class Outer { private int num = 10; class Inner { public void show() { System.out.println(num); } } } class InnerClassDemo3 { public static void main(String[] args) { //需求:我要訪問Inner類的show()方法 //Inner i = new Inner(); //i.show(); //格式:外部類名.內部類名 對象名 = 外部類對象.內部類對象; Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
/* 成員內部類的修飾符: private 爲了保證數據的安全性 static 爲了方便訪問數據 注意:靜態內部類訪問的外部類數據必須用靜態修飾。 案例:我有一我的(人有身體,身體內有心臟。) class Body { private class Heart { public void operator() { System.out.println("心臟搭橋"); } } public void method() { if(若是你是外科醫生) { Heart h = new Heart(); h.operator(); } } } 按照咱們剛纔的講解,來使用一下 Body.Heart bh = new Body().new Heart(); bh.operator(); //加了private後,就不能被訪問了,那麼,怎麼玩呢? Body b = new Body(); b.method(); */ class Outer { private int num = 10; private static int num2 = 100; //內部類用靜態修飾是由於內部類能夠看出是外部類的成員 public static class Inner { public void show() { //System.out.println(num); System.out.println(num2); } public static void show2() { //System.out.println(num); System.out.println(num2); } } } class InnerClassDemo4 { public static void main(String[] args) { //使用內部類 // 限定的新靜態類 //Outer.Inner oi = new Outer().new Inner(); //oi.show(); //oi.show2(); //成員內部類被靜態修飾後的訪問方式是: //格式:外部類名.內部類名 對象名 = new 外部類名.內部類名(); Outer.Inner oi = new Outer.Inner(); oi.show(); oi.show2(); //show2()的另外一種調用方式 Outer.Inner.show2(); } }
/* 面試題: 要求請填空分別輸出30,20,10。 注意: 1:內部類和外部類沒有繼承關係。 2:經過外部類名限定this對象 Outer.this */ class Outer { public int num = 10; class Inner { public int num = 20; public void show() { int num = 30; System.out.println(num); System.out.println(this.num); //System.out.println(new Outer().num); System.out.println(Outer.this.num); } } } class InnerClassTest { public static void main(String[] args) { Outer.Inner oi = new Outer().new Inner(); oi.show(); } }
/* 匿名內部類在開發中的使用 */ interface Person { public abstract void study(); } class PersonDemo { //接口名做爲形式參數 //其實這裏須要的不是接口,而是該接口的實現類的對象 public void method(Person p) { p.study(); } } //實現類 class Student implements Person { public void study() { System.out.println("好好學習,每天向上"); } } class InnerClassTest2 { public static void main(String[] args) { //測試 PersonDemo pd = new PersonDemo(); Person p = new Student(); pd.method(p); System.out.println("--------------------"); //匿名內部類在開發中的使用 //匿名內部類的本質是繼承類或者實現了接口的子類匿名對象 pd.method(new Person(){ public void study() { System.out.println("好好學習,每天向上"); } }); } }
/* 匿名內部類面試題: 按照要求,補齊代碼 interface Inter { void show(); } class Outer { //補齊代碼 } class OuterDemo { public static void main(String[] args) { Outer.method().show(); } } 要求在控制檯輸出」HelloWorld」 */ interface Inter { void show(); //public abstract } class Outer { //補齊代碼 public static Inter method() { //子類對象 -- 子類匿名對象 return new Inter() { public void show() { System.out.println("HelloWorld"); } }; } } class OuterDemo { public static void main(String[] args) { Outer.method().show(); /* 1:Outer.method()能夠看出method()應該是Outer中的一個靜態方法。 2:Outer.method().show()能夠看出method()方法的返回值是一個對象。 又因爲接口Inter中有一個show()方法,因此我認爲method()方法的返回值類型是一個接口。 */ } }