抽象类和多态

一、抽象

抽象类

1.抽象类的概念

·如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。例如形状类是抽象的类,圆、三角形等视具体类;

·用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义为抽象类。但是抽象类中不一定有抽象方法。

 

2.抽象类的定义

使用关键字abstract定义抽象类,一般语法为:

[ 访问权限 ] abstract class 类名 {

成员列表

}

例如:

public  abstract  class  Shapes{

public  abstract  void  draw( );

//具体代码

}

 

3.抽象类的相关概念

(1)用abstract修饰的类就是抽象类。如果某个类中包含有抽象方法,那么该类就必须定义为抽象类;

(2)抽象类可以有成员属性和非抽象的成员方法;

(3)抽象类不能被实例化,但是可以有构造函数;

(4)抽象类只能用作基类,表示的是一种继承关系。继承抽象类的非抽象类必须实现其中的所有抽象方法,而已实现方法的参数、返回值要和抽象类中的方法一样。否则该类也必须声明为抽象类。

 

4.抽象类的注意事项

(1)抽象类可以有构造方法,但不能直接实例化,只能用来继承;

(2)抽象类的派生子类应该提供对其所有抽象方法的具体实现。如果抽象类的派生子类没有实现其中的所有抽象方法,那么该派生子类仍然是抽象类,只能用于继承,而不能实例化;

(3)抽象类中也可以包含有非抽象的方法,子类中重写非抽象方法时返回值和参数必须于父类一致;

(4)构造方法和静态方法不可以直接修饰为abstract

 

抽象方法

1.抽象方法的相关概念

(1)在某下情况下,类无法(或者没有必要)提供方法的具体实现,可以将此方法声明成抽象方法;

(2)在类中没有方法体的方法,就是抽象方法;

(3)含有抽象方法的类,一定是抽象类。

 

2.抽象方法的语法

使用关键字abstract声明冲洗爱过你方法,一般语法为:

[ 访问权限 ]  abstract  返回值  方法名称(参数列表);

例如:

public  abstract  void  draw( );

 

3.抽象的作用

1)在面向对象领域,抽象类主要用来进行类型隐藏。也就是使用抽象的类型来编程,但是具体运行时就可以使用具体类型;

2)利用抽象的概念,能够在开发项目中创建扩展性很好的架构,优化程序。

3)抽象类,抽象方法,在软件开发过程中都是设计层面的概念。也就是说,设计人员会设计出抽象类,抽象方法,程序员都是来继承这些抽象类并覆盖抽象方法,实现具体功能。

 

 

二、多态

多态性:

·多态性是面型对象的三大特征之一;

·多态的含义是:对外一种表现形式,内在具有多种具体实现。

·Java中多态的具体体现:

—方法重载;

—方法覆盖;

—多态参数。

 

运行期类型与编译期类型

第一种情况:编译期类型和运行期类型相同:

A  a  =  new  A(  );

a.show(  );

(1)声明A的时候,使用到的类型A表示对象的类型,被称为编译期类型,在编译期,虚拟机认为a的类型是A,对于a所使用的属性和方法的有效性将到类A中去验证;

(2)构造方法A(  )中的A是运行期类型,在运行期,将执行运行期类型中的方法。

 

第二种情况:当有继承关系时,可能发生编译期类型和运行期类型不同的情况,即编译期类型是父类类型,运行期类型是子类类型。

            //A类是B类的父亲

A  ab  =  new  B(  );

Ab.show(  );

(1)对象ab的编译期类型为父类A类,运行期类型为子类B类;

(2)如果一个引用的编译期类型和运行期类型不同,那么一定是编译期类型与运行期类型有父类子类关系;

(3)Ab对象使用的方法,在编译期到类A中去校验,而运行则执行B类的方法;

(4)如果一个对象的编译期类型是父类,运行期类型是子类,可以对该对象进行强制类型转换,将其编译器类型转换为与运行期类型相同的类型,即:B  b  =  ( B )  ab;

 

父类引用指向子类对象

当编译器类型是父亲,运行期类型是子类时,被称为父类引用只想子类对象

class  Animal{

               ……

}

class Cat  extends Animal{

               ……

}

class Dog extends Animal {

               ……

}

Cat m = new Cat()

Animal x = new Cat()  //Animal 的引用指向Cat的对象

对象m可以调用Cat类中的所有方法,x只能调用Animal类中定义的方法,Cat类扩展的新方法不能调用。

 

多态环境下对成员方法的调用

class  Animal{

            void show() {

              System.out.println(Anmial");

           }

}

class Cat  extends Animal{

               void show() {

                     System.out.println(cat");

               }

}

…….

Animal x = new Cat(  );

    x.show(  ); //调用的是子类中的方法

简单地说:编译看左边,运行看右边。

 

多态环境下对静态成员方法的调用

class  Animal{

          static  void show() {

             System.out.println(Animal");

          }

}

class Cat extends Animal {

             static  void show() {

                    System.out.println(Cat");

              }

}

…….

Animal x = new Cat(  ) ;

x.show(  ); //调用的是动物类中的静态成员方法。

简单地说:编译和运行都看左边。

 

多态环境下对成员变量的调用

class Animal{

       int num = 3;

}

class Cat  extends Animal {

       int  num = 4;

}

…….

Animal x = new Cat(  );

x.num;  //调用的是动物类中的成员变量。

简单地说:编译和运行都看等号左边。

注意:变量不存在被子类覆写这一说法,只有方法存在覆写。

 

 

多态参数

方法参数具有多态性

class  Animal{

           void eat(  ) {  }

}

class  Cat extends Animal{

            void eat(  ) {  }

}

class Dog extends Animal{

            void eat(  ){  }

}

//方法的形式参数类型是父类类型,而传递的实际参数可以是任意子类的对象

method( Animal  animal ){  

animal .eat(  );                

方法参数多态性的好处:提高代码的扩展性

 

 

多态环境下对象造型

1)向上造型 — 又称为自动类型提升

class Animal{

     abstract void eat(  );

}

class Cat extends Animal{

      void look(  ) {

System.out.println("看家");

 }

    }      

 ………

   Animal x=new Cat(  );  //向上造型,Cat对象提升到Animal对象

   x.eat(  );            //只能使用父类中的方法

   x.look(  );           //报错!不能使用子类中的方法

向上造型的作用是:提高程序的扩展性。

 

(2)向下造型 — 又称为向下转型

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

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

 

 

三、Instanceof 操作符

1.instanceof 用法

result = 对象名称 instanceof 类型

参数:

Result:布尔类型。

对象名称:必选项,任意对象表达式。

类型:必选项,任意已定义的类,可以是API中的类,可以是自定义的类。

 

说明:

如果对象是这个类型的一个实例,则instanceof 运算符返回true。如果对象不是指定类的一个实例,或者对象是null,则返回false

instanceof 运算符是用来在运算时指出对象是否是特定类的一个实例。

abstract class Animal {

abstract void eat(  );

}

class Dog extends Animal {

                 void look (  )...

}

class Cat extends Animal {

                void catch(  ) ……

}

class InstanceofDemo {

public static void main(String[ ]  args ) {

                           method(new Dog(  ));

                   }

 }

public static void method(Animal a) {

             // instanceof:用于判断对象的具体类型。

    if (a instanceof Cat) {

   Cat c = (Cat) a;

   c.catch(  );

    }

}

 

转载于:https://www.cnblogs.com/qq879827676/p/7566758.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值