深入淺出,2021大廠Java面試必問題目

程序猿小碼農 2021-09-18 06:16:09 阅读数:369

深入 java

}

/删除掉的與String互操作的代碼/

return false;

}

}


[](
)考慮這樣一種情况
=======================================================================
有一個坐標類,內有成員變量x和y
並提供equals方法

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.

public class Point {

private final int x;

private final int y;

public Point(int x,int y)

{

this.x=x;

this.y=y;

}

@Override

public boolean equals(Object o )

{

if(o instanceof Point)

{

Point p = (Point)o;

return (this.x == p.x && this.y==p.y);

}

return false;

}

}


好像簡單到不能再簡單的定義
那麼擴展(繼承)一下,為這個點添加顏色信息

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.

public class ColorPoint extends Point{

private final Color color;

public ColorPoint(int x,int y,Color color)

{

super(x,y);

this.color=color;

}

}


現在考慮一下
equals方法是什麼樣的呢?
[](
)如果子類ColoePoint完全不提供equals方法,而是直接使用父類的equals方法
============================================================================================================
在equals做比較的時候顏色信息就被忽略掉了。
雖然這麼做不會違反equals約定
但顯然是無法接受的。
那麼就重寫一個equals方法。只有當坐標點x,y相同且顏色也相同時
equals才返回true

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.

public class ColorPoint extends Point{

private final Color color;

public ColorPoint(int x,int y,Color color)

{

super(x,y);

this.color=color;

}

@Override

public boolean equals(Object o)

{

if(o instanceof ColorPoint)

{

return (super.equals(o)&& this.color==

( (ColorPoint) o ).color);//使用父類的equals方法

}

return false;

}

}


這個方法的問題在於,比較普通點(沒有顏色的Point實例)和
有色點(ColorPoint實例)比較,以及相反的情况時可能會得到不同的結果
前一種忽略的顏色信息,而後一種總時返回false(因為參數類型不正確)

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.

public static void main(String[] args)

{

Point p = new Point(1,2);

ColorPoint cp = new ColorPoint(1,2,Color.RED);

System.out.printf(p.equals(cp)+“”);//true

System.out.printf(cp.equals§+“”);//false

}


可以嘗試以ColorPoint.equals在進行“混合顏色比較時”忽略顏色信息
但這樣做確實提供了對稱性,但卻犧牲了傳遞性。
那該怎麼解决???
事實上,這是面向對象語言中關於等價關系的一個基本問題。
我們無法在擴展可實例化的類的同時,既增加新的組件,同時又保留equals約定
雖然沒有一種令人滿意的辦法既可以擴展可實例化的類,又增加組件,但還有一種不錯的方法。複合優先於繼承
我們不再讓ColorPoint繼承Point,
而是在ColorPoint類中添加一個私有的Point域
以及一個公有的視圖(view)方法
此(view)方法返回一個與該色點處在相同比特置的普通Point對象。

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.

public class ColorPoint{

private final Color color;

private final Point point;

public ColorPoint(int x,int y,Color color)

{

point = new Point(x,y);

this.color=color;

}

/view/

public Point asPoint()

{

return point;

}

@Override

public boolean equals(Object o)

{

if(o instanceof ColorPoint)

{

ColorPoint cp =(ColorPoint)o;

return this.point.equals(cp.point)&&

this.color.equals(cp.color);//調用Point以及Color類的equals方法

}

//那麼有色點與無色點會被判斷為不相同而返回false

return false;

}

}


[](
)總結
=================================================================
**覺得這篇文章對你有幫助的同學,求個三連哦~謝謝大家支持哦!!**
# 分享
這次面試我也做了一些總結,確實還有很多要學的東西。相關面試題也做了整理,可以分享給大家,了解一下面試真題,想進大廠的或者想跳槽的小夥伴不妨好好利用時間來學習。學習的脚步一定不能停止!
**[CodeChina開源項目:【一線大廠Java面試題解析+核心總結學習筆記+最新講解視頻】](https://ali1024.coding.net/public/P7/Java/git)**
![深入淺出,2021大廠Java面試必問題目_程序員](https://s2.51cto.com/images/20210918/1631916371418204.jpg)
Spring Cloud實戰
![深入淺出,2021大廠Java面試必問題目_後端_02](https://s4.51cto.com/images/20210918/1631916372801351.jpg)
Spring Boot實戰
![深入淺出,2021大廠Java面試必問題目_程序員_03](https://s5.51cto.com/images/20210918/1631916372202739.jpg)
面試題整理(性能優化+微服務+並發編程+開源框架+分布式)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
版权声明:本文为[程序猿小碼農]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210918061608618t.html