選購攝影相關產品,比選擇電腦主機還是家電產品更難!

大家在進入任何一個領域之前,多少都會去網路上爬文

比方說:「入門推薦的攝影器材」、「基本攝影裝備」或者是「必買的攝影裝備」,尤其對於新手來說,這可是非常重要的功課

因為每個人都希望一次到位,避免踩雷,傷了荷包是小事,另一半發火可是大事啊!

其實選擇的方式歸類以下幾點

1.買新款不買舊款 2.不買套機,機身鏡頭分開選擇 3.在自己的預算內買最好的,一步到位 4.一機身+一短焦+一長焦(必備)

其實我在很多的購物網站比較起來,momo買東西是目前最省的一個平台了!

更新商品及相關促銷的活動也是非常多~

攝影用品很多,而且現在刷卡很多優惠,去店面買價格很死,也無法累積點數

所以感覺到實體店面看完後,到MOMO選擇會是很好選擇,有時還可以拿到很便宜的價格

尤其常常有促銷,如果你看中的型號有在上面就真的賺到了

【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板是我這陣子選購的,用起來的評價真的不錯

實用性、外觀、價格也平價

在許多網站都有相關的介紹,可見評價真的很高!

現在省錢才是王道啊!

而且我也很常逛PTT,這款【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板也真的受到不少人的推薦(我看得出什麼是業配文,不要說我笨)

所以我個人對【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板的評比如下

實用性:★★★★★

價格:★★★★☆

推薦度:★★★★☆

完整產品說明




品牌名稱

  •  

保固期

  • 6年

顏色

  • 黑色
  • 單色

來源

  • 公司貨

保固期

  • 7天保固期
  • 7天 新品瑕疵;6年保固

    保固僅針對商品之主體, 商品之附件、配件或其他消耗性材料, 不在保固範圍內。 人為因素、意外、不當使用、自行變更商品之零件、天然災害或電力問題所造成之情形, 不在保固範圍內。 超過保固期限之商品, 不在保固範圍內。 保固標籤或防拆裝置遭更改或破壞時, 不在保固範圍內。

商品規格

  • 品牌 Leofoto徠圖

    產品型號 適用雲台 材質 產品總長 長板長度 長板寬度 長板厚度 重量
    VR-400 阿卡標準雲台 鋁合金 507mm 400mm 38mm 10mm 330g

 

非常推薦【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板給大家

↓↓↓【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板限量特惠的優惠按鈕↓↓↓

↓↓↓找不到喜歡的款式嗎?下方有其他最新優惠讓你選喔↓↓↓

PTT鄉民限量,團購,限時,週年慶,【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板禮物,優惠,特價,開箱,比價【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板,活動,好評,推薦

【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板01網友哪裡便宜,採購,優缺點,試用,【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板好用,【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板CP值,經驗,好康,集購,下殺,免比價,去哪買?,

名人推薦介紹,【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板部落客,排行,體驗,精選,限定,折扣,【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板折價卷,ptt,蝦皮拍賣,Dcard推薦評比開箱

家電選購指南!【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板牌子好
如何選購【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板哪個牌子好
新手選購有技巧!部落客大推【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板這牌子好
【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板好用
這個家電品牌子好【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板你不能錯過
具備了哪些功能的【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板好用?如何選購

↓↓↓【Leofoto 徠圖】VR-400 單眼鏡頭支架長焦托架快拆板限量特惠的優惠按鈕↓↓↓

熱點新知搶先報

 

