day10-----------面向對象(傳智視頻)

/*
	教練和運動員案例(學生分析而後講解)
		乒乓球運動員和籃球運動員。
		乒乓球教練和籃球教練。
		爲了出國交流,跟乒乓球相關的人員都須要學習英語。
		請用所學知識:
		分析,這個案例中有哪些抽象類,哪些接口,哪些具體類。
	
	整個分析過程,我是經過畫圖講解的。	
*/
//定義一個說英語的接口
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()方法的返回值類型是一個接口。
		*/
	}
}
相關文章
相關標籤/搜索