[零基础学JAVA]Java SE面向对象部分-08.面向对象基础(03)
生活随笔
收集整理的這篇文章主要介紹了
[零基础学JAVA]Java SE面向对象部分-08.面向对象基础(03)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上季內容回顧: 1、封裝性
· 對外不不可見,屬性前加入private關鍵字
· 通過setter和getter方法設置和取得封裝屬性
2、構造方法
· 與類名稱相同,無返回值類型
· 在對象實例化(new)的時候被自動調用
· 構造方法可以重載
· 每個類中至少有一個構造方法
3、匿名對象:只使用一次的對象。 本季目標
1、 String類及常用方法?
??????? 本季詳細講解了JAVA中最常用的類 —— String的具體操作,包括字符串的比較,String類的特性,以及String類中一系列方法(包括賦值方法)的使用。 String類 因為String可以直接賦值
String肯定是一個類,如果按之前的理解,一個類要想使用必須使用new開辟空間或者把其他對象的引用傳遞過來。 String能否采用new的方式賦值呢?我們現在不知道哈~那我們就查下JDK文檔哈~ 在JavaTM 2 Platform Standard Edition 5.0 API規范中我們在索引查找String哈 我們看到其有點像整型變量哈,我們繼續往下看對象的比較哈~ 對象的比較 我們發現str1和str2輸出都是abc,但是比較后的結果卻是false哈~ 別著急哈,我們再定義一個str3,將str2的內容賦值給str3,這樣str2和str3同時指向同一個堆內存空間,然后我們再比較str2和str3 我們看下效果哈~ 我們發現str2和str3相比是true,為什么哈?實際上,在這個過程中,我們一起使用的是“==”比較哈,在int或其他基本數據類型之中,可以使用“==”進行是否相等的驗證,那么在String中,因為String本身雖然可以直接像基本數據類型那樣直接賦值,但是其依然要依靠內存的指向。
· “==”如果直接應用在字符串上進行比較,則表示比較的是內存地址的值。
· 如果要比較字符串里面的內容,則肯定要使用一個方法:此方法為String類的內部提供的一個方法:public boolean equals(String str)? ==> 比較兩個字符串是否相等。
· equals比較兩個字符串的內容是否相等的。 如果equals的方法我們不知道哈,那我們還是查找JDK文檔哈~ 從上面ooDemo01我們知道String是一個類,那str1、str2及str3就肯定是一個對象哈,我們可以這樣寫類似代碼哈str1.equals()來調用equals方法。 我們看下效果,我們發現str1、str2及str3相互比較的話,現在都相等,輸出true了哈~ 從而我們得到一個結論哈~:
“==”表示比較的是內存地址的值
equals表示比較兩個字符串的內容是否相等 在面試中經常會問到一個樣這樣的問題:說明“==”與equals的區別?區別的答案就是上面的結論哈~ String類中的內容一旦聲明則不可改變,這句話怎么理解呢?
String有匿名對象—— 字符串
現在我們假設有“abc”這樣一個字符串,“abc”就是String的匿名對象。 匿名對象是不是對象呢?我們知道當然是對象哈,那為什么“abc”就是匿名對象呢?我們看ooDemo03來理解哈~ 如果"abc"是一個匿名對象哈,那我們肯定可以使用"abc".equals(str1)來比較"abc"和str1的內容是否相同哈,我們看下效果,程序執行輸出為true,證明我們的推斷哈~“abc”肯定是一個匿名對象。 這樣我們就很好理解String str = "abc"是把一個字符串的匿名對象賦值給String的一個對象str。 String類中的內容一旦聲明則不可改變,現在我們就來理解這句話哈~,我們來觀察以下ooDemo04程序,分析內存,得出String是不可改變的哈~ 哈~有人說這可以改變哈~實際上不是這么回事哈,它根本沒有改變,我們來分析下內存操作哈~~ String str1="abc";證明棧內存中有個str1,在堆內存中的內容是abc。 str1 +="def"; 首先是先有“def”在堆內存中開辟空間哈~ 然后再進行str1 + "def"運算所得的字符串“abcdef”又在堆內存開辟空間哈~ 原來str1指向的是“abc”所占的堆內存空間,現在str1 + "def"運算所得的字符串“abcdef”又賦值給str1,所以str1先斷開指向“abc”的連接,最后str1就指向“abcdef”新的空間與其建立連接。 總結:雖然以上的顯示效果String的內容改變了,但是實際上而言,String改變的只是其內存地址的指向,而其本身的內容沒有被改變。所以說我們以后不要這樣寫代碼哈,因為這樣影響程序的性能哈~ 例如以下一段代碼: 我們發現,程序執行效果還是輸出了哈,但是其每一步的運算都要進行內存的轉換才能賦值給str1哈,循環運算100次哈,那么內存地址引用也要斷開重新連接100次哈,如果次數一多肯定會影響程序性能。 所以以上代碼的性能是很差的,因此在開發中堅決不建議這樣使用,如果非要有以上的要求,則可以使用另外一個類——StringBuffer,String的緩沖操作,這個類是可以改變的哈~~~這個我們以后再講哈~ 現在我們再來理解String是JAVA中共享模式的一種應用這句話哈~這是很多初學者最難理解的部分,我們來看下面一個例子ooDemo06 我們發現str1和str2比較的話是相等的哈~ ? 之前說,只要是字符串就是一個String 的匿名對象嗎?但是在String 類中如果一個字符串已經明確有了一個對象的指向,則以后其他的String對象如果聲明的內容是一樣的,則自動指向同一個空間。 我們還是來分析下內存的實際操作哈~ 首先是String str1="abc";這個我們現在都理解了哈~ 緊接著是String str2="abc";代碼哈,我們可能會想當然的認為在內存操作是這樣的哈~ 那我們說原來的“abc”有沒被引用到,我們知道原來的“abc”已經被str1引用,那么就不可能再生成另外一個“abc”,只會將原來的“abc”地址指向str2,那現在str1和str2都指向同一個內存空間地址,比如“abc”內存空間地址為0x1000哈,我們進行System.out.println(str1==str2);代碼中進行“==”比較時得到的運算結果就是true了哈~所以說如果內存中已經有相同內容的地址話,我們就不要再開辟新的空間了,如果沒有的話,那我們就要重新聲明開辟新的空間。 還有一個問題哈:String類直接賦值和使用new開辟空間有什么區別?該使用那個? 這個問題我們用所說到的知識來分析哈~ 直接賦值 如果使用new來賦值 在String str1 = new String("abc") ;代碼中我們知道“abc”是匿名對象,那么在堆內存中就會有塊空間是“abc”,緊接著new String("abc") 使用new在堆內存中又開辟了一個空間“abc”,最后String str1 = new String("abc") ;代碼將最后生成的“abc”內存地址指向str1,最早的一個“abc”就沒使用上。
String str1 = new String("abc") ;
會在堆內存中產生兩個對象,其中有一個是無用的。
綜合以上來說,肯定是直接使用賦值的方式比較合適一些,因為只產生一個對象,而如果使用new 關鍵字開辟,則會產生兩個對象。 在對象的比較中,我們還有個問題哈,如何比較兩個對象的內容是否相等。 我們定一個這樣的要求哈:
定義一個Person對象,里面包含name 和age,產生兩個Person對象,如果姓名和年齡相等,則認為兩個對象表示的是同一個人。 我們程序執行下哈~ok,程序顯示是同一個人哈~ 這樣就比較兩個對象的內容是否相等哈。 String作為系統提供好的一個類,在實際開發中有很大的作用,而且String操作方法也很多哈~ 1、 求出字符串的長度:public int length() ; 我們還是來查JDK文檔哈~ ??
ok,是34個哈~這樣我們就求出字符串的長度了哈~ 小的記憶錯誤:
· 數組的長度:數組名稱.length???? 這個沒()哈~~
· 字符串的長度:調用的是里面的方法:字符串對象.length()??? 這個有()哈~
2、將一個字符串變為字符數組:public char[] toCharArray() 確實把字符串一個個拆開轉換成數組了哈~ 3、將一個字符串按指定的字符分割:public String[] split() ; 這個方法很重要哈~以后使用會很多滴~ 我們看下效果,確實按“:”進行拆分了哈~ 4、截取字符串
· public String subString(int beg)
· public String subString(int beg,int end) 我們現在將定義的字符串[url]http://redking.blog.51cto.com[/url],讓其輸出redking.blog.51cto.com字符哈~ ok哈~ 如果只讓其輸出redking呢? 5、替換方法,把一個字符串中的某個指定的字符替換成其他內容
public String replaceAll(String 原字符串,String 要替換的新字符串) 已經替換了哈~ 6、去掉左右空格,輸入數據的時候常使用哈~
public String trim() ; 去掉左右空格了~ 7、將所有的字符串變為大寫或小寫 字符串Michael已經都變為大寫和小寫了哈~ 8、判斷一個字符串是否以指定的字符串開頭或結尾
· public boolean startsWith(String str):判斷是否以str開頭
· public boolean endsWith(String str):判斷是否以str結尾 9、查找在一個字符串中是否有指定的字符串存在。
public int indexOf(String str):查找在一個字符串中是否包含了str,如果包含了,則返回位置,如果沒有查到,則返回-1; 我們看下實例哈~ 我們查下字符串中有沒大寫的"X"哈~ 字符串$_$Michael@_@中沒有大寫的X哈,所以程序返回-1哈~ 那我們來查找下字符串中有沒大寫的"M"哈~ 我們知道字符串中是有大寫M的哈,所有下標都是從0開始,所以返回大寫“M”其位置3哈~ ? 我們可以利用返回值-1的關鍵來判斷是否查找到要查詢的字符串~ 驗證下,看看效果哈~ 我們講了下String中常用的方法哈,要深入研究就翻翻JDK文檔哈~ 總結 String類:
· 不可改變,如果要改變,改變的是內存地址的指向
· 兩種賦值方式的區別,使用直接賦值
· String的內容比較使用equals,==比較的是內存地址的值
· String中的各種常用方法。
· 對外不不可見,屬性前加入private關鍵字
· 通過setter和getter方法設置和取得封裝屬性
2、構造方法
· 與類名稱相同,無返回值類型
· 在對象實例化(new)的時候被自動調用
· 構造方法可以重載
· 每個類中至少有一個構造方法
3、匿名對象:只使用一次的對象。 本季目標
1、 String類及常用方法?
??????? 本季詳細講解了JAVA中最常用的類 —— String的具體操作,包括字符串的比較,String類的特性,以及String類中一系列方法(包括賦值方法)的使用。 String類 因為String可以直接賦值
String肯定是一個類,如果按之前的理解,一個類要想使用必須使用new開辟空間或者把其他對象的引用傳遞過來。 String能否采用new的方式賦值呢?我們現在不知道哈~那我們就查下JDK文檔哈~ 在JavaTM 2 Platform Standard Edition 5.0 API規范中我們在索引查找String哈 我們看到其有點像整型變量哈,我們繼續往下看對象的比較哈~ 對象的比較 我們發現str1和str2輸出都是abc,但是比較后的結果卻是false哈~ 別著急哈,我們再定義一個str3,將str2的內容賦值給str3,這樣str2和str3同時指向同一個堆內存空間,然后我們再比較str2和str3 我們看下效果哈~ 我們發現str2和str3相比是true,為什么哈?實際上,在這個過程中,我們一起使用的是“==”比較哈,在int或其他基本數據類型之中,可以使用“==”進行是否相等的驗證,那么在String中,因為String本身雖然可以直接像基本數據類型那樣直接賦值,但是其依然要依靠內存的指向。
· “==”如果直接應用在字符串上進行比較,則表示比較的是內存地址的值。
· 如果要比較字符串里面的內容,則肯定要使用一個方法:此方法為String類的內部提供的一個方法:public boolean equals(String str)? ==> 比較兩個字符串是否相等。
· equals比較兩個字符串的內容是否相等的。 如果equals的方法我們不知道哈,那我們還是查找JDK文檔哈~ 從上面ooDemo01我們知道String是一個類,那str1、str2及str3就肯定是一個對象哈,我們可以這樣寫類似代碼哈str1.equals()來調用equals方法。 我們看下效果,我們發現str1、str2及str3相互比較的話,現在都相等,輸出true了哈~ 從而我們得到一個結論哈~:
“==”表示比較的是內存地址的值
equals表示比較兩個字符串的內容是否相等 在面試中經常會問到一個樣這樣的問題:說明“==”與equals的區別?區別的答案就是上面的結論哈~ String類中的內容一旦聲明則不可改變,這句話怎么理解呢?
String有匿名對象—— 字符串
現在我們假設有“abc”這樣一個字符串,“abc”就是String的匿名對象。 匿名對象是不是對象呢?我們知道當然是對象哈,那為什么“abc”就是匿名對象呢?我們看ooDemo03來理解哈~ 如果"abc"是一個匿名對象哈,那我們肯定可以使用"abc".equals(str1)來比較"abc"和str1的內容是否相同哈,我們看下效果,程序執行輸出為true,證明我們的推斷哈~“abc”肯定是一個匿名對象。 這樣我們就很好理解String str = "abc"是把一個字符串的匿名對象賦值給String的一個對象str。 String類中的內容一旦聲明則不可改變,現在我們就來理解這句話哈~,我們來觀察以下ooDemo04程序,分析內存,得出String是不可改變的哈~ 哈~有人說這可以改變哈~實際上不是這么回事哈,它根本沒有改變,我們來分析下內存操作哈~~ String str1="abc";證明棧內存中有個str1,在堆內存中的內容是abc。 str1 +="def"; 首先是先有“def”在堆內存中開辟空間哈~ 然后再進行str1 + "def"運算所得的字符串“abcdef”又在堆內存開辟空間哈~ 原來str1指向的是“abc”所占的堆內存空間,現在str1 + "def"運算所得的字符串“abcdef”又賦值給str1,所以str1先斷開指向“abc”的連接,最后str1就指向“abcdef”新的空間與其建立連接。 總結:雖然以上的顯示效果String的內容改變了,但是實際上而言,String改變的只是其內存地址的指向,而其本身的內容沒有被改變。所以說我們以后不要這樣寫代碼哈,因為這樣影響程序的性能哈~ 例如以下一段代碼: 我們發現,程序執行效果還是輸出了哈,但是其每一步的運算都要進行內存的轉換才能賦值給str1哈,循環運算100次哈,那么內存地址引用也要斷開重新連接100次哈,如果次數一多肯定會影響程序性能。 所以以上代碼的性能是很差的,因此在開發中堅決不建議這樣使用,如果非要有以上的要求,則可以使用另外一個類——StringBuffer,String的緩沖操作,這個類是可以改變的哈~~~這個我們以后再講哈~ 現在我們再來理解String是JAVA中共享模式的一種應用這句話哈~這是很多初學者最難理解的部分,我們來看下面一個例子ooDemo06 我們發現str1和str2比較的話是相等的哈~ ? 之前說,只要是字符串就是一個String 的匿名對象嗎?但是在String 類中如果一個字符串已經明確有了一個對象的指向,則以后其他的String對象如果聲明的內容是一樣的,則自動指向同一個空間。 我們還是來分析下內存的實際操作哈~ 首先是String str1="abc";這個我們現在都理解了哈~ 緊接著是String str2="abc";代碼哈,我們可能會想當然的認為在內存操作是這樣的哈~ 那我們說原來的“abc”有沒被引用到,我們知道原來的“abc”已經被str1引用,那么就不可能再生成另外一個“abc”,只會將原來的“abc”地址指向str2,那現在str1和str2都指向同一個內存空間地址,比如“abc”內存空間地址為0x1000哈,我們進行System.out.println(str1==str2);代碼中進行“==”比較時得到的運算結果就是true了哈~所以說如果內存中已經有相同內容的地址話,我們就不要再開辟新的空間了,如果沒有的話,那我們就要重新聲明開辟新的空間。 還有一個問題哈:String類直接賦值和使用new開辟空間有什么區別?該使用那個? 這個問題我們用所說到的知識來分析哈~ 直接賦值 如果使用new來賦值 在String str1 = new String("abc") ;代碼中我們知道“abc”是匿名對象,那么在堆內存中就會有塊空間是“abc”,緊接著new String("abc") 使用new在堆內存中又開辟了一個空間“abc”,最后String str1 = new String("abc") ;代碼將最后生成的“abc”內存地址指向str1,最早的一個“abc”就沒使用上。
String str1 = new String("abc") ;
會在堆內存中產生兩個對象,其中有一個是無用的。
綜合以上來說,肯定是直接使用賦值的方式比較合適一些,因為只產生一個對象,而如果使用new 關鍵字開辟,則會產生兩個對象。 在對象的比較中,我們還有個問題哈,如何比較兩個對象的內容是否相等。 我們定一個這樣的要求哈:
定義一個Person對象,里面包含name 和age,產生兩個Person對象,如果姓名和年齡相等,則認為兩個對象表示的是同一個人。 我們程序執行下哈~ok,程序顯示是同一個人哈~ 這樣就比較兩個對象的內容是否相等哈。 String作為系統提供好的一個類,在實際開發中有很大的作用,而且String操作方法也很多哈~ 1、 求出字符串的長度:public int length() ; 我們還是來查JDK文檔哈~ ??
ok,是34個哈~這樣我們就求出字符串的長度了哈~ 小的記憶錯誤:
· 數組的長度:數組名稱.length???? 這個沒()哈~~
· 字符串的長度:調用的是里面的方法:字符串對象.length()??? 這個有()哈~
2、將一個字符串變為字符數組:public char[] toCharArray() 確實把字符串一個個拆開轉換成數組了哈~ 3、將一個字符串按指定的字符分割:public String[] split() ; 這個方法很重要哈~以后使用會很多滴~ 我們看下效果,確實按“:”進行拆分了哈~ 4、截取字符串
· public String subString(int beg)
· public String subString(int beg,int end) 我們現在將定義的字符串[url]http://redking.blog.51cto.com[/url],讓其輸出redking.blog.51cto.com字符哈~ ok哈~ 如果只讓其輸出redking呢? 5、替換方法,把一個字符串中的某個指定的字符替換成其他內容
public String replaceAll(String 原字符串,String 要替換的新字符串) 已經替換了哈~ 6、去掉左右空格,輸入數據的時候常使用哈~
public String trim() ; 去掉左右空格了~ 7、將所有的字符串變為大寫或小寫 字符串Michael已經都變為大寫和小寫了哈~ 8、判斷一個字符串是否以指定的字符串開頭或結尾
· public boolean startsWith(String str):判斷是否以str開頭
· public boolean endsWith(String str):判斷是否以str結尾 9、查找在一個字符串中是否有指定的字符串存在。
public int indexOf(String str):查找在一個字符串中是否包含了str,如果包含了,則返回位置,如果沒有查到,則返回-1; 我們看下實例哈~ 我們查下字符串中有沒大寫的"X"哈~ 字符串$_$Michael@_@中沒有大寫的X哈,所以程序返回-1哈~ 那我們來查找下字符串中有沒大寫的"M"哈~ 我們知道字符串中是有大寫M的哈,所有下標都是從0開始,所以返回大寫“M”其位置3哈~ ? 我們可以利用返回值-1的關鍵來判斷是否查找到要查詢的字符串~ 驗證下,看看效果哈~ 我們講了下String中常用的方法哈,要深入研究就翻翻JDK文檔哈~ 總結 String類:
· 不可改變,如果要改變,改變的是內存地址的指向
· 兩種賦值方式的區別,使用直接賦值
· String的內容比較使用equals,==比較的是內存地址的值
· String中的各種常用方法。
轉載于:https://blog.51cto.com/redking/122142
總結
以上是生活随笔為你收集整理的[零基础学JAVA]Java SE面向对象部分-08.面向对象基础(03)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 终于要考网络架构师了
- 下一篇: 承受海量访问建站方案