• 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();//子父类中的方法都可以使用

    向下造型的作用是:为了使用子类中的特有方法。

  • 相关阅读:
    也八卦一把:李开复离开微软,投奔Google
    用于苹果OS Ⅹ Dashboard Widgets 的Google Map小部件
    下一代Hotmail和MSN Messenger最新界面截图
    Go2Map也开放了地图API
    《Excel与VBA程序设计》第三章及附录
    非广告: 365key的好处(随时收集)
    VS2005多线程程序在IDE下调试的一个问题
    买了《.net模式--架构、设计和过程》
    Expect 在网络管理中发挥着重要作用
    source insight 快捷键
  • 原文地址:https://www.cnblogs.com/r123/p/7566742.html
Copyright © 2020-2023  润新知