抽象类和非抽象类

本文深入探讨了抽象类和接口在Java中的应用,详细解释了抽象类不能直接实例化,只能作为基类,以及如何在抽象类中声明抽象方法。同时,对比了抽象类与接口之间的区别,包括它们的派生类继承、成员实现、字段、构造函数等特性。通过实例代码展示了如何在实际场景中运用抽象类和接口。
csdn解析: 

abstract 修饰符用于表示所修饰的类是不完整的,并且它只能用作基类。抽象类与非抽象类在以下方面是不同的:

  • 抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
  • 允许(但不要求)抽象类包含抽象成员。
  • 抽象类不能被密封。

当从抽象类派生非抽象类时,这些非抽象类必须具体实现所继承的所有抽象成员,从而重写那些抽象成员。在下面的示例中

abstract class A
{
   public abstract void F();
}
abstract class B: A
{
   public void G() {}
}
class C: B
{
   public override void F() {
      // actual implementation of F
   }
}

抽象类 A 引入抽象方法 F。类 B 引入另一个方法 G,但由于它不提供 F 的实现,B 也必须声明为抽象类。类C 重写 F,并提供一个具体实现。由于 C 中没有了抽象成员,因此可以(但并非必须)将 C 声明为非抽象类。

 

如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法

1.抽象类概述及声明

抽象类与非抽象类的主要区别:

·抽象类不能直接被实例化

·抽象类中可以包含抽象成员,但非抽象类中不可以

·抽象类不能被密封

举个小例子

public abstract class oneClass

{

  public int i;

  public void denylau()

  {

  }

}

2.抽象方法概述及声明

声明抽象方法时需注意:·抽象方法必须声明在抽象类中  ·声明抽象方法时,不能使用virtual、static、private修饰符。

在抽象类中抽象方法不提供实现。

如:

public abstract class myTestClass()

{

  public abstract void method();

}

3.抽象类与抽象方法的使用

直接举例子,讲解例子喽!

using System;
using System.Collections.Generic;
using System.Text;

namespace _
{
    public abstract class myClass
    {
        private string id = "";
        private string name = "";
        /// <summary>
        /// 编号属性及实现
        /// </summary>
        public string ID
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }
        /// <summary>
        /// 姓名属性及实现
        /// </summary>
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        /// <summary>
        /// 抽象方法,用来输出信息
        /// </summary>
        public abstract void ShowInfo();
    }
    public class DriveClass:myClass                     //继承抽象类
    {
        /// <summary>
        /// 重写抽象类中输出信息的方法
        /// </summary>
        public override void ShowInfo()
        {
            Console.WriteLine(ID + " " + Name);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            DriveClass driveclass = new DriveClass();   //实例化派生类
            myClass myclass = driveclass;               //使用派生类对象实例化抽象类
            myclass.ID = "BH0001";                      //使用抽象类对象访问抽象类中的编号属性
            myclass.Name = "TM";                        //使用抽象类对象访问抽象类中的姓名属性
            myclass.ShowInfo();                         //使用抽象类对象调用抽象类中的的抽象方法
        }
    }
}

上例中通过派生类的对象driveclass来实例化抽象类,然后使用抽象类访问抽象类中的属性及方法。

上面这个小例子,细心的朋友会发现,怎么抽象类和我们上一篇文章讲的接口差不多吗?那么究竟抽象类和接口存在哪些区别呢?

Ok,下面就介绍下抽象类和接口的区别喽:

·它们的派生类只能继承一个基类,即只能继承一个抽象类,但是可以继承多个接口。

·抽象类中可以定义成员的实现,但接口中不可以。

·抽象类中包含字段、构造函数、析构函数、静态成员或常量等,接口中不可以。

·抽象类中的成员可以私有的(只要不是抽象的)、受保护的、内部的或受保护的内部成员,但接口中的成员必须是公共的。

PS:抽象类和接口这两种类型用于完全不同的目的。抽象类主要用作对象系列的基类,共享某些主要特性,例如共同的目的和结构。接口则主要用于类,这些类在基础水平上有所不同,但仍然可以完成某些相同的任务。

 

### 抽象类非抽象的主要区别 在面向对象编程中,抽象类非抽象是两种不同的定义方式,它们各自有其特定的用途特点。以下是两者之间的主要区别: 1. **实例化能力** 非抽象可以直接被实例化为对象,而抽象类不能直接实例化。抽象类只能作为基被子继承,并且子必须实现抽象类中定义的所有抽象方法才能实例化[^1]。 2. **方法定义** 非抽象可以包含具体的方法实现(即带有方法体的函数),也可以包含抽象方法(如果该本身声明为抽象类)。然而,抽象类可以包含未实现的方法(即只有方法签名而没有方法体的抽象方法)以及具体实现的方法。这意味着抽象类既可以提供通用的功能实现,也可以强制要求子实现某些特定的行为[^1]。 3. **设计意图** 非抽象通常用于表示具体的、完整的实体或行为模式。而抽象类的设计目的是为了提供一个统一的接口或模板,供子继承并扩展。抽象类通过定义共同的行为属性,减少了代码重复,并增强了代码的可维护性。 4. **构造函数** 非抽象可以拥有普通的构造函数,用于初始化对象的状态。而抽象类虽然也有构造函数,但它的作用仅限于初始化子对象时使用,因为抽象类本身不能被实例化。 5. **继承关系** 非抽象可以被其他继承,但继承链中的子不需要强制实现父中的所有方法(除非父中有抽象方法)。抽象类则明确地要求任何非抽象的子都必须实现它所定义的所有抽象方法[^1]。 6. **适用场景** 非抽象适用于描述完全定义的对象模型,而抽象类更适合用于定义一组相关的公共基础结构。例如,在构建复杂系统时,可以通过抽象类来定义一组规则,确保所有子遵循这些规则[^1]。 ```python # 示例:抽象类非抽象的区别 from abc import ABC, abstractmethod # 抽象类示例 class AbstractAnimal(ABC): @abstractmethod def speak(self): pass # 抽象方法,必须由子实现 def eat(self): print("Eating...") # 具体方法,子可以直接使用 # 非抽象示例 class Dog: def speak(self): print("Bark") def eat(self): print("Dog is eating...") # 抽象类不能直接实例化 # animal = AbstractAnimal() # 这会引发 TypeError # 子必须实现抽象方法 class Cat(AbstractAnimal): def speak(self): print("Meow") # 创建非抽象实例 dog = Dog() dog.speak() # 输出: Bark # 创建抽象类的子实例 cat = Cat() cat.speak() # 输出: Meow cat.eat() # 输出: Eating... ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值