2017-09-20
什麽是抽象類:
一個類中沒有包含足夠的信息來描繪一個具體的對象;用abstract修飾的類就是抽象類;抽象類中不一定有抽象方法;但是有抽象方法就一定存在於抽象類中;
抽象類只能用作父類,表示繼承關系。繼承抽象類的子類必須實現其中的所有抽象方法,而已實現方法的參數、返回值要和抽象類中的方法一樣。否則,該類也必須聲明為抽象類。
定義抽象類:
【訪問權限】abstract class 類名 {成員列表}
抽象方法:
在類中沒有方法體的方法,稱之為抽象方法;
抽象方法的聲明:
【訪問權限】abstract 返回值類型 方法名稱(參數列表);
作用:可擴展性好;可優化程序;
多態性:
體現在:方法重載;方法覆蓋;多態參數;
①:編譯期類型與運行期類型相同;
A a = new A();
a.show();
在編譯期,虛擬機認為a的類型是A,對於a所使用的屬性和方法的有效性將到類A中去驗證。
構造方法A()中的A是運行期類型,在運行期,將執行運行期類型中的方法
②:當有繼承關系時,可能發生編譯期類型和運行期類型不同的情況,即編譯期類型是父類類型,運行期類型是子類類型;
//A類是B類的父類
A ab = new B();
ab.show();
對象ab的編譯期類型為父類A類,運行期類型為子類B類。
如果一個引用的編譯期類型和運行期類型不同,那麽一定是編譯期類型與運行期類型有父類子類關系。
多態環境下對成員方法的調用:
編譯在左,運行在右;
多態環境下對靜態成員方法的調用:
編譯在左,運行也在左;
多態環境下對成員變量的調用:
簡單的說:編譯和運行都看等號左邊。
註意:變量不存在被子類覆寫這一說法,只有方法存在覆寫。
父類:
public class Anmainal {
String name = "動物";
//方法
void eat(){
System.out.println("父類 : 吃飯");
}
Anmainal(){
System.out.println("父類 :構造方法");
}
static void jump() {
System.out.println("父類 :jump ");
}
}
子類1:
public class Cat extends Anmainal {
String name = "貓";
void eat() {
System.out.println("貓 子類 : 吃飯");
}
void drink(){
System.out.println("貓 子類 :喝水");
}
Cat(){
System.out.println("貓 子類 :構造方法");
}
static void jump() {
System.out.println("貓 子類 :jump ");
}
}
public class Main {
public static void main(String[] args) {
Anmainal A=new Cat();
A.eat(); //結果:貓 子類 : 吃飯
System.out.println(A.name); //結果:動物
A.jump(); //調用靜態方法時,出現父類的結果
Cat B = (Cat) A; //需要強制轉換,子類中創新的方法才能出現結果
B.drink();
System.out.println(B.name); //需要強制轉換,子類中屬性才能出現結果 }
父類引用指向子類對象:
當編譯器類型是父類,運行期類型是子類時,被稱為父類引用指向子類對象;
class Animal{ //父類
……
}
class Cat extends Animal{
…… //子類Cat
}
class Dog extends Animal {
…… //子類Dog
}
Cat m = new Cat()
Animal x = new Cat() //Animal 的引用指向Cat的對象
對象m可以調用貓類中的所有方法,x只能調用動物類中定義的方法,
貓類擴展的新方法不能調用。 (例子如上)
多態參數:
方法參數具有多態性:
父類:
public class Anmainal {
String name = "動物";
//方法
void eat(){
System.out.println("父類 : 吃飯");
}
Anmainal(){
System.out.println("父類 :構造方法");
}
static void jump() {
System.out.println("父類 :jump ");
}
}
子類貓:
public class Cat extends Anmainal {
String name = "貓";
void eat() {
System.out.println("貓 子類 : 吃飯");
}
void drink(){
System.out.println("貓 子類 :喝水");
}
Cat(){
System.out.println("貓 子類 :構造方法");
}
static void jump() {
System.out.println("貓 子類 :jump ");
}
}
子類狗:
public class Dog extends Anmainal{
String name = "狗";
void eat() {
System.out.println("狗 子類 : 吃飯");
}
void drink(){
System.out.println("狗 子類 :喝水");
}
Dog(){
System.out.println("狗 子類 :構造方法");
}
static void jump() {
System.out.println("狗 子類 :jump ");
}
}
public class Main {
public static void main(String[] args) {
Anmainal A1 = new Anmainal();
Cat B = new Cat();
Dog D = new Dog();
A1.eat();
B.eat();
D.eat();
}
void sing(Anmainal A1) {
A1.eat();
}
}
多態環境下對象造型:
向上造型 –又稱自動類型提升:
class Animal{
abstract void eat();
}
class Cat extends Animal{
void look() {
System.out.println("看家");
}
}
………
Animal x=new Cat() //向上造型,Cat對象提升到Animal對象
x.eat() //只能使用父類中的方法
x.look() //報錯!不能使用子類中的方法
向上造型的作用是:提高程序的擴展性。
向下造型 –又稱向下轉型:
class Animal{
abstract void eat();
}
class Cat extendsAnimal{
void look() {
System.out.println("看家");
}
}
………
Animal x=new Cat()
Cat m=(Cat)x; //向下轉型
m.eat() ;
m.look();//子父類中的方法都可以使用
向下造型的作用是:為了使用子類中的特有方法。
2017-09-20