精华内容
下载资源
问答
  • 面向对象——抽象类抽象方法

    千次阅读 2020-04-13 09:26:04
    如果一个不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生的一个基类,这样的就是派生,在抽象类中,声明抽象类中声明抽象方法是,如果加上abstract关键字则为抽象方法。abstract 修饰符可...

    如果一个类不与具体的食物相联系,而只表达一种抽象的概念,仅是作为其派生类的一个基类,这样的类就是派生类,在抽象类中,声明抽象类中声明抽象方法是,如果加上abstract关键字则为抽象方法。abstract 修饰符可用于类、方法、属性、索引器和事件。

    在类声明中使用abstract 修饰符以指示某个类只能是其他类的基类。

    标记为抽象或包含在抽象类中的成员必须通过从抽象类派生的类来实现。

    通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。例如:

    public abstract class A

    {

        // Class members here.

    }

    抽象类的用途是提供多个派生类可共享的基类的公共定义。

    抽象类具有以下特性:

      • 抽象类不能实例化。
      • 抽象类可以包含抽象方法和抽象访问器。
      • 不能用sealed修饰符修饰抽象类,因为这两个修饰符的含义是相反的。采用sealed 修饰符的类无法继承,而abstract 修饰符要求对类进行继承。
      • 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实际实现。

    抽象类必须为所有接口成员提供实现。

    实现接口的抽象类可以将接口方法映射到抽象方法上。例如:

    interface I

    {void M();}

    abstract class C : I

    {

    public abstract void M();

    }

    抽象方法是隐式的虚方法。

    由重写方法override提供实现,此重写方法是非抽象类的一个成员。

    只允许在抽象类中使用抽象方法声明。

    在抽象方法声明中使用 static 或 virtual 修饰符是错误的。

    当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。例如:

    public class D 

    {

    public virtual void DoWork(inti)      {   // Original implementation.    }

    }

    public abstract class E : D

    { public abstract override void DoWork(inti);}

    public class F : E  

    {

    public override void DoWork(inti)  

    {  // New implementation.  }

    }

    如果将 virtual 方法声明为 abstract,则该方法对于从抽象类继承的所有类而言仍然是虚方法。

    继承抽象方法的类不能访问该方法的原始实现。

    在上例中,类F 的DoWork不能调用类D中的DoWork。通过这种方式,抽象类可以强制派生类为虚方法提供新的方法实现。除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样。在静态属性上使用 abstract 修饰符是错误的。

    在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

    例:自定义抽象类计算圆形面积

    public partial class Form1 : Form

        {

    public Form1()

    {InitializeComponent();}

    private void button1_Click(object sender, EventArgs e)

            {

    CalcAreacalcArea = new CalcArea();//实例化派生类

                Roll roll = calcArea;//使用派生类对象实例化抽象类

                string strNum=textBox1.Text.Trim();//记录TextBox文本框中的内容

    if (strNum != "")//判断是否输入了圆半径

                {

    try

                    {

    roll.R = int.Parse(strNum );//使用抽象类对象访问抽象类中的半径属性

                        textBox2.Text = roll.Area().ToString();//调用自定义方法进行求圆面积

                    }

    catch

                    {

    MessageBox.Show("请输入正确的圆半径!");

                    }

                }

            }

        }

    public abstract class Roll

        {  // 圆半径

    privateint r = 0;

    publicint R

    { get {return r;}set{r = value;}  }

    public abstract double Area();// 抽象方法,用来计算圆面积

        }

        public class CalcArea : Roll//继承抽象类

        {

    public override double Area()   // 重写抽象类中计算圆面积的方法

            {

    returnMath.PI * R * R;

            }

    }

     

    虚拟方法和抽象方法有什么区别?
    抽象方法只有声明没有实现,需要在子类中实现;虚拟方法有声明和实现,并且可以在子类中覆盖,也可以不覆盖使用父类的默认实现
    虚拟方法有实现代码,抽象方法则没有
    并且抽象类不能被实例化,只能实例化实现了全部抽象方法的派生类
    抽象方法是虚拟方法的一种
    抽象方法没有实现,它的存在只是为派生类统一接口;派生类应该实现这个方法
    如果编写一个基类,它永远不会被实现,那么就应该将这个类中的一个或多个方法定义为
    抽象方法。
    抽象方法只存在于抽象类中,有抽象方法的类必须定义为抽象类
    其实大家首先要搞清楚,虚方法与多态性关系密切,虚方法允许派生类完全或部分重写该类的方法,需写方法体。抽象类中可以包含抽象方法与一般的方法,抽象类不可以new,抽象方法只是一个定义,没有方法体,也就是没有{},也不要在里面写内容。它们两个相像的一点是都用override重写

     

    展开全文
  • 抽象类能创建对象吗?

    千次阅读 2020-07-15 00:27:20
    在面向对象的概念中,所有的对象都是通过来描绘的,但是反过来,并不是所有的都是用来描绘对象的,如果一个中没有包含足够的信息来描绘一个具体的对象,这样的就是抽象类抽象类是不能创建对象的原因: ...

    什么是抽象类呢?

    在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

    抽象类是不能创建对象的原因:

    1.子类更具体,父类更抽象,直接创建父类对象本身没有意义。
    2.如果创建的是父类对象再调用方法的时候,调用的父类中的方法,而非子类的方法,它违背了多态的这种思想和设计
    3.因为父类引用指向子类对象时,调用的方法是子类重写的方法,一般父类中的描述不够具体,并不是说抽象类的构造方法没有意义,那么在创建子类对象时需要先调用父类的构造方法。
    4.抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)
     

    展开全文
  • java-面向对象编程-抽象类

    千次阅读 2017-04-04 15:12:40
    我们在上一章中介绍了什么是接口,也说到了接口就是一组抽象的数据模型,可以理解为一组协议。但实际上,在面向对象的概念中,有一个知识点是极容易被...从语义而言,抽象类的意思是指抽象体。什么意思呢?我们知道

    我们在上一章中介绍了什么是接口,也说到了接口就是一组抽象的数据模型,可以理解为一组协议。但实际上,在面向对象的概念中,有一个知识点是极容易被人与接口混淆的,人们往往会误解为这两者是同一个概念。但不幸的是,两者虽然有相似之处,但却是完全不一样的概念。那么,如此神秘的它到底是什么呢?让我们揭开它的盖头来—主角登场–>抽象类。
    什么叫抽象类呢?从语义而言,抽象类的意思是指类的抽象体。什么意思呢?我们知道类是对具体事物的抽象,但是有的时候,有一些类的信息不足以去描绘出一个具体的对象,那么这些类就叫做抽象类。什么意思呢?就好比现在有三角形类,四边形类,八边形类。它们的形状都是不一样的。但是它们又都可以叫做图形,只是每个类的画法是不一样的而已。那么,在这里,我们就可以构建一个叫做图形的抽象类,然后在里面添加一个叫做画图的抽象方法,然后让三角形类,四边形类,八边形类去继承这个抽象类,再重写这个画图方法。比如:

    package testabstractclass;
    /**
     * 测试入口
     */
    public class Test1 {
        public static void main(String[] args) {
            Triangle triangle = new Triangle();
            Quadrilateral quadrilateral = new Quadrilateral();
        }
    }
    /**
     * 继承了抽象类的三角形类
     */
    class Triangle extends ABSGraph{
        public Triangle(){
            System.out.print("我是三角形-->");
            draw();
        }
        @Override
        public void draw() {
            System.out.println("三角形画法");    
        }
    }
    /**
     * 继承了抽象类的四边形类
     */
    class Quadrilateral extends ABSGraph {
        public Quadrilateral() {
            System.out.print("我是四边形-->");
            draw();
        }
        @Override
        public void draw() {
            System.out.println("四边形画法");
        }
    }
    /**
     * 抽象类
     */
    abstract class ABSGraph{
        //抽象方法
        public abstract void draw();
    }

    运行后,效果如下:
    这里写图片描述

    注意的是:一但在抽象类中声明了抽象方法,那么就必须要在子类中实现该方法,这点和接口是相似的。但和接口不同的是,抽象类中是可以存在具体的实现方法,并且该方法是可以不被子类实现而直接调用的。比如:

    package testabstractclass;
    /**
     * 测试入口
     */
    public class Test1 {
        public static void main(String[] args) {
            Triangle triangle = new Triangle();
            //直接调用抽象类的具体方法
            String name =triangle.GetName();
            System.out.println(name);
        }
    }
    
    class Triangle extends ABSGraph{
        public Triangle(){
            System.out.print("我是三角形-->");
            draw();
        }
        @Override
        public void draw() {
            System.out.println("三角形画法");    
        }
    }
    
    abstract class ABSGraph{
        //抽象方法
        public abstract void draw();
        //具体办法
        public String GetName() {
            return "ABSGraph是抽象类";
        }
    }

    运行结果如下:
    这里写图片描述

    从以上两点可以得出,其实抽象类和普通的类在语法上是很相似的,只是在标志符上用了abstracrt关键字来标明类。实例如下:

    abstract class AbsClass{
    //抽象办法,注意抽象办法不需要写方法体,同接口一样
    public abstract int absMethodName();
    //具体办法,同普通类一样
    public int comMethodName(){
        return 0;
    }
    }

    那么,抽象类和普通类有什么不一样的地方呢?主要有三点:

    1.抽象类不能直接初始化对象,必须创建一个子类去继承,并且实现抽象类中的所有抽象方法
    2.抽象类不能用private关键字标识类体或抽象方法
    3.抽象类允许包含抽象成员(但没有强制要求)
    

    注意:针对第一点,有一个地方容易让人混淆,事例如下:
    这里写图片描述
    有人可能会疑虑:不是说抽象类不能直接初始化对象吗?怎么在这个例子里面又可以呢?其实,这个问题在讲到内部类的时候,就已经说到了。在这个例子里,抽象类并没有直接初始化一个对象,而是通过一个匿名内部类继承了ABSGraph,实现了抽象方法之后,再将其向上转型为
    ABSGraph类型的triangle对象。其中涉及了多态及内部类的相关知识点。同时,因为接口也可以作为匿名内部类的继承方式,所以这里也容易被人与接口进行混淆。
    那么,既然我们说抽象类容易被人与接口进行混淆,那么他们之间有什么区别呢?我们来看看:

    1.从继承方式来看,一个子类只可以继承一个父类(不管是具体类还是抽象类),但可以继承多个接口
    2.抽象类可以实现方法的细节,但是接口是不允许存在的。这表现为:如果有两个子类继承了抽象类。那么当有需求进行更改的时候,我们只需要更改抽象类而不同更改它的子类。这等于一种模板式的设计。我们确定好了模板之后,所生产的产品是不需要再做改动的。但是如果两个自己实现了接口,当接口发生了改变时,那么它的子类是需要发生相应的改变的。这是一种辐射性设计,当协议发生改变的时候,其子类必须修改自身去适应这个协议的要求。因此,我们也说抽象类就是模板,而接口就是协议。
    3.接口中不能含有静态的方法,而抽象类中允许
    4.接口默认所有的方法为public abstract final类型,而接口的方法可以自定义。
    

    至此,关于抽象类的介绍就到此结束了,学习抽象类最主要的地方就是理解好它和普通类以及它和接口的区别在哪。因为通过这些比对,你才能更容易去理解什么是模板设计,什么是辐射设计。抽象类为什么是对事物的抽象,接口为什么是对行为的抽象。为什么说接口的层次比抽象类更高等等。对于抽象类的运用,多使用在模式设计上,比如抽象工厂模式。但不可置疑的是,抽象类和接口是最能体现面向对象编程的思想的。因此,对抽象类有一个比较清晰的了解。会让你在学习面向对象的路上走得更远哦。
    好了,我们下一章的内容是:Java-面向对象编程-几个关键字,敬请期待。如对本章内容有所疑问,可在下方评论探讨。

    展开全文
  • Kotlin编程中: 1. 伴生对象; 2. 抽象类; 3. 密封

    Kotlin编程相关知识点介绍


    本篇概括:

    • 伴生对象
    • 抽象类
    • 密封类

    伴生对象


    package com.xingen.kotlin.day2017531
    
    fun main(args: Array<String>) {
        Test.instance.test()
        Test.test1()
    }
    class  Test {
         fun test() {
             println("伴生对象的静态调用对象,通过对象再调用方法")
        }
        companion object  Factory{ // 伴生对象
            var instance =Test()
            fun  test1(){
                println("伴生对象的静态调用方法")
            }
        }
    }

    输出结果:

    伴生对象的静态调用对象,通过对象再调用方法
    伴生对象的静态调用方法

    可知

    • 伴生对象可以实现静态调用,通过类名.属性名或者类名.方法名进行调用。

    抽象类


    package com.xingen.kotlin.day2017531
    
    fun main(args: Array<String>) {
        Test.instance.test()
         Test.instance.test1()
    }
    
    /**
     * 定义一个抽象类
     *
     *   1. 抽象类中有抽象方法,方法的实现。
     *   2. 抽象类和抽象方法是默认open关键字修饰的
     */
    abstract  class TestAbstract{
        var v="抽象类中属性"
        abstract fun  test()
        fun test1(){
                  println("抽象类中方法的实现")
        }
    }
    class  Test :TestAbstract(){
        override fun test() {
           println("一个抽象类的子类中使用 $v")
        }
        companion object  Factory{//伴生对象
            var instance :TestAbstract=Test()
        }
    }

    输出结果:

    一个抽象类的子类中使用 抽象类中属性
    抽象类中方法的实现

    可知

    • 抽象类和抽象方法是默认open关键字修饰的
    • 抽象类有抽象方法和方法的实现,可以有成员属性

    密封类


    通常与When语句一起使用,确保声明到所有的情形,不需要使用else语句。

    在一个源文件(.kt),编写以下代码:

    package com.xingen.kotlin
    
    /**
     * Created by ${新根} on 2017/5/24 0024.
     * 博客:http://blog.csdn.net/hexingen
     */
    
    fun main(str: Array<String>) {
        test( BaseClass.Test1() )
        test( BaseClass.Test2() )
        test( BaseClass.Test3 )
    }
    
    /**
     * 使用when表达式
     */
    
    fun test(instance: BaseClass)=when(instance){
        is BaseClass.Test1-> instance.test()
        is BaseClass.Test2-> instance.test()
        is BaseClass.Test3->instance.test()
    }
    /**
     *
     * sealed修饰符修饰密封类。
     *
     * 密封类内部含有多个子类。
     */
    sealed class BaseClass {
    
        class Test1 : BaseClass() {
            override fun test() {
                println("Test1实例")
            }
    
        }
        class Test2 : BaseClass() {
            override fun test() {
                println("Test2实例")
            }
        }
        object Test3 : BaseClass() {
            override fun test() {
                println("Test3实例")
            }
        }
        open fun test() {
            println("BaseClass实例")
        }
    }

    输出如下:

    Test1实例
    Test2实例
    Test3实例
    展开全文
  • 抽象类能否创建对象

    千次阅读 2020-07-16 20:06:40
    抽象类和接口都能创建对象,只是后边的new不能是new他们自己,但可以new他们的实现类(必须是类,不能是抽象类和接口), 人们使用抽象类和接口只是为了说明要干什么事,而让他们的实现类去根据自己的需要去实现这些...
  • 这种情况搞不懂,创建对象成功了,是只要把抽象方法给具现化了就能创建吗? ``` abstract class Driver { public abstract void drive(); } public class Test { public static void main(String[] args) ...
  • Java抽象类 详解

    万次阅读 多人点赞 2016-10-05 00:06:35
    一、抽象类的基本概念普通是一个完善的功能,可以直接产生实例化对象,并且在普通中可以包含有构造方法、普通方法、static方法、常量和变量等内容。而抽象类是指在普通的结构里面增加抽象方法的组成部分。...
  • Python面向对象之接口抽象类

    千次阅读 2018-08-09 08:31:27
    Python面向对象之接口抽象类):就是制定一个规范。 比如定义了一个接口抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因)。 他的定义是需要abc模块,要变的就是他的方法,比如...
  • JAVA面向对象抽象类和接口

    千次阅读 2015-12-25 16:19:44
    抽象类与接口比较前面为大家介绍了的相关概念以及使用方式,在Java中有两种特殊的,分别为抽象类和接口(本质上还是),这一片博客就为大家介绍一下抽象类以及接口的使用。这两种特殊的进行比较。抽象类...
  • 抽象类为什么不能创建对象

    千次阅读 2020-07-10 17:24:06
    抽象类往往用来表征问题领域进行分析、设计中得出的抽象概念,是一系列看上去不同,但是本质上相同的具体概念的抽象。 通常在编程语句中用 abstract 修饰的抽象类。在C++中,含有纯虚拟函数的称为抽象类...
  • Java抽象类不能创建对象

    万次阅读 2017-03-06 14:35:21
    抽象类和接口都能创建对象,只是后边的new不能是new他们自己,但可以new他们的实现类(必须是类,不能是抽象类和接口), 人们使用抽象类和接口只是为了说明要干什么事,而让他们的实现类去根据自己的需要去实现这些...
  • 通过接口抽象类“创建”对象

    千次阅读 2018-08-21 21:36:24
    首先声明,用接口或者抽象类实例化一个对象是不可能的,错误的。 接口、抽象类实现注意点 Interface 属性默认都是 public static final 方法默认都是 public abstract 都不用显示声明 抽象类 至少含有一个...
  • 对象抽象是类,类的具体化就是对象,也可以说类的实例就是对象。类用来描述一系列对象,概述了每个对象应包括的数据,并概述了每个对象的行为特征。 面向对象的三个基本特征: 一、封装  对象要有一个明确...
  • 什么是抽象类?什么是抽象方法?

    千次阅读 2019-03-06 21:09:42
    抽象类抽象类就是不能使用new方法进行实例化的,即没有具体实例对象抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再...
  • 首先我们知道,一个如果是抽象类,我们就不能用这个实例化一个对象。什么样的抽象类呢? C++没有C Sharp中的关键字abstract,但是当一个中有一个或多个纯虚函数的时候,这个就自动成为了抽象类,即不...
  • 抽象类如何通过本方法获取对象

    千次阅读 2015-03-22 16:26:55
    抽象类通过本方法获得的对象一定是子类对象
  • 抽象类必须要有抽象方法吗?

    千次阅读 2019-07-22 14:36:51
    这个题目主要是考察对抽象类的理解。 说一下我个人的理解吧。 1.如果一个使用了abstract关键字修饰,那么这个就是一个抽象类。 2.抽象类可以没有抽象方法 3.一个如果包含抽象方法,那么这个必须是抽象类...
  • 抽象方法就是为了方便继承而引入的,我们先来看一下抽象类抽象方法的定义再说明它的用途。 什么是抽象方法?我们在里面定义的没有方法体的方法就是抽象方法,所谓的没有方法体指的是,在方法声明的时候没有大...
  • 可以用一个抽象类定义一个指向该的指针,但是不能定义或声明对象。 这个中原因就是,定义一个对象是,编译器在编译时需要了解的所有信息以便准确的为要实例化的对象分配内存;由此可见,定义一个类对象是要...
  • 3.2、抽象一个和实例化对象

    千次阅读 2018-03-28 19:20:36
    一、抽象一个 二、实例化对象 1、实例化对象 2、对象类型在内存中分配情况 三、$this 四、构造函数和析构函数
  • Java学习笔记一面向对象抽象类

    千次阅读 2020-03-16 12:25:28
    抽象方法和抽象类必须使用abstract
  • 面向对象抽象

    千次阅读 2019-04-20 18:52:02
    抽象类Abstract 抽象类 形状:三角形 圆形 矩形 父类的方法必须要存在,因为我们多态的必要条件是必须存在方法重写 方法的实现毫无意义 提供一个方法的声明即可,不需要实现,就是抽象方法 抽象类的特点: 1.抽象方法...
  • 抽象类

    千次阅读 2019-01-29 16:30:36
    抽象类的概念 Java中允许在中只声明方法而不提供方法的实现。这种只有声明而没有方法体的方法成为抽象方法,而包含一个或者多个抽象方法的称为抽象类抽象方法是通过指定abstract关键字来创建。抽象方法没有...
  • Java 抽象类

    千次阅读 多人点赞 2019-01-28 09:16:52
    在面向对象的概念中,所有的对象都是通过来描绘的,但是反过来,并不是所有的都是用来描绘对象的,如果一个中没有包含足够的信息来描绘一个具体的对象,这样的就是抽象类抽象类除了不能实例化对象之外,...
  • 抽象类:需要的是该抽象子类对象 接口:需要的是该接口的实现(或者说子类也可行)对象 //下面这句话一定要理解并记住: //抽象类和接口虽然都不能直接创建对象,但是可以通过多态进行对象的创建... */...
  • 接口和抽象类的区别是什么? •接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。 •接口中的实例变量默认是 final 类型的,而抽象类中则...
  • 什么是抽象类

    千次阅读 2017-02-16 12:16:53
    在面向对象的概念中,所有的对象都是通过来描绘的,但是反过来,并不是所有的都是用来描绘对象的,如果一个中没有包含足够的信息来描绘一个具体的对象,这样的就是抽象类抽象类除了不能实例化对象之外...
  • 什么是对象抽象过程)

    千次阅读 2017-07-19 22:39:21
    说起对象,我们首先要从抽象说起,只有知道了抽象是怎么回事,你才不会对对象只停留在片面的理解层面。 抽象过程: 所有的变成语言都提供抽象机制。可以认为,我们用计算机能解决的问题的复杂性直接取决于抽象的...
  • **接口和抽象类的联系和区别? 答:联系主要体现在: 抽象类:** (1)一个中有抽象方法,这个就变成了抽象类。 (2)抽象类中class的前面必须有abstract修饰符。 (3)抽象类中可以有普通方法,也可以有...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,047,498
精华内容 418,999
关键字:

对象是对类的抽象吗