Object類 &多態 & final關鍵字&instanceof &複習代碼塊 &面試題
Object類
類Object是類層次結構的根類。每個類都使用Object作爲超類。
equals()方法
指示其他某個對象是否與此對象“相等”。
public class Student extends Object{
String stuNo;
String stuName;
int age;
public void show() {
System.out.println("學號:"+stuNo+" 姓名:"+stuName+" 年齡:"+age);
}
}
public class Test {
public static void main(String[] args) {
Student zhangsan=new Student();
zhangsan.stuNo="bj1805";
zhangsan.stuName="xxx";
zhangsan.age=20;
Student lisi=new Student();
lisi.stuNo="bj1805";
lisi.stuName="xxx";
lisi.age=20;
boolean b=zhangsan.equals(lisi);
boolean b2=zhangsan==lisi;
System.out.println(b);
System.out.println(b2);
}
}
==操作符與equals方法的區別:
1 == 比較 基本類型比較的是數據 ,引用類型比較對象的引用(地址)
2 默認情況 Object中equals和==一樣
3 String類型重寫了Object中的equals,所以String比較使用equals方法。
hashCode()方法
返回該對象的哈希碼值(理解爲對象的地址)。每一個對象的哈希碼值唯一
Object obj1 = new Object();
Object obj2 = new Object();
Object obj3 = obj2;
//obj2與obj3兩個對象的哈希碼值一樣
System.out.println(obj1.hashCode());
System.out.println(obj2.hashCode());
System.out.println(obj3.hashCode());
getClass()方法
返回此Object的運行時類。通過某個對象通過反射獲取類。
Object obj = new Object();
Class cls = obj.getClass();//通過反射獲取到了Object類
toString()方法
返回該對象的字符串表示。可以在自定義類中重寫toString方法,以實現是對象轉成指定格式的字符串。
public class Person{
String name;
public Person(String name){
this.name = name;
}
//重寫toString方法
public String toString(){
return "name="+name;
}
}
public class DemoPerson{
public static void main(String[]args){
Person p = new Person("張三");
System.out.println(p);//輸出結果爲:name=張三
}
}
多態
程序中多態:同一個引用類型,使用不同的實例而執行不同操作 ,一句話理解:父類引用,子類對象。
多態實現步驟:
- 1 編寫父類、子類,子類重寫父類方法
- 2 運行時,使用父類變量,子類的對象
多態使用形式:
- 1 使用父類作爲方法形參實現多態
- 2 使用父類作爲方法返回值實現多態
向上轉型,向下轉型
向上轉型:將子類的對象賦值給父類變量,自動轉換
1 <父類型> <引用變量名> = new <子類型>();
2 此時通過父類引用變量調用的方法是子類覆蓋或父類的方法 ,編譯時看父類,運行時看子類
3 此時通過父類引用變量無法調用子類特有的屬性和方法
向下轉型:將父類的變量賦值給子類變量,強制轉換
Object obj = new String("abc");
String str = (String)obj;
Pet pet=new Dog(); // Pet pet=new Cat();
Dog d=(Dog)pet;
注意:
1 <子類型> <引用變量名> = (<子類型> )<父類型的引用變量>;
2 在向下轉型的過程中,如果沒有轉換爲真實子類類型,會出現類型轉換異常
final關鍵字
final:最終的
在Java中聲明類、屬性和方法時,可以使用關鍵字final來修飾。
final修飾變量(成員變量或局部變量),則成爲(符號)常量,只能賦值一次。
- 修飾成員變量時,定義時同時給出初始值,或在構造方法中賦值
- 修飾局部變量時,只能賦值一次
3.2 final修飾方法,則該方法不能被子類重寫,能被繼承
final returnType methodName(paramList){
…
}
3.3 final修飾類,則類不能被繼承
final class finalClassName{
…
}
instanceof
對象向下轉型時,存在一個問題:
若一個父類A的引用a,指向一個子類B的實例,將a賦值給另一個子類C引用時,會拋出java.lang.ClassCastException異常;
拋出異常後程序將不能繼續向下執行,爲了避免這個異常的拋出,我們可以通過instanceof關鍵字判斷引用指向的實例是否可以進行強制轉換成某個子類對象
已知Pet類有兩個子類Dog和Cat:
public class Demo{
public static void main(String[]args){
Pet a = new Dog();
check(a);
}
//設計一個方法,判斷一個動物是貓還是狗
public static void check(Pet a){
if(a instanceof Dog){
System.out.println("狗");
}else if(a instanceof Cat){
System.out.println("貓");
}
}
}
複習代碼塊
一 局部代碼塊 位置:局部位置(方法內部)
作用:限定變量的生命週期,儘早釋放,節約內存
調用:調用其所在的方法時執行
二 構造代碼塊
位置:類成員的位置,就是類中方法之外的位置
作用:把多個構造方法共同的部分提取出來,共用構造代碼塊
調用:每次調用構造方法時,都會優先於構造方法執行,也就是每次new一個對象時會自動調用.
三 靜態代碼塊
位置:類成員位置,用static修飾的代碼塊
作用:對類進行一些初始化 只加載一次,
當new多個對象時,只有第一次會調用靜態代碼塊,
因爲,靜態代碼塊 是屬於類的,所有對象共享一份
調用: new 一個對象時自動調用
面試題?
1、靜態代碼塊、構造代碼塊、構造方法的執行順序?
靜態-》構造代碼塊-》構造方法
靜態代碼塊:只執行一次
構造方法:每次調用構造方法都執行
2題
class A{
public String show(D obj){
return ("A and D");
}
public String show(A obj){
return ("A and A");
}
}
class B extends A{
public String show(B obj){
return ("B and B");
}
public String show(A obj){
return ("B and A");
}
}
class C extends B{}
class D extends B{}
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); A and A
System.out.println(a1.show©); A and A
System.out.println(a1.show(d)); A and D
//A a2 = new B(); 只能看到 return (“A and D”); return (“B and A”);
System.out.println(a2.show(b)); B and A
System.out.println(a2.show©); B and A