------ Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------
第一章
1、多态 2、類型轉換 3、多态核心思想 4、綁定 5、接口
第二章
1、内部類 2、異常 3、異常報告不準确的問題 4、模版設計
第三章
1、分層思想 2、子父類異常
第一章
1、多态
同一事物具有多種形态,java中指對象。同一對象可以有多種引用。
函數也具有多态性:重載和覆寫。
多态的出現大大提高了程式的擴充性。
擴充性:包括體系内部的擴充 和 外部體系擴充。
多态十分體系内部擴充(定義接口,擴充子類)
前提:
有繼承或者實作關系;
通常,還存在覆寫。
弊端:
隻能使用父類的引用通路父類中存在的成員。
代碼示範:
/*
繼承中多态
*/
class Fu
{
String name="fu";
}
class Zi extends Fu
{
String name="zi";
}
class Test
{
public static void main(String[] args)
{
Fu o =new Zi();
System.out.println(o.name);
}
}
2、類型轉換
向上轉型===類型自動提升
向下轉型===強制轉換(本來就是這種對象)
多态自始至終都是子類做着變化。
關鍵字:instanceof xx是否是yy執行個體的引用 。
3、多态核心思想
代碼向上抽取,形成大類,建立工具類,利用多态的思想,通過用工具類操作大類來操作小類,然後在main中調用工具類即可
實作步驟:
1.建立體系:大類和工具類
2.調用:主函數調用工具類
成員函數在多态調用中,編譯看左邊,運作看右邊;
注意:成員變量在多态調用中,編譯運作都看左邊(????多态運用中,成員變量無重寫特性);
靜态成員變量在多态的調用中,編譯運作都看左邊 (因為它是随類加載的,不依賴對象)。
代碼示範:
/*
建立體系
1.建立具有基本功能的基類
2.建立操作該基類的工具類
*/
abstract class Student
{
public abstract void study();
public abstract void eat();
}
class StudenntTool
{
public void doo(Student stu){
stu.study();
stu.eat();
}
}
/*
後期增加的子功能類
*/
//基礎班學生
class BaseStudent extends Student
{
public void eat()
{
System.out.println("基礎班的學生在吃飯");
}
public void study()
{
System.out.println("基礎班的學生在學習");
}
}
//進階班學生
class AdvStudent extends Student
{
public void eat()
{
System.out.println("進階班的學生在吃飯");
}
public void study()
{
System.out.println("進階班的學生在學習");
}
}
class Test
{
public static void main(String[] args)
{
StudenntTool st=new StudenntTool();
st.doo(new BaseStudent() );
st.doo(new AdvStudent() );
}
}
4、綁定
方法區中,存在靜态區和非靜态區。
靜态綁定:靜态成員綁定在類上的;
動态綁定:非靜态成員是綁定在對象上的。
5、接口
(1)總結
interface:降低耦合性,提高擴充性,定義規則;
多态:提高程式擴充性。
(2)接口設計
在程式設計 前,一定要進行結構設計,使用好接口,牢記功能擴充。
(3)代碼示範
/*
電腦的運作需要主機闆
在主機闆上需要不斷的擴充功能
思路:
1。建立主機闆
2,在主機闆上預留接口,該接口可以進行多中功能的擴充
3,實作擴充功能
*/
//定義主機闆
class MainBoard
{
public void run()
{
System.out.println("主機闆運作");
}
public void stop()
{
System.out.println("主機闆停止運作");
}
public void userPCI( PCI p)
{
p.open();
p.close();
}
}
//定義接口
interface PCI
{
public void open();
public void close();
}
//後期功能擴充
//接入網卡
class NetCard implements PCI
{
public void open()
{
System.out.println("開啟網卡");
}
public void close()
{
System.out.println("關閉網卡");
}
}
//接入聲霸卡
class SoundCard implements PCI
{
public void open()
{
System.out.println("開啟聲霸卡");
}
public void close()
{
System.out.println("關閉聲霸卡");
}
}
//用電腦:
class Test
{
public static void main(String[] args)
{
MainBoard mb=new MainBoard();
mb.run();
mb.userPCI( new NetCard() );
mb.userPCI( new SoundCard() );
mb.stop();
}
}
第二章
1、内部類
(1)簡介
屬于類的成員,可以直接通路類的其他成員
外部類通路它的格式:outer.inner(兩者均為對象)
内部類為什麼能直接通路外部類成員?
:是因為内部類持有外部類的一個引用,格式:Outer.this.x
(2)内部類的設計
當事物中内部事物需要通路外部事物的成員時,建立内部類
匿名内部子類對象:是内部子類的簡寫格式
實質是一個對象,這個對象有點胖
前提:匿名内部子類對象必須繼承父類或者實作接口
基本格式:
void function()
{
new Object()
{
void method(){
System.out.println(“……………….”);
}
}
}
(3)匿名内部類 的局限性
a.隻能一次性調用;
b.建立父類或者接口引用,也隻能調用父類或接口中存在的方法。
事實上,一般為了友善,也不會建立自己特有的方法。
(4)代碼示範:
class Outer
{
public int age=10;
//成員位置上的内部類
public class Inner
{
//public int age=20;
public void function(){
System.out.println("age="+age);
}
}
public void function(){
/*//局部内部類
class C
{
void print(){
System.out.print("我是局部内部類");
}
}
new C().print();
*/
//匿名内部類
}
}
class Test
{
public static void main(String [] args)
{
Outer o=new Outer();
Outer.Inner i=new Outer().new Inner();
//System.out.println(o.age);
//System.out.println(i.age);
//i.function();
o.function();
System.out.println();
new Object(){
void function(){
System.out.println("匿名内部類");
}
}.function();
}
}
2、異常
(1)簡介
問題也是一種事物,java中的問題分error(不可治愈)和Exception(可治愈)兩大類,把共性的部分不斷地向上抽取,形成了一個體系,這個父類是Rhrowable。
(2)異常處理
a,throw抛出;
b,try…catch。
異常聲明:經可能詳細,可聲明多個,用多個catch處理,之間若有繼承關系,父類往後放。
一般不列印,用日志檔案記錄異常,便于開發人員排查問題。
(3)自定義異常
a.繼承exception
b.抛異常+聲明異常
c.處理異常
d.可以建立自己特有的函數
(4)throw與throws差別
throw:用在函數内,後面跟函數對象
throws:用在函數上,後面跟函數名
(5)RunTimeException
RunTimeException該類及其子類很特殊,在函數内抛異常不需聲明,這是因為:jvm不希望操作這處理,而希望程式停掉,修正代碼。
(6)代碼示範:
/*
老師用電腦講課
電腦出問題:
1.藍屏了
2冒煙了
電腦問題引起老師的問題
*/
class Compt
{
private int state=3;
public void run() throws MaoYan,LanPin
{
if(state==1)
System.out.println("電腦運作");
if(state==2)
throw new LanPin();
if(state==3)
throw new MaoYan();
}
public void reset(){
state=1;
System.out.println("電腦重新開機");
}
}
class Teacher
{
private String name;
private Compt compt;
public Teacher(String name){
this.name=name;
compt=new Compt();
}
public void jiangKe() throws Jihua
{
try{
compt.run();
}catch(LanPin e){
compt.reset();
}catch(MaoYan e){
throw new Jihua("冒煙了");
}
System.out.println("老師講課");
}
}
class MaoYan extends Exception
{
public MaoYan(){
super();
}
}
class LanPin extends Exception
{
public LanPin(){
super();
}
}
class Jihua extends Exception
{
public Jihua(String message){
super(message);
}
}
class Test
{
public static void main(String [] args){
try
{
Teacher t=new Teacher("zhuyutao");
t.jiangKe();
}
catch(Jihua e)
{
System.out.println("換老師或放假"+e);
}
}
}
3、異常報告不準确的問題
a,異常又分為編譯異常和運作異常
編譯以異常:需要聲明
運作異常:不需要聲明
b,在日常中發現:
異常是層層抛出的,在功能函數上聲明,在功能函數内部抛出,在調用時處理,處理分兩種情況:能處理則處理、不能處理則轉換抛出。
轉化抛出,提供了解決之策,但也隐瞞了真實錯誤。(了解這一點,十分有利于排除異常)
練習題:
需求:擷取一段程式運作的時間。
原理:擷取程式開始和結束的時間并相減即可。
擷取時間,System.currentTimeMillis();
當代碼完成優化後,就可以解決這類問題。
這種方式,模版方法設計模式。
4,模版設計
在定義功能時,功能的一部分是确定的,但是有一部分是不确定,而确定的部分在使用不确定的部分。那麼這時就将不确定的部分暴露出去。由該類的子類去完成。
第三章
1、分層思想
實質是資料封裝,對象封裝
如:異常的層層外抛,如果一個問題決解不了,先封裝再抛出
小知識點:
Finally,肯定會執行的代碼塊(exit除外)。通常用來關閉資源。
Return 後面不能有語句。
throw封裝在函數中 時後面可以有語句,不在函數中時後面不能有語句。
2、異常補充
Try{
throw new xxException ("列印資訊");
}catch(xxException e){
}
上述,寫法是可以的,隻要問題解決了,不用聲明
Try{
throw new xxException();
}catch(xxException e){
throw e;
}
這種情況,編譯不能通過,問題抛出沒有解決,就得聲明。
3、子父類異常
子父類異常:
子類隻能抛繼承的異常或者繼承異常的子類;
子類特有的異常,必須處理。
異常分為:
編譯時異常和運作時異常。
代碼示範:
package pack;
/*
求圖形的面積
過程中發生的問題,分裝成異常對象
正常流程代碼 應該和異常代碼分開,提高閱讀性
體系内基本功能用calss
體系外功能擴充用interface
以下,我們用接口
*/
interface Areaa
{
void getArea();
}
class Rec implements Areaa
{
private int width;
private int height;
Rec(int width,int height){
if(width<=0 || height<=0)
throw new NoException("出錯了");
this.width=width;
this.height=height;
}
public void getArea()
{
System.out.println(width*height);
}
}
class Circle implements Areaa
{
private int radius;
public static final double PI=3.14;
Circle(int radius){
if(radius<=0 )
throw new NoException("出錯了");
this.radius=radius;
}
public void getArea()
{
System.out.println(radius*radius*PI);
}
}
class NoException extends RuntimeException
{
NoException(String msg){
super(msg);
}
}
class Test
{
public static void main(String[] args)
{
try{
new Rec(3,4).getArea();
new Circle(-3).getArea();
}catch(NoException e){
System.out.println(e);
}
}
}
有錯漏之處,歡迎指正!
------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練、期待與您交流! -------