Java抽象类和多态

一、       抽象类

1.    概述

当多个类出现相同功能,但是功能主体不同,可以抽取,但是只抽取功能定义,不抽取功能主体。

2.    特点

               i.         抽象方法一定在抽象类中

              ii.         抽象方法和抽象类都必须被abstract修饰

             iii.         抽象类不可以用new创建对象,没有意义

abstract class Student

{

   abstractvoid study();  

   void sleep()

   {

      System.out.println("Zzz...");

   }

class AbstractDemo

{

   publicstatic void main(String [] args)

   {

      newStudent().study(); //报错!抽象类不能实例化

   }

}

             iv.         抽象类中的抽象方法要被使用,必须由子类重写其所有的抽象方法后,建立子类对象调用。如果子类只重写了部分抽象方法,那么子类还是一个抽象类。

3.    抽象类跟一般类的区别:

事物该怎么描述还怎么描述,只不过,该事物出现了一些看不懂的(抽象的)东西。

4.    程序示例:学生都学习,但低年级跟高年级学的内容不同

abstractclass Student

{

   abstract void study();      //抽象方法不能有主体

   voidsleep()

   {

      System.out.println("Zzz...");

   }

}

class BaseStudent

{

   voidstudy()

   {

      System.out.println("basiclesson");

   }

}

class AdvStudent

{

   void study()

   {

      System.out.println("advancedlesson");

   }

}

 

二、     接口(interface)

1. 可以初步理解为是,一个特殊的抽象

即当一个抽象类中的方法都是抽象的,那么该类可以通过“接口”的形式表示。

interface Practice

{

   public abstract void method01();

 

public abstract void method02();

}

2. 接口同样不可以创建对象,因为有抽象方法,需要被子类实现(implements),子类对方法采用覆盖,才可以实例化。

3. 接口定义的格式特点:

       i.     接口中常见定义:常量,抽象方法

     ii.     接口中的成员都有固定修饰符

常量:public static final

方法:public abstact

记住:接口中的成员的权限都是public

4. 接口可以被类 多实现(即一个类可以实现多个接口)

5. 程序示例:

interface MyInterface01

{

publicstatic final int NUM=3;

publicabstract void show();

}

interface MyInterface02

{

publicabstract void method();

}

class Test implementsMyInterface01,MyInterface01

{

   publicvoid show(){}       

   publicvoid method(){}

}

class InterfaceDemo

{

   publicstatic void main(String[] args)

   {

      Test test= new Test();

      System.out.println(test.NUM);

      System.out.println(MyInterface01.NUM);

      System.out.println(Test.NUM);

   }

}

6. 接口之间支持多继承

interface A

{

   public abstract void run_1();

}

interface B

{

   public abstract void run_2();

}

interface C extends A,B    //支持多继承

{

   public abstract void run_3();

}

interface D

{

   public abstract void run_4();

}

class Temp

{

   public static void temp(){}

}

//在继承的同时,多实现(implements)

class Demo extends Temp implements C,D    

{

   public void run_1(){}

   public void run_2(){}

   public void run_3(){}

   public void run_4(){}

}


三、     多态

1. 理解多态:

可以理解为事物存在的多种体现形态,比如:

人:男人,女人 / 小孩,青年,老人

动物:狗,猫,虎,兔

2. 多态概述

       i.     多态的体现:父类的引用指向了其子类对象,如

Animal c = new Cat();  c.eat();

 

     ii.     多态的前提:必须是类与类之间有关系,要么继承(extends),要么实现(implements)

   iii.     多态的好处:多态的出现大大的提高了程序的扩展性

 

3. 程序示例:

interface Animal

{

   public abstract void eat();

}

class Cat implements Animal

{

   public void eat()

   {

      System.out.println("@eatfish@");

   }

   public void catchMouse()

   {

      System.out.println("%捉老鼠%");

   }

}

class MutiForms

{

  publicstatic void main(String [] args)

  {

     //多态自始至终都是子类对象在做变化

     Animal cat = new Cat();//向上转型,Cat->Animal

     cat.eat();

     Cat C =(Cat)cat;//向下转型,Animal->Cat

     C.catchMouse();

   }

4. 多态在代码中的特点:

class Fu

{

   int num = 1989;

   void founc_1()

   {

      System.out.println("fufounc_1");

   }

   void founc_2()

   {

      System.out.println("fufounc_2");

   }

   static void founc_4()

   {

      System.out.println("fufounc_4");

   }

}

class Zi extends Fu

{

   int num = 2012;

   void founc_1()

   {

      System.out.println("zifounc_1");

   }

   void founc_3()

   {

      System.out.println("zifounc_3");

   }

   static void founc_4()

   {

      System.out.println("zifounc_4");

   }

}

class MutiForms

{

   public static void main(String[]args)

   {

      Zi z = new Zi();

      z.founc_1();

      z.founc_2();

      z.founc_3();

      System.out.println("-----------------");

      /*

      多态中(非静态)成员函数的特点:

      成员函数在多态调用时,编译看左边,运行看右边

      */

      Fu f = new Zi();

      f.founc_1();

      f.founc_2();

      f.founc_3(); //error

      System.out.println("-----------------");

      /*

      多态中成员变量的特点:

      无论编译或运行,都参考左边(引用型变量所属的类)

      */

      System.out.println("z.num---"+z.num);

      System.out.println("f.num---"+f.num);

      System.out.println("-----------------");

      /*

      在多态中,静态成员函数(同样适用于静态变量)

无论编译或运行,都参考左边(静态方法不需要对象,类名即可调用)

      */

      f.founc_4();//founc_4()是静态

      z.founc_4();

   }

}

 


### Java抽象类多态的概念及用法 #### 抽象类的定义及其特性 在 Java 中,使用 `abstract` 关键字来定义抽象类以及其中的抽象方法。抽象类不能实例化,即无法创建其对象;只有当一个类至少包含一个抽象方法时,才允许将其声明为抽象类[^2]。 ```java // 定义了一个名为Shape的抽象类,并声明了draw()作为抽象方法 abstract class Shape { public abstract void draw(); } ``` #### 实现抽象类的方式 任何继承自抽象类的具体子类都必须提供所有未实现成员函数的实际版本——也就是覆写这些抽象方法,除非该子类同样被标记成抽象类[^1]。 ```java class Circle extends Shape { @Override public void draw() { System.out.println("Drawing a circle."); } } // 如果B不是最终具体化的类,则也可以继续保持为抽象状态 abstract class A extends Shape { public abstract void draw2(); } class Rectangle extends A { @Override public void draw() { System.out.println("Drawing a rectangle."); } @Override public void draw2() { System.out.println("Additional drawing logic for subclass of A"); } } ``` #### 多态性的体现方式 通过让父类型的变量指向不同子类型的新建实体,在运行期间调用相应于实际所指派之特定型别的虚函數或覆盖版的方法,从而达到动态绑定的效果。这便是所谓的编译期静态类型检查配合执行时期动态分发机制共同作用下的面向对象编程核心概念之一 —— **多态**[^3]。 ```java public static void main(String[] args){ // 创建不同类型对象并赋予相同基类引用 Shape shapeRef; shapeRef = new Circle(); shapeRef.draw(); // 输出:"Drawing a circle." shapeRef = new Rectangle(); shapeRef.draw(); // 输出:"Drawing a rectangle." // 注意这里虽然shapeRef是Shape类型, // 但是由于真正的对象是Rectangle, // 所以会调用Rectangle里的draw() } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值