Java重寫toString和泛型的使用


一、在一個類中重寫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){}

常見數據結構:

棧、隊列、數組、鏈表和紅黑樹。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM