精华内容
下载资源
问答
  • 在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化” 如果只是想单纯的理解,那么...

    在c++和java中我们会定义很多类,但是我们会遇到在对类进行new实例化时会遇到“不能实例化抽象类”或者“抽象类不能实例化”,针对这个问题要首先理解两个内容“抽象类”和“实例化”

    如果只是想单纯的理解,那么意思就是你画了一个有四条边的图形你说是矩形

    但是这是不可以的,为什么?因为矩形还有一个条件就是要四个内角是直角

    其中画有四条边的图形就是抽象类,矩形就是实例化

    如果理解了含义但是不懂代码中的定义,那么那么就百度百度定义!定义真的很重要!

    抽象类定义:

    含有纯虚函数的类称为抽象类

    实例化的定义:

    用类创建对象的过程

    纯虚函数的定义:

    一个只有函数名、参数和返回值类型,没有函数体的函数成为纯虚函数。

    这一层懂了当然最好

    如果不懂再来看看代码test 中shape未编译通过

    #include <iostream>
    using namespace std;
    //定义一个形状抽象类(基类)
    class Shape {
        //保护继承 ,其派生类也会继承保护成员
      protected:
        double x;
        double y;
        //公有继承
      public:
        void set(double i, double j) {
            x = i;
            y = j;
        }
        //纯虚函数
        virtual void area() = 0;
    };
    //定义矩形类并定义其面积为长*宽(派生类)
    class Rectangle : public Shape {
        void area() { cout << x * y << endl; }
    };
    
    int main() {
        Rectangle rec; //定义一个矩形对象(实例化)
        // Shape rec;
        Shape *p = &rec; //定义一个抽象类的指针,并使它指向矩形对象
        p->set(2, 4);    //调用
        p->area();
        return 0;
    }

    详细定义矩形,可以实例化并正常输出

    未定义,提示含有纯虚函数无法抽象实例化对象

     

    展开全文
  • 首先我们知道,一个类如果是抽象类,我们就不用这个类实例化一个对象。什么样的类是抽象类呢? C++没有C Sharp中的关键字abstract,但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即不...

    今天在开发过程中遇到了一个错误:不能实例化抽象类

    这个错误完全是自己疏忽大意造成的。

    首先我们知道,一个类如果是抽象类,我们就不能用这个类实例化一个对象。

    什么样的类是抽象类呢?
    C++没有C Sharp中的关键字abstract,但是当一个类中有一个或多个纯虚函数的时候,这个类就自动成为了抽象类,即不可以实例化。

    纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。

    在实际开发中,很多时候你都需要继承别人的类,或是同事写的类,或是一些开源库中的类。

    也许是为了追求效率,我们很难认真阅读你要继承的基类,或者说你只关心基类中你需要的几个方法。

    这个时候,就存在错误的风险。也许父类中有一个纯虚函数你完全不关系,用不到,你就会大摇大摆的忽略它。

    但是它不会忽略你,记住:
    如果你的抽象类的派生类有任何一个纯虚函数没有实现,那么不管其他做的再多,这个类仍然是一个抽象类。

    所以用到你定义的子类实例化对象时候,会产生上述的错误。

    好在编译器能够帮助我们,以至于可以及时改正。

    所以,在继承一个类的时候,要确保实现了所有这个基类的纯虚函数。

    //基类:
    classA
    {
    public:
    A();
    virtual ~A();
    void f1();
    virtual void f2();
    virtual void f3()=0;
    };
    
    //子类:
    classB:publicA
    {
    public:
    B();
    virtual ~B();
    void f1();
    virtual void f2();
    virtual void f3();
    };
    展开全文
  • 问个java关于抽象类基础的问题?抽象类不是不实例化吗?怎么还通过上转型创建抽象类对象?...但为什么下面这样写是合法的,不是抽象类实例化对象吗? Flower flower = new Rose() flower.bloom();
  • 3.2、抽象一个实例化对象

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

    一、抽象一个类
    所谓抽象一个类,就是怎么创建一个类。
    1、类的声明
    类的声明只需要使用关键字class,有时候需要在关键字前加上修饰类的关键字,如abstract或者final等,有时候还有Trait等关键字来取代class。声明格式如下:
    【修饰类的关键字】class 类名{
    类中成员
    }
    实例:eg:

    <?php
    class Base {
        public function sayHello() {
            echo 'Hello ';
        }
    }
    

    类名、变量名、函数名的命名规则,需要遵循PHP自定义名称的命名规则。如果由多个单词组成,习惯上每个单词的首字母要大写。
    2、类的成员属性
    类的成员属性声明,需要public,protected,private,static等关键字来修饰
    eg:

    <?php 
    
    class test 
    { 
        public $var1 = 1; 
        protected $var2 = 2; 
        private $var3 = 3; 
        static $var4 = 4; 
    } 
    

    3、类的成员方法
    类的成员方法声明和其属性类似,只是要加关键字function,也要有关键修饰词:public,protected 和 private等。
    eg:

    <?php
    class MyClass
    {
        private $foo = FALSE;
    
        public function __construct()
        {
            $this->$foo = TRUE;
    
            echo($this->$foo);
        }
    }
    

    二、实例化对象
    我们在创建类之后,并不是直接使用类,而是通过类来实例化出对象。
    1、实例化对象
    实例化对象需要使用的new关键字,一个类可以被实例化出多个对象,对象之间没有关联。
    eg:

    <?php
    	class MyClass
    	{
    	    private $foo = FALSE;
    	
    	    public function __construct()
    	    {
    	        $this->foo = TRUE;
    	
    	        echo($this->foo);
    	    }
    	}
    	
    	$bar = new MyClass();
    

    2、对象类型在内存中分配情况
    内存大体上被分为四段:
    1)栈空间段
    该空间段主要特点是:空间小,被访问速度快,后进先出(先进后出)。用于存储占用空间不变且占用空间小的数据类型的内存段。例如整型1、10、10000在内存中占用的空间是等长的,都是32位4字节。整型、double、boolean等类型都可以存储在栈空间段。
    2)堆空间段
    用于存储数据长度不定长,而且占用空间很大的数据类型的数据,例如字符串、数组、对象。该段是动态分配的。
    3)初始化数据段
    用于存放可执行文件中已初始化的全局变量,数据段存储经过初始化的全局和静态变量
    4)代码段
    存放可执行文件的操作指令,就是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只允许读取操作,不允许写入(修改)操作。例如程序中的函数就存储在该内存段中。
    其各段特点简要说明如下图:
    这里写图片描述

    实例说明:eg:

    <?php
    	class person{
    		public $name;
    		public $sex;
    		public function say(){
    			echo '666';
    		}
    	}
    	$p1 = new person();
    	$p2 = new person();
    	$p3 = new person();
    	/**$p1是第一个对象的引用变量(通过“=”把第一个对象的首地址"0xff001",赋值给了$p1),
    	 * 存放的是一个十六进制的整数被存放在栈内存中。相当于一个指针指向堆里边的对象。
    	 * 所以访问对象里边的成员都需要通过引用变量$p1
    	 */
    

    上段代码图形说明如下:
    这里写图片描述
    易混淆点:
    1、当将对象赋值给另一个变量时,此时是将对象的“首地址”赋值给了另一个变量,堆内的对象并没有复制一份。
    实例说明eg1:

    <?php
    	class test{
    		public $name;
    	}
    	$a = new test();
    	$b = $a;//这里与$b = &$a效果是一样的,仅针对对象
    	$b->name = 123;
    	var_dump($a->name);//输出123,说明只是将第一个对象的“首地址”赋值给了$b,改变的都是一个堆内的对象属性值
    	unset($a);
    	var_dump($b->name);//输出123,unset释放的只是第一个对象栈中的引用变量。
    	
    

    示例1说明图:
    这里写图片描述
    2、如果想得到一个对象的副本,用$a =clone $b; 用了clone后会产生一个新对象,分配内存,独立于原来的$a。
    eg2:

    <?php
    	class test{
    		public $name;
    	}
    	$a = new test();
    	$b = clone $a;
    	$b->name = 123;
    	var_dump($a->name);//输出null
    	unset($a);
    	var_dump($b->name);//输出123
    

    示例2图形说明:
    这里写图片描述

    3、当一个对象的引用断了的时候,这个对象在堆中就被当做垃圾,php就会执行垃圾回收机制,将这个对象回收,如图
    这里写图片描述
    4、栈内后进先出(先进后出)机制
    eg3:

    <?php
    class test  
    {  
        public $name;  
        //构造函数,当类被实例化时,会自动执行
        public function __construct($name)  
        { 
            $this -> name = $name;  
            echo $this->name."这里被执行了<br>";  
        }  
        public function __destruct()  
        {  
            echo $this->name."我被回收了<br>";  
        }  
    }
    $p1 = new test('王二');
    $p1 = 1;  
    $p2 = new test("张三");  
    $p3 = new test("李四");  
    /**输出 
     * 王二这里被执行了
     * 王二我被回收了
     * 张三这里被执行了 
     * 李四这里被执行了 
     * 李四我被回收了 
     * 张三我被回收了 
     */
    //因为$p1引用被重新赋值,最先失去了引用,所以调用了析构函数。
    //然后在这个脚本执行完成后,开始自动调调用后边对象的析构函数,
    //因为$p2,$p3引用存储在栈内,因为栈内后进先出机制,最后创建的对象最先被释放,所以$p3先被销毁。
    

    三、$this
    在对象的内部,在对象的成员方法中访问自己对象的成员属性,或者对象内的其他成员方法,可以用特殊对象应用 t h i s 。 一 旦 我 们 n e w 了 一 个 对 象 , 那 么 对 象 中 的 每 个 成 员 方 法 中 都 存 在 一 个 特 殊 的 对 象 应 用 ‘ this。 一旦我们new了一个对象,那么对象中的每个成员方法中都存在一个特殊的对象应用` thisnewthis。成员方法属于那个对象,那么$this就代表哪个对象。就像你别人要访问你的性别,要用“张三是男生”,但是你自己访问自己的性别,你要用“我是男生”一样。eg3中的例子就用到了$this`。

    四、构造函数和析构函数
    1、构造函数__construct ([ mixed $args [, $... ]] )
    具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
    注意:
    如果子类中定义了构造函数则不会调用其父类的构造函数。
    要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct()。
    如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。

    eg1:

    <?php
    class Base {
       function __construct() {
           print "1";
       }
    }
    
    class Sub extends Base {
       function __construct() {
           parent::__construct();
           print "2";
       }
    }
    
    class OtherSub1 extends Base {
       function __construct() {
           print "2";
       }
    }
    
    class OtherSub2 extends Base {
       
    }
    
    $obj = new Base();//输出1
    $obj = new Sub();//输出12
    $obj = new OtherSub1();//输出2
    $obj = new OtherSub2();//输出1
    

    附:构造函数的参数
    eg:

    <?php
    	class Base {
    		public $name;
    		public function __construct($name = '小王') {
    		   $this->name = $name;
    		}
    		
    		public function name(){
    			echo $this->name;
    		}
    	}
    	$name1 = new Base('小李');
    	$name1->name();//输出‘小李’
    	$name2 = new Base();
    	$name2->name();//输出‘小王’
    

    2、析构函数__destruct ( void )
    析构函数并是不销毁什么,而是会在到某个对象的所有引用都被删除或者当对象被销毁时执行。
    注意
    析构函数没有参数,
    和构造函数一样,父类的析构函数不会被子类中调用,
    要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct()。
    此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
    析构函数即使在使用 exit() 终止脚本运行时也会被调用。在析构函数中调用 exit() 将会中止其余对象的所有引用都被删除或者当对象被销毁的析构函数的执行。这一点,可以通过实例细细体会。

    展开全文
  • 抽象类可以实例化吗?

    万次阅读 多人点赞 2018-11-01 15:29:45
    抽象类可以有自己的构造方法,但是不直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。这其实用到了多态,向上转型。父类引用指向子类对象~ ...

    抽象类可以有自己的构造方法,但是不能直接通过new进行实例化。但是可以通过子类继承,实例化子类的时候抽象类也会被实例化。这其实用到了多态,向上转型。父类引用指向子类对象~

    展开全文
  • 这就让我很郁闷了,自己定义类也并非抽象类,怎么还不能实例化对象了呢?抽象类:在C++中,当一个类中具有一个或多个纯虚函数的时候,这个类就是抽象类,不进行实例化。 一般来说,具有纯虚函数的类,被称为抽象...
  • 大家都知道抽象类无法实例化,就无法创建对象。所以下面这篇文章主要给大家介绍了关于Java实例化一个抽象类对象的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧...
  • 接口和抽象类能实例化对象

    千次阅读 2015-05-12 17:54:54
    ArrayList points = new ArrayList(); Iterator i = points.iterator(); points是ArrayList的对象,用...i是Iterator的引用 引用的是Iterator的实现对象; 方法说明如下: iterator public I
  • java实例化一个抽象类对象

    千次阅读 2019-07-16 16:23:09
    不对啊,根据我的知识一个抽象类直接实例化一个对象出来,面向对象期末考试的卷子还有专门一道让你改错的题,一般抽象类直接实例化对象都是每年必考的错误点。那这个对象从哪实例化,国家分配的吗?先不管,结果...
  • 如何实现抽象类实例化

    千次阅读 2018-11-01 12:05:06
    正常情况下抽象类是不能实例化的,但可以模拟实例化,即 利用匿名内部类可以实现抽象类的,举例如下: 1、需要实例化抽象类 代码如下: public abstract class AbstractFruit { private String name; ...
  • 关于抽象类无法实例化,但是可以使用"new"来实例的疑问. 背景:昨天下午回答一个实习生问的问题,大致的经过是这样的: 他问的:“为什么抽象类无法实例化,但是可以new出来一个实例,官方这么说是什么意思?而且去了各类...
  • C++ 不能实例化抽象类

    万次阅读 2014-01-03 09:11:18
    关于C++ 不能实例化抽象类: 例: #include class Base{ public:virtual void fun()=0; } ; class Test:public Base{ public:virtual void fun(){cout;} } ; void main(){ Base a; Test *p;p=&a; } void...
  • 今天被问到抽象类要不要有构造函数的时候, 我随口一答应该是没有的, 我以为, 抽象类是不直接用new来被实例化的, 所以也就不需要再去写构造函数了; 随后查了一下明白: 抽象类也需要构造函数, 在大多数情况中抽象类...
  • public class TestClass { private InterfaceA a = new InterfaceA() { @Override public void testA() { ...//成员匿名,例如在Android开发中常用的Handler。 public static void main(St...
  • 抽象类是否可以实例化讨论

    千次阅读 2018-04-14 14:59:11
    1. 抽象类可以实例化吗?Answer:(1)、首先,抽象类是不可以实例化...这样创建了继承抽象类的子类对象,也就是把其父类(抽象类)给实例化了。代码如下:父类:public abstract class B {private String s...
  • java抽象类怎么实例化

    万次阅读 2011-05-08 10:28:00
    抽象类不是不能实例化的么? <br />import java.net.*; import java.io.*; public class TCPClient { public static void main(String[] args) throws Exception {  Socket s = new ...
  • 抽象类能创建对象吗

    千次阅读 2020-07-15 00:27:20
    抽象类是不创建对象的原因: 1.子类更具体,父类更抽象,直接创建父类对象本身没有意义。 2.如果创建的是父类对象再调用方法的时候,调用的父类中的方法,而非子类的方法,它违背了多态的这种思想和设计 3.因为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 426,813
精华内容 170,725
关键字:

抽象类能实例化对象吗