Java學習筆記05--強制型別轉換 ;內部類(瞭解即可) ;Java異常體系及異常處理;iOS中的try catch 塊
阿新 • • 發佈:2018-12-25
===============java相關講解=============
強制型別轉換:
基本資料型別的轉換
小資料型別---->大的資料型別 自動型別轉換
大資料型別----->小資料型別 強制型別轉換
小資料型別 變數名 = (小資料型別)大資料型別;
引用資料型別的轉換
小資料型別----->大資料型別 自動型別轉換。
大資料型別----->小資料型別 強制型別轉換
型別轉換最場景的問題: java.lang.ClassCastException。 強制型別轉換失敗。
程式碼舉例:
//動物類
abstract class Animal{
String name;
public Animal(String name){
this.name = name;
}
public abstract void run();
}
//老鼠
class Mouse extends Animal{
public Mouse(String name){
super(name);
}
public void run(){
System.out.println(name+"四條腿慢慢的走!" );
}
//老鼠特有方法---打洞
public void dig(){
System.out.println("老鼠在打洞..");
}
}
//魚
class Fish extends Animal{
public Fish(String name){
super(name);
}
public void run(){
System.out.println(name+"搖搖尾巴游啊遊 !");
}
//吹泡泡
public void bubble(){
System.out.println(name+"吹泡泡...!" );
}
}
class Demo2
{
public static void main(String[] args)
{
/*
Animal a = new Mouse("老鼠"); //多型
//呼叫子類特有的方法
Mouse m = (Mouse)a; //強制型別轉換
m.dig();
*/
Mouse m = new Mouse("米老鼠");
Fish f = new Fish("草魚");
print(f);
}
//需求: 定義一個函式可以接收任意型別的動物物件,在函式內部要呼叫到動物特有的方法。
public static void print(Animal a){ // Animal a = new Mouse("米老鼠");
if(a instanceof Fish){
Fish f = (Fish)a;
f.bubble();
}else if(a instanceof Mouse){
Mouse m = (Mouse)a;
m.dig();
}
}
}
內部類
內部類:一個類定義在另外一個類的內部,那麼該類就稱作為內部類。
內部類的class檔名: 外部類$內部類. 好處:便於區分該class檔案是屬於哪個外部類的。
內部類的類別:
1. 成員內部類:
成員內部類的訪問方式:
- 方式一:在外部類提供一個方法建立內部類的物件進行訪問。
- 方式二:在其他類直接建立內部類的物件。 格式:外部類.內部類 變數名 = new 外部類().new 內部類();
注意: 如果是一個靜態內部類,那麼在其他類建立 的格式:
外部類.內部類 變數名 = new 外部類.內部類();
內部類的應用場景: 我們在描述A事物的時候,發現描述的A事物內部還存在另外一個比較
複雜的事物B時候,而且這個比較複雜事物B還需要訪問A事物的屬性等資料,那麼這時候
我們就可以使用內部類描述B事物。
比如: 人--->心臟
class 人{
血
氧氣
等....
class 心臟{
}
}
內部類的好處:內部類可以直接訪問外部類的所有成員。
內部類要注意的細節:
- 如果外部類與內部類存在同名的成員變數時,在內部類中預設情況下是訪問內部類的成員變數。
可以通過”外部類.this.成員變數名” 指定訪問外部類的 成員。 - 私有的成員內部類只能在外部類提供一個方法建立內部類的物件進行訪問,不能在其他類建立物件了。
- 成員內部類一旦出現了靜態的成員,那麼該類也必須 使用static修飾。
2、區域性內部類:
•
•
•
敬請期待。。。
Java異常體系及異常處理
===============iOS相關講解=============
異常處理
Objective – C中提供了異常處理和執行緒同步,這是解釋在這篇文章和“Threading”的支援。要開啟這些功能的 支援,使用GNU編譯器集(海合會)版本3.3和更高版本的-fobjc-exceptions開關。
支援的編譯器指令
@try,@catch,@throw,和 @finally。
程式碼有可能丟擲有可能丟擲的異常是封閉在一個@ try塊。 @catch()塊包含為@ try 塊丟擲的異常的異常處理邏輯。一個@ finally塊包含程式碼必須執行是否引發異常與否。您可以使用@throw指令丟擲一個異常,這基本上是一個對Objective – C物件的指標。你可以使用NSException物件但不限於他們。
@try {
< #statements#>
}
@catch (NSException *exception) { //捕捉最具體的異常型別
< #handler#>
}
@catch (NSException *ne) { //捕獲一個比較重要的異常型別。
}
@catch (id ue) { //再次擲出捕獲的異常。
}
@finally { //不管有沒有異常finally內的程式碼都會執行。
< #statements#>
}
程式碼演示
NSArray * array = @[@"Apple", @"Android", @"Windows"];
@try {
array = [NSArray addObject:@"HHH"];
}
@catch (NSException *exception) {
NSLog(@"exception = %@", exception);
}
@finally {
NSLog(@"不管有沒有異常我都執行!");
NSLog(@"%@", array);
}
NSException *e = [NSException exceptionWithName:@"CupUnderflowException" reason:@"The level is below 0" userInfo:nil];
@throw e;
控制檯輸出:
2013-10-18 15:25:17.990 objective-c——NSArray[11282:303] +[NSArray addObject:]: unrecognized selector sent to class 0x7fff71f701e0
2013-10-18 15:25:17.992 objective-c——NSArray[11282:303] exception = +[NSArray addObject:]: unrecognized selector sent to class 0x7fff71f701e0
2013-10-18 15:25:17.992 objective-c——NSArray[11282:303] 不管有沒有異常我都執行!
2013-10-18 15:25:17.993 objective-c——NSArray[11282:303] (
Apple,
Android,
Windows
)
2013-10-18 15:25:17.994 objective-c——NSArray[11282:303] *** Terminating app due to uncaught exception 'CupUnderflowException', reason: 'The level is below 0'
*** First throw call stack:
(
0 CoreFoundation 0x00007fff85f91b06 __exceptionPreprocess + 198
1 libobjc.A.dylib 0x00007fff835113f0 objc_exception_throw + 43
4 libdyld.dylib 0x00007fff83cea7e1 start + 0
)
libc++abi.dylib: terminate called throwing an exception