第52節:String,許可權修飾符,方法,集合

標題圖
String
String str1 = "dashu"; String str2 = "dashu"; String string = new String("dashu"); System.out.println(str1 == string); // 結果為 false
面試題目:這個語句建立了多少個物件?
new String("dashu");
這個答案為 1
或者 2
,因為如果 "dashu"
這個字面值如果在常量池中已經出現過,那麼就只建立一個物件,如果沒有出現過就會建立兩個物件, new
的出現一定會有一個物件被建立,所有確保有一個物件被建立.
String str1 = "dashu"; String str2 = "da" + "shu"; System.out.println(str1 == str2); // 結果為 true
為啥 str1 == str2
相等,是因為在編譯的時候已經為 "dashu"
字面值,已經拼接好了,所以進行比較時,就會相等.
String str1 = "dashu"; String str2 = "da"; String str3 = str2 + "shu"; System.out.println(str1 == str3); // 結果為 false
原理是通過 stringbuilder
的拼接方法,然後在呼叫 toString()
方法.
在 String
中有一個 intern()
方法,它返回的是常量池中字面值的地址,如果在常量池中沒有這個字面值,就會把這個字面值先加到常量表後,返回這個字面值的地址.
把上面的程式碼新增 intern()
試試:
String str1 = "dashu"; String str2 = "da"; String str3 = str2 + "shu"; System.out.println(str1 == str3.intern()); // 結果為 true
許可權修飾符
class Chirld{ public void publicMethod(){ // public為任何地方都可以通過子類的物件進行訪問 } protected void protectedMethod(){ // protected為私有方法,只能在子類中進行訪問 } private void privateMethod(){ // private為只能在本來進行訪問,除了子類可以呼叫,其他都不可以進行訪問這個方法 } } public Father extends Chirld{ public static void main(String[] args){ new Father().publicMethod(); new Father().protectedMethod(); } }
例項方法是什麼呢?不用 static
新增修飾的方法就是了,訪問例項方法,只能通過建立物件進行訪問.
什麼是類方法呢?就是用 static
新增修飾的方法就是了,訪問這個方法可以通過建立物件進行訪問,也可以通過類名進行呼叫進行訪問.
方法
方法的過載:方法名一樣,引數名不一樣
過載的出現就是為了解決操作同種方法的動作,但是型別不同的功能需求.
public Father extends Chirld{ public static void main(String[] args){ publilc void add(int a){ System.out.println(a+1); } publilc void add(long b){ System.out.println(b+1); } } }
方法的過載為編譯時的多型
// class GuoWang{ public void add(){ System.out.println("GuoWang"); } } // public class DaShu extends GuoWang{ public void add(){ System.out.println("DaShu"); } public static void main(String[] args){ // 變國王 GuoWang gw = new DaShu(); gw.add(); } } // DaShu
方法的多型,複寫父類的方法.方法的引數不一樣為過載,一樣為複寫.
變數的介紹格式: 變數型別 + 變數名
變數的作用是用來儲存資訊的容器
集合
集合也是容器,把擁有相同型別的變數儲存起來的,集合型別 + 集合名字.
Collection -> List -> ArrayList LinkedList -> Set -> hashSet treeset Map -> hashmap -> treemap
舉例:
// 原始碼 public interface List<E> extends Collection<E>{ int size(); boolean isEmpty(); .... }
public interface Collection<E> extends Iterable<E>{ int size(); boolean isEmpty(); ... }
集合中的常用方法:
Collection<E>
size():返回型別為 int.
isEmpty():返回型別為 boolean.
contains(Object):返回型別為 boolean.
iterator(): Iterator<E>
toArray(): Object[]
toArray(T[])<T>: T[]
add(E):返回型別為 boolean
remove(Object):返回型別為 boolean
containsAll(Collection<?>):返回型別為 boolean
addAll(Collection<? extends E>):返回型別為 boolean
removeAll(Collection<?>):返回型別為 boolean
retainAll(Colleciton<?>):返回型別為 boolean
clear():返回型別為 void
equals(Object):返回型別為 boolean
hashCode():i返回型別為 int
spliterator(): Spliterator<E>
stream(): Stream<E>
parallelStream(): Stream<E>
default Stream<E> stream(){ return StreamSupport.stream(spliterator(), false); }
介面的定義: public abstract 返回型別 方法名(引數)
,從 jdk1.8
開始可以實現方法了,用 default
修飾.
interface Student{ void go(); default void dohomework(){ System.out.println("dohomework"); } } // 實現介面 public class Dashu implements Student{ public static void mian(String[] args) throws Exception{ new Dashu().dohomework(); } @Override public void go(){} }
這個特性的引入是為了擴充套件介面中的方法
原始碼:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
public class ArrayList<E> extends AbstractList<E> implements List<E>,RandomAccess,Cloneable,java.io.Serializable
Collection<T>介面 -> AbstractCollection<E> List<T>介面 -> AbstractList<E>
往後餘生,唯獨有你
簡書作者:達叔小生
90後帥氣小夥,良好的開發習慣;獨立思考的能力;主動並且善於溝通
簡書部落格: ofollow,noindex">https://www.jianshu.com/u/c785ece603d1
結語
- 下面我將繼續對 其他知識 深入講解 ,有興趣可以繼續關注
- 小禮物走一走 or 點贊