面向對象主要針對面向過程。 面向過程的基本單元是函數。 什麼是對象:EVERYTHING IS OBJECT(萬物皆對象) 所有的事物都有兩個方面: 有什麼(屬性):用來描述對象。 能夠做什麼(方法):告訴外界對象有那些功能。 後者以前者為基礎。 大的對象的屬性也可以是一個對象。 為什麼要使用面向對象: 首先,面向對象符合人類看待事物的一般規律。 對象的方法的實現細節是屏蔽的,只有對象方法的實現者了解細節。 方法的定義非常重要。方法有參數,也可能有返回值。 注意區分:對象(本身)、對象的實現者、對象的調用者。 分析對象主要從方法開始。 我們通過類來看待對象,類是對象的抽象。 其次,採用面向對象方法可以使系統各部門各司其職、各盡所能。 對象之間的耦合性一定要低(比如不同硬碟和不同主板之間的關係)。這樣才能使每個對象本身做成最好的。 對於對象的要求:高內聚、低耦合,這樣容易拼裝成為一個系統。 實現高內聚就是要最大限度低提高復用性(復用性好是因為高內聚)。 可復用性是OOP的基礎。 比較面向過程的思想和面向對象的思想: 面向過程的思想:由過程、步驟、函數組成,以過程為核心; 面向對象的思想:以對象為中心,先開發類,得到對象,通過對象之間相互通信實現功能。 面向過程是先有算法,後有數據結構。 面向對象是先有數據結構,然後再有算法。 在用面向對象思想開發的過程中,可以復用對象就進行復用,如無法進行復用則開發新的對象。 開發過程是用對個簡單的對象的多個簡單的方法,來實現複雜的功能 。 從語法上來看,一個類是一個新的數據類型。 在面向對象編程中,除了簡單數據類型,就是對象類型。 定義類的格式: class Student{ 代碼 } 注意類名中單詞的首字母大寫。 實例變量:定義在類中但在任何方法之外。(New出來的均有初值) 局部變量:定義在方法之中的變量。 局部變量要先賦值,再進行運算,而實例變量均已經賦初值。這是局部變量和實例變量的一大區別。 實例變量的對象賦值為null。 局部變量不允許範圍內定義兩個同名變量。實例變量的作用域在本類中完全有效,當被其他的類調用的時候也可能有效。 實例變量和局部變量允許命名衝突。 書寫方法和格式: 修飾符 返回值 方法名 調用過程中 方法體 可能出現的例外 public int/void addNumber(參數) throw Excepion {} 例: public int addNumber(int a,int b){} 註:方法名中的參數int a,int b為局部變量 類方法中的一類特殊方法:構造方法。 構造方法是當用類生成對象時,系統在生成對象的過程中利用的方法。 注意:構造方法在生成對象的時候會被調用,但並不是構造方法生成了對象。 構造方法沒有返回值。格式為:public 方法名。 構造方法的方法名與類名相同。 構造方法是在對象生成的過程中自動調用,不可能利用指令去調用。 在一個對象的生成周期中構造方法只用一次,一旦這個對象生成,那麼這個構造方法失效。 用類來生成對象的語句: Student s=new Student。 第一個Student表示這是用Student類進行定義。「Student」表示調用一個無參數的構造方法。 如果中有參數,則系統構造對象的過程中調用有參的方法。 此時S稱為一個對象變量。 Student s的存儲區域存放的是地址:一個對象在硬碟上占有一個連續地址,首地址賦予s空間。 S稱為對象Student的引用。 注意:在對象變量中存放的是引用(地址);在簡單變量中存放的是數值。 可以構造多個構造方法,但多個構造方法的參數表一定不同,參數順序不同即屬於不同的構造方法: public student(string name,int a){} public student(int a,string name){} 為兩個不同的構造方法。 如果我們未給系統提供一個構造方法,那麼系統會自動提供一個為空的構造方法。 練習:寫一個類,定義一個對象,定義兩個構造方法:一個有參,一個無參。 (編寫一個程序驗證對象的傳遞的值為地址) 注意下面這種形式: static void changename(student stu){stu.setName 「LUCY」} 注意生成新的對象與舊對象指向無關,生成新對象生命消亡與舊對象無關。 面向對象方法的重載(overloading)和覆蓋(overriding)。 在有些JAVA書籍中將overriding稱為重載,overloading稱為過載。 Overloading在一個類中可以定義多個同名方法,各個方法的參數表一定不同。但修飾詞可能相同,返回值也可能相同。 在程序的編譯過程中根據變量類型來找相應的方法。因此也有人認為 overloading是編譯時的多態,以後我們還會學到運行時多態。 為什麼會存在overloading技術呢?作為應對方法的細節。 利用類型的差異來影響對方法的調用。 吃可以分為吃肉,吃菜,吃藥,在一個類中可以定義多個吃方法。 構造方法也可以實現overloading。例: public void teach{}; public void teach(int a){}; public void teach(String a){}為三種不同的方法。 Overloading方法是從低向高轉。 Byte—short—float—int—long—double。 在構造方法中,this表示本類的其他構造方法: student{}; student(string n){ this;//表示調用student } 如果調用student(int a)則為this(int a)。 特別注意:用this調用其他構造方法時,this必須為第一條語句,然後才是其他語句。 This表示當前對象。 Public void printNum{ Int number=40; System.out.println(this.number); } 此時列印的是實例變量,而非局部變量,即定義在類中而非方法中的變量。 This.number表示實例變量。 誰調用this.number那麼誰即為當前(this)對象的number方法。 封裝:使對象的屬性儘可能私有,對象的方法儘可能的公開。用private表示此成員屬性為該類的私有屬性。 Public表示該屬性(方法)公開; Private表示該屬性(方法)為只有本類內部可以訪問(類內部可見)。 (想用private還要用set和get方法供其他方法調用,這樣可以保證對屬性的訪問方式統一,並且便於維護訪問權限以及屬性數據合法性) 如果沒有特殊情況,屬性一定私有,方法該公開的公開。 如果不指明誰調用方法,則默認為this。 區分實例變量和局部變量時一定要寫this。 11.29 繼承: 父類(SuperClass)和 子類(SonClass)。 父類的非私有化屬性和方法可以默認繼承到子類。 Class Son extends Father{} 而如果父類中的私有方法被子類調用的話,則編譯報錯。 父類的構造方法子類不可以繼承,更不存在覆蓋的問題。(非構造方法可以) 如果子類訪問父類的構造方法,則在編譯的時候提示訪問不到該方法。 JAVA中不允許多繼承,一個類有且只有一個父類(單繼承)。 JAVA的數據結構為樹型結構,而非網狀。(JAVA通過接口和內部類實現多繼承) 方法的覆蓋(overriding) 方法的重載並不一定是在一個類中:子類可以從父類繼承一個方法,也可以定義一個同名異參的方法,也稱為overloading。 當子類從父類繼承一個無參方法,而又定義了一個同樣的無參方法,則子類新寫的方法覆蓋父類的方法,稱為覆蓋。(注意返回值類型也必須相同,否則編譯出錯。) 如果方法不同,則成重載。 對於方法的修飾詞,子類方法要比父類的方法範圍更加的寬泛。 父類為public,那么子類為private則出現錯誤。 之所以構造方法先運行父類再運行子類是因為構造方法是無法覆蓋的。 以下範圍依次由嚴到寬: private :本類訪問; default :表示默認,不僅本類訪問,而且是同包可見。 Protected:同包可見+不同包的子類可見 Public :表示所有的地方均可見。 當構造一個對象的時候,系統先構造父類對象,再構造子類對象。 構造一個對象的順序:(注意:構造父類對象的時候也是這幾步) ① 遞歸地構造父類對象; ② 順序地調用本類成員屬性賦初值語句; ③ 本類的構造方法。 Super表示調用父類的構造方法。 Super也和this一樣必須放在第一行。 This用於調用本類的構造方法。 如果沒有定義構造方法,那麼就會調用父類的無參構造方法,即super。 要養成良好的編程習慣:就是要加上默認的父類無參的構造方法。 思考:可是如果我們沒有定義無參的構造方法,而在程序中構造了有參的構造方法,那麼如果方法中沒有參數,那麼系統還會調用有參的構造方法麼?應該不會。 多態:多態指的是編譯時類型變化,而運行時類型不變。 多態分兩種: ① 編譯時多態:編譯時動態重載; ② 運行時多態:指一個對象可以具有多個類型。 對象是客觀的,人對對象的認識是主觀的。 例: Animal a=new Dog;查看格式名稱; Dog d=(Dog)a。聲明父類來引用子類。 (思考上面的格式) 運行時多態的三原則:(應用時為覆蓋) 1、 對象不變;(改變的是主觀認識) 2、 對於對象的調用只能限於編譯時類型的方法,如調用運行時類型方法報錯。 在上面的例子中:Animal a=new Dog;對象a的編譯時類型為Animal,運行時類型為dog。 注意:編譯時類型一定要為運行時類型的父類(或者同類型)。 對於語句:Dog d=(Dog)a。將d強制聲明為a類型,此時d為Dog,此時d就可以調用運行時類型。注意:a和d指向同一對象。 3、 在程序的運行時,動態類型判定。運行時調用運行時類型,即它調用覆蓋後的方法。 關係運算符:instanceof a instanceof Animal;(這個式子的結果是一個布爾表達式) a為對象變量,Animal是類名。 上面語句是判定a是否可以貼Animal標籤。如果可以貼則返回true,否則返回false。 在上面的題目中: a instanceof Animal返回 True, a instanceof Dog也返回 True, instanceof用於判定是否將前面的對象變量賦值後邊的類名。 Instanceof一般用於在強制類型轉換之前判定變量是否可以強制轉換。 如果Animal a=new Animal; Dog d=Doga; 此時編譯無誤,但運行則會報錯。 Animal a=new Dog相當於下面語句的功能: Animal a=getAnimal; Public static Animal.getAnimal; Return new Dog; 封裝、繼承、多態為面向對象的三大基石(特性)。 運行時的動態類型判定針對的是方法。運行程序訪問的屬性仍為編譯時屬性。 Overloading針對的是編譯時類型,不存在運行時的多態。 習題:建立一個shape類,有circle和rect子類。 Shape類有zhouchang和area兩種方法。 (正方形)squ為rect子類,rect有cha用於比較長寬的差。 覆蓋時考慮子類的private及父類的public(考慮多態),之所以這樣是避免調用A時出現實際調用B的情況。而出現錯誤。 11.29下午講的是教程上的Module6 Module6-7包括:面向對象高級、內部類、集合、反射(暫時不講)、例外。 面向對象高級、集合和例外都是面向對象的核心內容。 面向對象高級: 修飾符: static:①可修飾變量(屬性);②可修飾方法;③可修飾代碼塊。 Static int data語句說明data為類變量,為一個類的共享變量,屬於整個類。 Int data為實例變量。 例: static int data; m1.data=0; m1.data++的結果為1,此時m2.data的結果也為1。 Static定義的是一塊為整個類共有的一塊存儲區域,其發生變化時訪問到的數據都時經過變化的。 其變量可以通過類名去訪問:類名.變量名。與通過訪問對象的編譯時類型訪問類變量為等價的。 Public static void printData{} 表明此類方法為類方法(靜態方法) 靜態方法不需要有對象,可以使用類名調用。 靜態方法中不允許訪問類的非靜態成員,包括成員的變量和方法,因為此時是通過類調用的,沒有對象的概念。This.data是不可用的。 一般情況下,主方法是靜態方法,所以可調用靜態方法,主方法為靜態方法是因為它是整個軟體系統的入口,而進入入口時系統中沒有任何對象,只能使用類調用。 覆蓋不適用於靜態方法。 靜態方法不可被覆蓋。(允許在子類中定義同名靜態方法,但是沒有多態,嚴格的講,方法間沒有多態就不能稱為覆蓋) 當static修飾代碼塊時(註:此代碼塊要在此類的任何一個方法之外),那麼這個代碼塊在代碼被裝載進虛擬機生成對象的時候可被裝載一次,以後再也不執行了。 一般靜態代碼塊被用來初始化靜態成員。 Static通常用於Singleton模式開發: Singleton是一種設計模式,高於語法,可以保證一個類在整個系統中僅有一個對象。 11.30 final可以修飾類、屬性、方法。 當用final修飾類的時候,此類不可被繼承,即final類沒有子類。這樣可以用final保證用戶調用時動作的一致性,可以防止子類覆蓋情況的發生。 當利用final修飾一個屬性(變量)的時候,此時的屬性成為常量。 JAVA利用final定義常量(注意在JAVA命名規範中常量需要全部字母都大寫): Final int AGE=10; 常量的地址不可改變,但在地址中保存的值(即對象的屬性)是可以改變的。 Final可以配合static使用。 ? Static final int age=10; 在JAVA中利用public static final的組合方式對常量進行標識(固定格式)。 對於在構造方法中利用final進行賦值的時候,此時在構造之前系統設置的默認值相對於構造方法失效。 常量(這裡的常量指的是實例常量:即成員變量)賦值: ①在初始化的時候通過顯式聲明賦值。Final int x=3; ②在構造的時候賦值。 局部變量可以隨時賦值。 利用final定義方法:這樣的方法為一個不可覆蓋的方法。 Public final void print{}; 為了保證方法的一致性(即不被改變),可將方法用final定義。 如果在父類中有final定義的方法,那麼在子類中繼承同一個方法。 如果一個方法前有修飾詞private或static,則系統會自動在前面加上final。即private和static方法默認均為final方法。 註:final並不涉及繼承,繼承取決於類的修飾符是否為private、default、protected還是public。也就是說,是否繼承取決於這個方法對於子類是否可見。 Abstract(抽象)可以修飾類、方法 如果將一個類設置為abstract,則此類必須被繼承使用。此類不可生成對象,必須被繼承使用。 Abstract可以將子類的共性最大限度的抽取出來,放在父類中,以提高程序的簡潔性。 Abstract雖然不能生成對象,但是可以聲明,作為編譯時類型,但不能作為運行時類型。 Final和abstract永遠不會同時出現。 當abstract用於修飾方法時,此時該方法為抽象方法,此時方法不需要實現,實現留給子類覆蓋,子類覆蓋該方法之後方法才能夠生效。 注意比較: private void print{};此語句表示方法的空實現。 Abstract void print; 此語句表示方法的抽象,無實現。 如果一個類中有一個抽象方法,那麼這個類一定為一個抽象類。 反之,如果一個類為抽象類,那麼其中可能有非抽象的方法。 如果讓一個非抽象類繼承一個含抽象方法的抽象類,則編譯時會發生錯誤。因為當一個非抽象類繼承一個抽象方法的時候,本著只有一個類中有一個抽象方法,那麼這個類必須為抽象類的原則。這個類必須為抽象類,這與此類為非抽象衝突,所以報錯。 所以子類的方法必須覆蓋父類的抽象方法。方法才能夠起作用。 只有將理論被熟練運用在實際的程序設計的過程中之後,才能說理論被完全掌握! 為了實現多態,那麼父類必須有定義。而父類並不實現,留給子類去實現。此時可將父類定義成abstract類。如果沒有定義抽象的父類,那麼編譯會出現錯誤。 Abstract和static不能放在一起,否則便會出現錯誤。(這是因為static不可被覆蓋,而abstract為了生效必須被覆蓋。) 例:(本例已存在CODINGabstractTestClass.java文件中) public class TestClass{ public static void main(String args){ SuperClass sc=new SubClass; Sc.print; } Abstract class SuperClass{ Abstract void print;} } class SubClass extends SuperClass{ void print{ System.out.println(「print」);} } JAVA的核心概念:接口(interface) 接口與類屬於同一層次,實際上,接口是一種特殊的抽象類。 如: interface IA{ } public interface:公開接口 與類相似,一個文件只能有一個public接口,且與文件名相同。 在一個文件中不可同時定義一個public接口和一個public類。 一個接口中,所有方法為公開、抽象方法;所有的屬性都是公開、靜態、常量。 一個類實現一個接口的格式: class IAImple implements IA{ }; 一個類實現接口,相當於它繼承一個抽象類。 類必須實現接口中的方法,否則其為一抽象類。 實現中接口和類相同。 接口中可不寫public,但在子類中實現接口的過程中public不可省。 (如果剩去public則在編譯的時候提示出錯:對象無法從接口中實現方法。) 註: ① 一個類除繼承另外一個類,還可以實現接口; class IAImpl extends java.util.Arrylist implement IA{} 繼承類 實現接口 這樣可以實現變相的多繼承。 ② 一個類只能繼承另外一個類,但是它可以繼承多個接口,中間用「,」隔開。 Implements IA,IB 所謂實現一個接口,就是指實現接口中的方法。 ③ 接口和接口之間可以定義繼承關係,並且接口之間允許實現多繼承。 例:interface IC extends IA,IB{}; 接口也可以用於定義對象 IA I=new IAImpl; 實現的類從父類和接口繼承的都可做運行時類型。 IAImple extends A implement IA,IB IB I=new IAImple; I instance of IAImple; I instance of A; I instance of IA; I instance of IB; 返回的結果均為true. 接口和多態都為JAVA技術的核心。 接口往往被我們定義成一類XX的東西。 接口實際上是定義一個規範、標準。 ① 通過接口可以實現不同層次、不同體系對象的共同屬性; 通過接口實現write once as anywhere. 以JAVA資料庫連接為例子:JDBC制定標準;數據廠商實現標準;用戶使用標準。 接口通常用來屏蔽底層的差異。 ②接口也因為上述原因被用來保持架構的穩定性。 JAVA中有一個特殊的類: Object。它是JAVA體系中所有類的父類(直接父類或者間接父類)。 此類中的方法可以使所的類均繼承。 以下介紹的三種方法屬於Object: (1) finalize方法:當一個對象被垃圾回收的時候調用的方法。 (2) toString:是利用字符串來表示對象。 當我們直接列印定義的對象的時候,隱含的是列印toString的返回值。 可以通過子類作為一個toString來覆蓋父類的toString。 以取得我們想得到的表現形式,即當我們想利用一個自定義的方式描述對象的時候,我們應該覆蓋toString。 (3)equal 首先試比較下例: String A=new String(「hello」); String A=new String(「hello」); A==B(此時程序返回為FALSE) 因為此時AB中存的是地址,因為創建了新的對象,所以存放的是不同的地址。 附加知識: 字符串類為JAVA中的特殊類,String中為final類,一個字符串的值不可重複。因此在JAVA VM(虛擬機)中有一個字符串池,專門用來存儲字符串。如果遇到String a=」hello」時(注意沒有NEW,不是創建新串),系統在字符串池中尋找是否有」hello」,此時字符串池中沒有」hello」,那麼系統將此字符串存到字符串池中,然後將」hello」在字符串池中的地址返回a。如果系統再遇到String b=」hello」,此時系統可以在字符串池中找到 「hello」。則會把地址返回b,此時a與b為相同。 String a=」hello」; System.out.println(a==」hello」); 系統的返回值為true。 故如果要比較兩個字符串是否相同(而不是他們的地址是否相同)。可以對a調用equal: System.out.println(a.equal(b)); equal用來比較兩個對象中字符串的順序。 a.equal(b)是a與b的值的比較。 注意下面程序: student a=new student(「LUCY」,20); student b=new student(「LUCY」,20); System.out.println(a==b); System.out.println(a.equal(b)); 此時返回的結果均為false。 以下為定義equal(加上這個定義,返回ture或false) public boolean equals(Object o){ student s=(student)o; if (s.name.equals(this.name)&&s.age==this.age) else return false; }如果equals返回的值為 以下為實現標準equals的流程: public boolean equals(Object o){ if (this==o) return trun; //此時兩者相同 if (o==null) return false; if (! o instanceof strudent) return false; //不同類 studeng s=(student)o; //強制轉換 if (s.name.equals(this.name)&&s.age==this.age) return true; else return false; } 以上過程為實現equals的標準過程。 練習:建立一個employee類,有String name,int id,double salary.運用get和set方法,使用toString,使用equals。 封裝類: JAVA為每一個簡單數據類型提供了一個封裝類,使每個簡單數據類型可以被Object來裝載。 除了int和char,其餘類型首字母大寫即成封裝類。 轉換字符的方式: int I=10; String s=I+」 」; String s1=String.valueOf(i); Int I=10; Interger I_class=new integer(I); 看javadoc的幫助文檔。 附加內容: 「==」在任何時候都是比較地址,這種比較永遠不會被覆蓋。 程式設計師自己編寫的類和JDK類是一種合作關係。(因為多態的存在,可能存在我們調用JDK類的情況,也可能存在JDK自動調用我們的類的情況。) 注意:類型轉換中doubleintergerstring之間的轉換最多。 12.01 內部類: (註:所有使用內部類的地方都可以不用內部類,使用內部類可以使程序更加的簡潔,便於命名規範和劃分層次結構)。 內部類是指在一個外部類的內部再定義一個類。 內部類作為外部類的一個成員,並且依附於外部類而存在的。 內部類可為靜態,可用PROTECTED和PRIVATE修飾。(而外部類不可以:外部類只能使用PUBLIC和DEFAULT)。 內部類的分類: 成員內部類、 局部內部類、 靜態內部類、 匿名內部類(圖形是要用到,必須掌握)。 ① 成員內部類:作為外部類的一個成員存在,與外部類的屬性、方法並列。 內部類和外部類的實例變量可以共存。 在內部類中訪問實例變量:this.屬性 在內部類訪問外部類的實例變量:外部類名.this.屬性。 成員內部類的優點: ⑴內部類作為外部類的成員,可以訪問外部類的私有成員或屬性。(即使將外部類聲明為PRIVATE,但是對於處於其內部的內部類還是可見的。) ⑵用內部類定義在外部類中不可訪問的屬性。這樣就在外部類中實現了比外部類的private還要小的訪問權限。 注意:內部類是一個編譯時的概念,一旦編譯成功,就會成為完全不同的兩類。 對於一個名為outer的外部類和其內部定義的名為inner的內部類。編譯完成後出現outer.class和outer$inner.class兩類。 (編寫一個程序檢驗:在一個TestOuter.java程序中驗證內部類在編譯完成之後,會出現幾個class.) 成員內部類不可以有靜態屬性。(為什麼?) 如果在外部類的外部訪問內部類,使用out.inner. 建立內部類對象時應注意: 在外部類的內部可以直接使用inner s=new inner;(因為外部類知道inner是哪個類,所以可以生成對象。) 而在外部類的外部,要生成(new)一個內部類對象,需要首先建立一個外部類對象(外部類可用),然後在生成一個內部類對象。 Outer.Inner in=Outer.new.Inner。 錯誤的定義方式: Outer.Inner in=new Outer.Inner。 注意:當Outer是一個private類時,外部類對於其外部訪問是私有的,所以就無法建立外部類對象,進而也無法建立內部類對象。 ② 局部內部類:在方法中定義的內部類稱為局部內部類。 與局部變量類似,在局部內部類前不加修飾符public和private,其範圍為定義它的代碼塊。 注意:局部內部類不僅可以訪問外部類實例變量,還可以訪問外部類的局部變量(但此時要求外部類的局部變量必須為final)?? 在類外不可直接生成局部內部類(保證局部內部類對外是不可見的)。 要想使用局部內部類時需要生成對象,對象調用方法,在方法中才能調用其局部內部類。 ③ 靜態內部類:(注意:前三種內部類與變量類似,所以可以對照參考變量) 靜態內部類定義在類中,任何方法外,用static定義。 靜態內部類只能訪問外部類的靜態成員。 生成(new)一個靜態內部類不需要外部類成員:這是靜態內部類和成員內部類的區別。靜態內部類的對象可以直接生成: Outer.Inner in=new Outer.Inner; 而不需要通過生成外部類對象來生成。這樣實際上使靜態內部類成為了一個頂級類。 靜態內部類不可用private來進行定義。例子: 對於兩個類,擁有相同的方法: People { run; } Machine{ run; } 此時有一個robot類: class Robot extends People implement Machine. 此時run不可直接實現。 注意:當類與接口(或者是接口與接口)發生方法命名衝突的時候,此時必須使用內部類來實現。 用接口不能完全地實現多繼承,用接口配合內部類才能實現真正的多繼承。 ④ 匿名內部類(必須掌握): 匿名內部類是一種特殊的局部內部類,它是通過匿名類實現接口。 IA被定義為接口。 IA I=new IA{}; 註:一個匿名內部類一定是在new的後面,用其隱含實現一個接口或實現一個類,沒有類名,根據多態,我們使用其父類名。 因其為局部內部類,那麼局部內部類的所有限制都對其生效。 匿名內部類是唯一一種無構造方法類。 匿名內部類在編譯的時候由系統自動起名Out$1.class。 如果一個對象編譯時的類型是接口,那麼其運行的類型為實現這個接口的類。 因匿名內部類無構造方法,所以其使用範圍非常的有限。 (下午:)Exception(例外/異常)(教程上的MODEL7) 對於程序可能出現的錯誤應該做出預案。 例外是程序中所有出乎意料的結果。(關係到系統的健壯性) JAVA會將所有的錯誤封裝成為一個對象,其根本父類為Throwable。 Throwable有兩個子類:Error和Exception。 一個Error對象表示一個程序錯誤,指的是底層的、低級的、不可恢復的嚴重錯誤。此時程序一定會退出,因為已經失去了運行所必須的物理環境。 對於Error錯誤我們無法進行處理,因為我們是通過程序來應對錯誤,可是程序已經退出了。 我們可以處理的Throwable對象中只有Exception對象(例外/異常)。 Exception有兩個子類:Runtime exception(未檢查異常) 非Runtime exception(已檢查異常) (注意:無論是未檢查異常還是已檢查異常在編譯的時候都不會被發現,在編譯的過程中檢查的是程序的語法錯誤,而異常是一個運行時程序出錯的概念。) 在Exception中,所有的非未檢查異常都是已檢查異常,沒有另外的異常!! 未檢查異常是因為程式設計師沒有進行必要的檢查,因為他的疏忽和錯誤而引起的異常。一定是屬於虛擬機內部的異常(比如空指針)。 應對未檢查異常就是養成良好的檢查習慣。 已檢查異常是不可避免的,對於已檢查異常必須實現定義好應對的方法。 已檢查異常肯定跨越出了虛擬機的範圍。(比如「未找到文件」) 如何處理已檢查異常(對於所有的已檢查異常都要進行處理): 首先了解異常形成的機制: 當一個方法中有一條語句出現了異常,它就會throw(拋出)一個例外對象,然後後面的語句不會執行返回上一級方法,其上一級方法接受到了例外對象之後,有可能對這個異常進行處理,也可能將這個異常轉到它的上一級。 對於接收到的已檢查異常有兩種處理方式:throws和try方法。 注意:出錯的方法有可能是JDK,也可能是程式設計師寫的程序,無論誰寫的,拋出一定用throw。 例:public void print throws Exception. 對於方法a,如果它定義了throws Exception。那麼當它調用的方法b返回異常對象時,方法a並不處理,而將這個異常對象向上一級返回,如果所有的方法均不進行處理,返回到主方法,程序中止。(要避免所有的方法都返回的使用方法,因為這樣出現一個很小的異常就會令程序中止)。 如果在方法的程序中有一行throw new Exception,返回錯誤,那麼其後的程序不執行。因為錯誤返回後,後面的程序肯定沒有機會執行,那麼JAVA認為以後的程序沒有存在的必要。 對於try……catch格式: try {可能出現錯誤的代碼塊} catch(exception e){進行處理的代碼} ; 對象變量的聲明 用這種方法,如果代碼正確,那麼程序不經過catch語句直接向下運行; 如果代碼不正確,則將返回的異常對象和e進行匹配,如果匹配成功,則處理其後面的異常處理代碼。(如果用exception來聲明e的話,因為exception為所有exception對象的父類,所有肯定匹配成功)。處理完代碼後這個例外就完全處理完畢,程序會接著從出現異常的地方向下執行(是從出現異常的地方還是在catch後面呢?利用程序進行驗證)。最後程序正常退出。 Try中如果發現錯誤,即跳出try去匹配catch,那麼try後面的語句就不會被執行。 一個try可以跟進多個catch語句,用於處理不同情況。當一個try只能匹配一個catch。 我們可以寫多個catch語句,但是不能將父類型的exception的位置寫在子類型的excepiton之前,因為這樣父類型肯定先於子類型被匹配,所有子類型就成為廢話。JAVA編譯出錯。 在try,catch後還可以再跟一子句finally。其中的代碼語句無論如何都會被執行(因為finally子句的這個特性,所以一般將釋放資源,關閉連接的語句寫在裡面)。 如果在程序中書寫了檢查(拋出)exception但是沒有對這個可能出現的檢查結果進行處理,那麼程序就會報錯。 而如果只有處理情況(try)而沒有相應的catch子句,則編譯還是通不過。 如何知道在編寫的程序中會出現例外呢 1. 調用方法,查看API中查看方法中是否有已檢查錯誤。 2. 在編譯的過程中看提示信息,然後加上相應的處理。 Exception有一個message屬性。在使用catch的時候可以調用: Catch(IOException e){System.out.println(e.message)}; Catch(IOException e){e.printStackTrace}; 上面這條語句回告訴我們出錯類型所歷經的過程,在調試的中非常有用。 開發中的兩個道理: ①如何控制try的範圍:根據操作的連動性和相關性,如果前面的程序代碼塊拋出的錯誤影響了後面程序代碼的運行,那麼這個我們就說這兩個程序代碼存在關聯,應該放在同一個try中。 ② 對已經查出來的例外,有throw(積極)和try catch(消極)兩種處理方法。 對於try catch放在能夠很好地處理例外的位置(即放在具備對例外進行處理的能力的位置)。如果沒有處理能力就繼續上拋。 當我們自己定義一個例外類的時候必須使其繼承excepiton或者RuntimeException。 Throw是一個語句,用來做拋出例外的功能。 而throws是表示如果下級方法中如果有例外拋出,那麼本方法不做處理,繼續向上拋出。 Throws後跟的是例外類型。 斷言是一種調試工具(assert) 其後跟的是布爾類型的表達式,如果表達式結果為真不影響程序運行。如果為假系統出現低級錯誤,在螢幕上出現assert信息。 Assert只是用於調試。在產品編譯完成後上線assert代碼就被刪除了。 方法的覆蓋中,如果子類的方法拋出的例外是父類方法拋出的例外的父類型,那麼編譯就會出錯:子類無法覆蓋父類。 結論:子類方法不可比父類方法拋出更多的例外。子類拋出的例外或者與父類拋出的例外一致,或者是父類拋出例外的子類型。或者子類型不拋出例外。 如果父類型無throws時,子類型也不允許出現throws。此時只能使用try catch。 練習:寫一個方法:int add(int a,int b) { return a+b; } 當a+b=100;拋出100為異常處理。 12.02 集合(從本部分開始涉及API) 集合是指一個對象容納了多個對象,這個集合對象主要用來管理維護一系列相似的對象。 數組就是一種對象。(練習:如何編寫一個數組程序,並進行遍歷。) java.util.*定義了一系列的接口和類,告訴我們用什麼類NEW出一個對象,可以進行超越數組的操作。 (註:JAVA1.5對JAVA1.4的最大改進就是增加了對范型的支持) 集合框架接口的分類:(分collection接口 和 map接口) JAVA中所有與集合有關的實現類都是這六個接口的實現類。 Collection接口:集合中每一個元素為一個對象,這個接口將這些對象組織在一起,形成一維結構。 List接口代表按照元素一定的相關順序來組織(在這個序列中順序是主要的),List接口中數據可重複。 Set接口是數學中集合的概念:其元素無序,且不可重複。(正好與List對應) SortedSet會按照數字將元素排列,為「可排序集合」。 Map接口中每一個元素不是一個對象,而是一個鍵對象和值對象組成的鍵值對(Key-Value)。 Key-Value是用一個不可重複的key集合對應可重複的value集合。(典型的例子是字典:通過頁碼的key值找字的value值)。 例子: key1—value1; key2—value2; key3—value3. SortedMap:如果一個Map可以根據key值排序,則稱其為SortedMap。(如字典) !!注意數組和集合的區別:數組中只能存簡單數據類型。Collection接口和Map接口只能存對象。 以下介紹接口: List接口:(介紹其下的兩個實現類:ArrayList和LinkedList) ArrayList和數組非常類似,其底層①也用數組組織數據,ArrayList是動態可變數組。 ① 底層:指存儲格式。說明ArrayList對象都是存在於數組中。 註:數組和集合都是從下標0開始。 ArrayList有一個add(Object o)方法用於插入數組。 ArrayList的使用:(完成這個程序) 先import java.util.*; 用ArrayList在一個數組中添加數據,並遍歷。 ArrayList中數組的順序與添加順序一致。 只有List可用get和size。而Set則不可用(因其無序)。 Collection接口都是通過Iterator(即疊代器)來對Set和List遍歷。 通過語句:Iterator it=c.iterator; 得到一個疊代器,將集合中所有元素順序排列。然後可以通過interator方法進行遍歷,疊代器有一個游標(指針)指向首位置。 Interator有hasNext,用於判斷元素右邊是否還有數據,返回True說明有。然後就可以調用next動作。Next會將游標移到下一個元素,並把它所跨過的元素返回。(這樣就可以對元素進行遍歷) 練習:寫一個程序,輸入對象信息,比較基本信息。 集合中每一個元素都有對象,如有字符串要經過強制類型轉換。 Collections是工具類,所有方法均為有用方法,且方法為static。 有Sort方法用於給List排序。 Collections.Sort分為兩部分,一部分為排序規則;一部分為排序算法。 規則用來判斷對象;算法是考慮如何排序。 對於自定義對象,Sort不知道規則,所以無法比較。這種情況下一定要定義排序規則。方式有兩種: ① java.lang下面有一個接口:Comparable(可比較的) 可以讓自定義對象實現一個接口,這個接口只有一個方法comparableTo(Object o) 其規則是當前對象與o對象進行比較,其返回一個int值,系統根據此值來進行排序。 如 當前對象>o對象,則返回值>0;(可將返回值定義為1) 如 當前對象=o對象,則返回值=0; 如 當前對象 看TestArraylist的java代碼。 我們通過返回值1和-1位置的調換來實現升序和降序排列的轉換。 ② java.util下有一個Comparator(比較器) 它擁有compare,用來比較兩個方法。 要生成比較器,則用Sort中Sort(List,List(Compate)) 第二種方法更靈活,且在運行的時候不用編譯。 注意:要想實現comparTo就必須在主方法中寫上implement comparable. 練習:生成一個EMPLOYEE類,然後將一系列對象放入到ArrayList。用Iterator遍歷,排序之後,再進行遍歷。 集合的最大缺點是無法進行類型判定(這個缺點在JAVA1.5中已經解決),這樣就可能出現因為類型不同而出現類型錯誤。 解決的方法是添加類型的判斷。 LinkedList接口(在代碼的使用過程中和ArrayList沒有什麼區別) ArrayList底層是object數組,所以ArrayList具有數組的查詢速度快的優點以及增刪速度慢的缺點。 而在LinkedList的底層是一種雙向循環鍊表。在此鍊表上每一個數據節點都由三部分組成:前指針(指向前面的節點的位置),數據,後指針(指向後面的節點的位置)。最後一個節點的後指針指向第一個節點的前指針,形成一個循環。 雙向循環鍊表的查詢效率低但是增刪效率高。所以LinkedList具有查詢效率低但增刪效率高的特點。 ArrayList和LinkedList在用法上沒有區別,但是在功能上還是有區別的。 LinkedList經常用在增刪操作較多而查詢操作很少的情況下:隊列和堆棧。 隊列:先進先出的數據結構。 堆棧:後進先出的數據結構。 注意:使用堆棧的時候一定不能提供方法讓不是最後一個元素的元素獲得出棧的機會。 LinkedList提供以下方法:(ArrayList無此類方法) addFirst; removeFirst; addLast; removeLast; 在堆棧中,push為入棧操作,pop為出棧操作。 Push用addFirst;pop用removeFirst,實現後進先出。 用isEmpty--其父類的方法,來判斷棧是否為空。 在隊列中,put為入隊列操作,get為出隊列操作。 Put用addFirst,get用removeLast實現隊列。 List接口的實現類(Vector)(與ArrayList相似,區別是Vector是重量級的組件,使用使消耗的資源比較多。) 結論:在考慮並發的情況下用Vector(保證線程的安全)。 在不考慮並發的情況下用ArrayList(不能保證線程的安全)。 面試經驗(知識點): java.util.stack(stack即為堆棧)的父類為Vector。可是stack的父類是最不應該為Vector的。因為Vector的底層是數組,且Vector有get方法(意味著它可能訪問到並不屬於最後一個位置元素的其他元素,很不安全)。 對於堆棧和隊列只能用push類和get類。 Stack類以後不要輕易使用。 !!!實現堆棧一定要用LinkedList。 (在JAVA1.5中,collection有queue來實現隊列。) Set-HashSet實現類: 遍歷一個Set的方法只有一個:疊代器(interator)。 HashSet中元素是無序的(這個無序指的是數據的添加順序和後來的排列順序不同),而且元素不可重複。 在Object中除了有final,toString,equals,還有hashCode。 HashSet底層用的也是數組。 當向數組中利用add(Object o)添加對象的時候,系統先找對象的hashCode: int hc=o.hashCode; 返回的hashCode為整數值。 Int I=hc%n;(n為數組的長度),取得餘數後,利用餘數向數組中相應的位置添加數據,以n為6為例,如果I=0則放在數組a[0]位置,如果I=1,則放在數組a[1]位置。如果equals返回的值為true,則說明數據重複。如果equals返回的值為false,則再找其他的位置進行比較。這樣的機制就導致兩個相同的對象有可能重複地添加到數組中,因為他們的hashCode不同。 如果我們能夠使兩個相同的對象具有相同hashcode,才能在equals返回為真。 在實例中,定義student對象時覆蓋它的hashcode。 因為String類是自動覆蓋的,所以當比較String類的對象的時候,就不會出現有兩個相同的string對象的情況。 現在,在大部分的JDK中,都已經要求覆蓋了hashCode。 結論:如將自定義類用hashSet來添加對象,一定要覆蓋hashcode和equals,覆蓋的原則是保證當兩個對象hashcode返回相同的整數,而且equals返回值為True。 如果偷懶,沒有設定equals,就會造成返回hashCode雖然結果相同,但在程序執行的過程中會多次地調用equals,從而影響程序執行的效率。 我們要保證相同對象的返回的hashCode一定相同,也要保證不相同的對象的hashCode儘可能不同(因為數組的邊界性,hashCode還是可能相同的)。例子: public int hashCode{ return name.hashcode+age; } 這個例子保證了相同姓名和年齡的記錄返回的hashCode是相同的。 使用hashSet的優點: hashSet的底層是數組,其查詢效率非常高。而且在增加和刪除的時候由於運用的hashCode的比較開確定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因為hashSet查詢和刪除和增加元素的效率都非常高。 但是hashSet增刪的高效率是通過花費大量的空間換來的:因為空間越大,取餘數相同的情況就越小。HashSet這種算法會建立許多無用的空間。 使用hashSet接口時要注意,如果發生衝突,就會出現遍歷整個數組的情況,這樣就使得效率非常的低。 練習:new一個hashset,插入employee對象,不允許重複,並且遍歷出來。 添加知識點: 集合對象存放的是一系列對象的引用。 例: Student S Al.add(s); s.setName(「lucy」); Student s2=(Student)(al.get(o1)); 可知s2也是s。

 

SREDD1515DEFE51YH

 

 

文章來源取自於:

 

 

壹讀 https://read01.com/8aQ3J0P.html

MOMO購物網 https://www.momoshop.com.tw/goods/GoodsDetail.jsp?i_code=7048709&memid=6000007380&cid=apuad&oid=1&osm=league

如有侵權,請來信告知,我們會立刻下架。

DMCA:dmca(at)kubonews.com

聯絡我們:contact(at)kubonews.com


【momo優惠試用心得】【momo購物中心折扣優惠開箱評價】【momo優惠購物優惠】【momo 1台折扣優惠開箱評價】
【富邦momo購物台電話折扣優惠開箱評價】 【SNOW TRAVEL】AH-4抗UV遮陽休閒帽臉+肩頸部防曬設計(防曬遮陽多功能抗UV戶外休閒)【momo優惠優惠折扣碼】 【EMPORIO ARMANI】飛行風格計時腕錶(AR11132)【momo購物 宅配折扣優惠開箱評價】 【BOSSWAY】自信超越鏤空機械錶(48mm)【富邦momo購物折扣優惠開箱評價】 【BeautyFocus】6件組沁涼舒適吸排棉寬肩內衣(3810M-XL)

arrow
arrow
    全站熱搜

    ghb123 發表在 痞客邦 留言(0) 人氣()