java-上轉型對象&抽象類-學習記錄


上轉型對象:

如果B類是A類的子類(或間接子類),當用子類創建對象b並將這個對象的引用放到父類對象a中時,如:

A a;
a = new b()
A a;
B b = new B();
a = b;
則稱a是b的上轉型對象。

對象b的上轉型a的實體是有子類B創建的,但是上轉型對象會失去子類B的一些屬性和功能。

上轉型對象具有以下特點

  1. 上轉型對象不能操作子類新增加的成員變量,不能使用子類新增的方法。即為較子類B失去一些屬性和功能,這些屬性和功能是新增的。
  2. 上轉型對象可以操作子類繼承或隱藏的成員變量,也可以使用子類繼承的或重寫的方法。即為上轉型對象可以操縱父類原有的屬性和功能,無論這些方法是否被重寫。
  3. 上轉型對象調用方法時,就是調用子類繼承和重寫過的方法。而不會是新增的方法,也不是父類原有的方法。
  4. 可以將對象的上轉型對象再強制轉換到一個子類對象,強制轉換過的對象具有子類所有屬性和功能。

注意:

         1.不可以將父類對象引用賦給子類。

        2.如果子類重寫了父類的靜態方法(static),那么子類對象的上轉型對象不能調用子類重寫的靜態方法,只能調用父類的靜態方法。

 

抽象類:

   用關鍵字abstract修飾的類稱為抽象類,如:

       abstract class A{

                   ...

                }

   用關鍵字abstract修飾的方法稱為抽象方法,如:

       abstract int way (int x , int y);

對於抽象方法,只能聲明不能實現。且不能同時和 final修飾同一個方法或類,也不能用 static修飾 abstract 方法。

意義:

     抽象類可以抽象出重要的行為標准(用抽象方法表示)。即抽象類封裝了子類必須有的行為標准,而標准的具體行為在子類中實現。

注意:

    1,抽象類中可以有構造方法及非抽象方法。

    2,子類必須全部覆寫抽象類中的全部抽象方法 

    3.抽象類不能用new創建對象

    4,abstract類的對象作為上轉型對象

//========================================例題

  要求有一個abstract類,類名為Student。Student的子類有Genstudent、Outstudent。學生的共同屬性是,學號,姓名,年齡。共同行為是吃飯。有差異的行為是學習。

有一個School類,該類用Student對象數組作為成員,Student對象數組的單元可以是Genstudent對象的上轉型對象、Outstudent對象的上轉型對象。

編寫測試類進行測試School對象中所有學生名單顯示。

 

 

 abstract class Student

{
int num,age;
String name; 
public String nomal_act()//非抽象方法,可以實現

return"學號 :"+num+" 姓名 :"+name+" 年齡 :"+age+" \n 共同行為:吃飯 ";

public abstract String deffer_act();//抽象方法,不可以實現
}

class Genstudent extends Student
{
public Genstudent(int num,int age,String name)

super.num = num;
super.age = age;
super.name = name; 
}
public String deffer_act()
{
return" \n 差異性為:努力學習";

}

class Outstudent extends Student
{
public Outstudent(int num,int age,String name)

super.num = num;
super.age = age;
super.name = name; 
}
public String deffer_act()
{
return" \n 差異性為:不學習";

}

class School 
{
String inform;
public void set_inform(Student stu)//設置信息
{
inform = stu.nomal_act()+stu.deffer_act();
}
public void Show_inform()//輸出信息
{
System.out.println(inform);
}
}


public class Test
{
public static void main(String args[])

int person = 0;//學生信息數量,默認為0
Scanner input = new Scanner (System.in);//創建一個鍵盤掃描類對象
System.out.println("================================錄入信息==============================");
System.out.println("輸入要錄入學生信息數目");
person = input.nextInt();
School[] school = new School[person];//創立數組對象
Student stu ;

for(int i = 0;i< person;i++)
{
school[i] = new School();// school[i]實例化,沒有會報錯 
System.out.println("輸入學號,名字,年齡,以及是否好學(Y/N)?");
int num = input.nextInt(); 
String name = input.next(); 
int age = input.nextInt();
String act= input.next(); 
stu =new Outstudent(num,age,name);//避免 stu未實例化
if(act.equals("Y")){ stu =new Genstudent(num,age,name);}//差異行為判斷

school[i].set_inform(stu);
}
System.out.println("=================================信息表===============================");
for(int i = 0;i< person ;i++)
{
school[i].Show_inform();

}

}

//==================================結果

 

 //姓名是String型,但是我懶得輸了,就這樣吧。

//最近在學Java想把進程記錄下來,要是有錯。。告訴我就好,不要罵我,會哭的哦。

 


免責聲明!

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



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