一、在一個類中重寫toString方法
public class Person {
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
// {name=name , age= age}
return "{" + "name=" + getName() +
"age=" + getAge() +
"}";
}
// 重寫 equals
@Override
public boolean equals(Object obj) {
// 判斷內存地址是否相同
if( this == obj ){
return true;
}
// 判斷 傳入的obj的對象是否為空 obj的類型與當前類型是否相同
if ( obj == null || this.getClass() != obj.getClass() ){
return false;
}
// 強轉 類型
Person p = (Person) obj
// 判斷傳入的obj對象 的 值是否為空,判斷值是否相同,
return this.age == p.age && Objects. equals( this.name,p.name )
// 判斷 值是否相同
}
二、泛型的定義和使用
可以 靈活地 將數據類型應用到不同的 類、方法、接口中 將數據類型做為參數進行傳遞
1。定義和使用含有泛型的類 ,方法,參數
定義格式:
修飾符 class 類名 <代表泛型的變量>{ }
例子:
// 泛型在類中使用 定義的 位置 位於 類名 后
public class Person <E>{
// 泛型作為參數 在 括號里
public boolean add (E e){
}
// 帶有 泛型 方法 位於 替換 方法類型
public E get(int index){
}
}
2.距離定義 泛型類
public class MyGenericClass<MVP> {
//沒有MVP類型,在這里代表 未知的一種數據類型 未來傳遞什么就是什么類型
private MVP mvp;
public void setMVP(MVP mvp) {
this.mvp = mvp;
}
public MVP getMVP() {
return mvp;
}
}
3. 含有泛型的 方法 定義的格式
格式:
修飾符 <代表泛型的變量> 返回值類型 方法名(參數){ }
public class MyGenericMethod {
public <MVP> void show(MVP mvp) {
System.out.println(mvp.getClass());
}
public <MVP> MVP show2(MVP mvp) {
return mvp;
}
}
4.含有泛型的接口
定義格式:
修飾符 interface 接口名 <代表泛型的變量>{ }
public interface MyGenericInterface<E>{
public abstract void add(E e);
public abstract E getE();
}
在定義類的時候 確定泛型 的類型
例如:
public class MyImp1 implements MyGenericInterface<String> {
@Override
public void add(String e) {
// 省略...
}
@Override
public String getE() {
return null;
}
}
2、始終不確定泛型的類型,直到創建對象時,確定泛型的類型
public class MyImp2<E> implements MyGenericInterface<E> {
@Override
public void add(E e) {
// 省略...
}
@Override
public E getE() {
return null;
}
}
/**
確定泛型
*/
public class GenericInterface {
public static void main(String[] args) {
MyImp2<String> my = new MyImp2<String>();
my.add("aa");
}
}
一、泛型的通配符
當使用 泛型類 或者接口時,傳遞的數據中,泛型的類型不確定,可以通過通配符<?>表示。但是一旦使用泛型通配符后,
只能使用Object類的共性方法,集合中自身方法無法使用。
1.通配符基本使用
泛型的通配符的:不知道什么時候用什么類型 來 接受的時候, 此時 可以使用 ? 表示未知通配符
例子:
public static void main(String[] args) {
Collection<Intger> list1 = new ArrayList<Integer>();
getElement(list1);
Collection<String> list2 = new ArrayList<String>();
getElement(list2);
}
public static void getElement(Collection<?> coll){}
//?代表可以接收任意類型
Notes:
tips:泛型不存在繼承關系 Collection<Object> list = new ArrayList<String>();這種是錯誤的;
2.通配符高級使用----受限泛型
之前設置泛型的時候,實際上是可以任意設置的,只要是類 就可以設置。但是在Java的泛型中可以制定一個泛型的上線和下限
泛型的上限:
格式: 類型名稱<? extends 類> 對象名稱
意義:只能接收該 類型及其子類
泛型的下限:
格式 : 類型的名稱<? super 類> 對象名稱
意義: 只能 接收該類型 及其父類類型
例子:
public static void main(String[] args) {
Collection<Intger> list1 = new ArrayList<Integer>();
Collection<String> list2 = new ArrayList<String>();
Collection<Number> list3 = new ArrayList<Number>();
Collection<Object> list4 = new ArrayList<Object>();
getElement(list1);
getElement(list2);//報錯
getElement(list3);
getElement(list4);//報錯
getElement2(list1);//報錯
getElement2(list2);//報錯
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此時的泛型?,必須是Number類型或者Number類型的子類
public static void getElement1(Collection<? extends Number> coll){}
// 泛型的下限:此時的泛型?,必須是Number類型或者Number類型的父類
public static void getElement2(Collection<? super Number> coll){}
常見數據結構:
棧、隊列、數組、鏈表和紅黑樹。
