上轉型對象:
如果B類是A類的子類(或間接子類),當用子類創建對象b並將這個對象的引用放到父類對象a中時,如:
A a;
B b = new B();
a = b;
對象b的上轉型a的實體是有子類B創建的,但是上轉型對象會失去子類B的一些屬性和功能。
上轉型對象具有以下特點
- 上轉型對象不能操作子類新增加的成員變量,不能使用子類新增的方法。即為較子類B失去一些屬性和功能,這些屬性和功能是新增的。
- 上轉型對象可以操作子類繼承或隱藏的成員變量,也可以使用子類繼承的或重寫的方法。即為上轉型對象可以操縱父類原有的屬性和功能,無論這些方法是否被重寫。
- 上轉型對象調用方法時,就是調用子類繼承和重寫過的方法。而不會是新增的方法,也不是父類原有的方法。
- 可以將對象的上轉型對象再強制轉換到一個子類對象,強制轉換過的對象具有子類所有屬性和功能。
注意:
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想把進程記錄下來,要是有錯。。告訴我就好,不要罵我,會哭的哦。
