• <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • Java面向對象
    Java異常
    Java數組
    Java常用類
    Java集合
    Java IO流
    Java線程
    Java反射
    Socket編程
    Java注解開發
    Java GoF設計模式
    HashMap
    Java內存模型
    Java線性表

    Java Object類

     

     

    Object類是所有類的根父類, Java中的類要么直接繼承Object要么間接繼承Object

     

    Java中的繼承是可傳遞的, 所以Object類的方法所有的類都能繼承到

     

     

    Java中Object類的方法

     

    protected Object:clone() 對象的克隆

     

    boolean:equals(Object obj) 判斷對象的內容是否一樣.

     

    protected void:finalize() 當垃圾回收器回收這個對象時,會調用該方法

     

    Class<?>:getClass() 返回對象的運行時類.

     

    int:hashCode() 返回對象的哈希碼.

     

    void:notify() 喚醒等待中的線程

     

    void:notifyAll() 

     

    String:toString() 把對象轉換為字符串.

     

    void:wait() 線程等待

     

    ● clone()

     

    對象克隆, 是在堆中再創建一個完全一樣的對象

     

    ● finalize()

     

    當一個對象沒有變量引用它時, 垃圾回收器就會把這個對象釋放, 回收該對象時會調用對象的finalize()方法, 垃圾回收器在什么時候回收這個對象不確定, finalize()方法的執行時間不確定, 該方法一般不用

     

    ● wait()/notify()

     

    線程等待/喚醒線程

     

    ● getClass()

     

    返回對象的運行時類對象

     

    把所有小狗可以抽象為Dog類, 把所有小貓抽象為Cat類,把所有人抽象為Person類, 把Dog/Cat/Person/String/System等所有的類進一步抽象為Class類. Class類描述的是所有類的相同的特征

     

    getClass()方法返回當前對象對應的Class對象

     

    當前前可以簡單的把getClass()方法理解為返回對象的類, 或者理解為返回對象對應的類的字節碼文件, 可以利用這個方法判斷兩個對象的類是否是同一個類

    Person ?p1 = new Person();
    
    Person ?p2 ?= ?new Person();
    
    if( ?p1.getClass() == p2.getClass() ?){
    
    p1和p2是同一個類型的對象
    
    }

     

    ● toString()

     

    作用是把對象轉換為字符串

     

    當使用Sytem.out.println(obj)打印對象時,會調用obj對象的toString()方法

     

    toString()默認顯示完整類名@十六進制數, 如果想要打印obj對象的各個字段值, 需要重寫toString()

     

    使用Sytem.out.println(obj)打印對象時,如果顯示的內容不是完整類名@哈希碼十六進制形式時, obj的類或者父類肯定重寫過toString()方法

     

    package com.bjpowernode.chapter01.demo03;
    
    import java.util.ArrayList;
    
    /**
     * 測試toString()方法
     * @author Administrator
     *
     */
    public class Test01 {
    
    	public static void main(String[] args) {
    		//創建Person對象
    		Person lisi = new Person("lisi", 18, "男");
    		//在屏幕上打印lisi
    		System.out.println( lisi );
    		/*
    		 * 輸出結果:
    		 * 		com.bjpowernode.chapter01.demo03.Person@15db9742
    		 * 			完整類名 @ 十六進制數	
    		 * 分析:
    		 * 		1) 在使用System.out.println()打印一個對象時, 在println()方法體中,先把對象轉換為字符串再打印
    		 * 			調用了String類的valueOf()方法
    		 * 		2)在String類的valueOf()方法中,調用了對象的toString()方法
    		 * 			toString()方法是從Object類繼承來的
    		 * 		3)在Object類中, toString()方法返回以下內容:
    		 * 			getClass().getName() + "@" + Integer.toHexString(hashCode())
    		 * 			運行時類的完整類名 + "@" + 哈希碼的十六進制
    		 * 結論:
    		 * 		當使用System.out.println()打印一個對象時, 會調用對象的toString()方法
    		 * 需求:
    		 * 		當使用System.out.println()打印一個對象時, 顯示該對象的各個字段值(各個成員變量值)
    		 */
    		//上面一行,相當于下面這一行,
    		System.out.println( lisi.toString() );
    		//toString()是從Object繼承來的,默認顯示完整類名 , 想要顯示各個字段值 ,需要在子類中重寫toString()
    		//當子類從父類繼承的方法,滿足不了子類需求時,需要重寫該方法
    		
    		String s1 = "feifei";
    		System.out.println( s1 ); 	//feifei, 顯示不是完整類名,String類應該重寫了toString()方法
    		Integer num = new Integer(456);
    		System.out.println( num ); 	//456
    		ArrayList list = new ArrayList<>();
    		System.out.println( list ); //[], ArrayList的爺爺類AbstractCollection重寫了toString()
    		
    		
    	}
    
    }

     

    package com.bjpowernode.chapter01.demo03;
    
    public class Person {
    	String name;
    	int age;
    	String gender; 			//性別  
    	
    	public Person() {
    	}
    	public Person( String name, int age, String gender){
    		this.age = age;
    		this.name = name;
    		this.gender = gender;
    	}
    	
    	//重寫toString()方法
    	@Override						//注解,驗證重寫是否正確
    	public String toString() {
    		return "name:" + name + ",age:" + age + ",gender:" + gender;
    	}
    }

     

    ● equals()

     

    使用關系運算符 == 判斷兩個引用是否指向堆中的同一個對象

     

    用equals()方法判斷兩個對象的內容是否一樣,即各個字段值是否相等

     

    如果兩個類需要使用equals()判斷兩個對象是否一樣時,需要重寫equals()方法

     

    就像之前判斷兩個字符串是否一樣時,需要調用equals()方法, String類已經重寫過equals()方法了

     

    package com.bjpowernode.chapter01.demo03;
    
    public class Book {
    	String name;
    	String author;
    	String press;
    	double price;
    	
    	public Book( String name, String author, String press, double price) {
    		this.author = author;
    		this.name = name;
    		this.press = press;
    		this.price = price;
    	}
    	
    	//重寫equals()方法
    	@Override
    	public boolean equals(Object obj) {
    		// 依次判斷兩個對象的內容, 如果一個不相同的就返回false, 如果都相同就返回true
    		//1)兩個變量引用同一個對象, 返回true
    		if ( this == obj ) {
    			return true;
    		}
    		//2)參數為null, 返回false
    		if ( obj == null ) {
    			return false;
    		}
    		//3) 如果參數對象和當前對象不是同一個類型,返回false
    		if ( this.getClass() != obj.getClass() ) {
    			return false;
    		}
    		//4) 當前對象與參數對象類型一樣, 如果有一個字段的值不相等,就返回false
    		//先把obj對象轉換為Book類型
    		Book other = (Book) obj;
    		//判斷書名, 如果書名不一樣就返回false
    		if ( this.name == null ) {
    			if ( other.name != null ) {
    				return false; 			//當前書名為null,參數對象書名不為null返回false
    			}			
    		}else if ( !this.name.equals(other.name) ) {   //當前書名不為null, 與參數對象的書名不一樣 返回false
    			return false;
    		}
    		//判斷作者, 如果作者不一樣就返回false
    		if ( this.author == null ){
    			if (other.author != null) {
    				return false;
    			}
    		}else if ( !this.author.equals(other.author)) {
    			return false;
    		}
    		//判斷出版社
    		if (this.press == null ) {
    			if (other.press != null) {
    				return false;
    			}
    		}else if ( !this.press.equals(other.press)) {
    			return false;
    		}
    		//判斷價格,price字段是一個小數, 在計算機 中小數采用近似值保存,不準確, 不能直接 使用== 判斷
    		//可以比較兩個小數的差值, 根據差值是否小于指定的閾值,來判斷兩個小數是否相等
    		if ( this.price - other.price > 0.01 || other.price - this.price > 0.01 ) {
    			return false; 		//兩本書的差值大于 0.01元就認為不相等
    		}
    				
    		return true;
    	}
    	
    }

     

    package com.bjpowernode.chapter01.demo03;
    /**
     * 測試equals()方法
     * @author Administrator
     *
     */
    public class Test02 {
    
    	public static void main(String[] args) {
    		Book myBook1 = new Book("java入門", "勇哥", "動力節點", 66.6);
    		Book myBook2 = new Book("java入門", "勇哥", "動力節點", 66.6);
    		
    		System.out.println( myBook1 == myBook2 ); 		//false
    		/*
    		 * 關系運算符==, 判斷兩個變量的值是否相等  ,
    		 * myBook1變量存儲堆中的一個對象的引用, myBook2變量存儲另外一個對象的引用
    		 */
    		
    		//需求: 判斷堆中兩個對象的內容是否一樣,可以調用equals()方法,該方法是從Object類繼承的, Object類中equals()根據==判斷是否相等
    		System.out.println( myBook1.equals(myBook2) ); 
    		
    		Book myBook3 = myBook1;			//兩個變量引用堆中同一個對象
    		System.out.println( myBook1.equals(myBook3));  		//true
    		
    		Book mybook4 = null;
    		System.out.println( myBook1.equals(mybook4));    	//false
    		
    		Person  lisi = new Person();
    		System.out.println( myBook1.equals(lisi));  		//false
    		
    		Book myBook5 = new Book("java入門", "勇哥", "動力節點", 66.6);
    		System.out.println( myBook1.equals(myBook5));  		//true
    		
    		
    	}
    
    }

     

    ● hashCode()

     

    根據哈希約定, 如果兩個對象equals()相等, 這兩個對象的哈希碼也應該相等

     

    在重寫equals()方法時,必須同時重寫hashCode()

     

    全部教程
  • <nav id="wkkge"><strong id="wkkge"></strong></nav>
  • <menu id="wkkge"></menu>
  • 面对面棋牌游戏