当前位置:编程学习 > JAVA >>

深入Java中的抽象类为何不能实例化?

讨论一下:Java中的抽象类到底为何不能实例化? --------------------编程问答-------------------- 为了安全··· --------------------编程问答-------------------- 不仅JAVA,其他任何语言都一样~这是由语言的设计决定了的,就是纯粹为了继承而存在。 --------------------编程问答-------------------- java里这么规定的,原因我个人认为是抽象类里有未实现的抽象方法,实例化时不能正常分配内存吧,而且调用这个方法时不是要出异常吗 --------------------编程问答-------------------- 支持!! 2楼! --------------------编程问答-------------------- 我们老师是这样说的:
学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化 --------------------编程问答-------------------- 抽象类只在分配了在栈中的引用,没有分配堆中的内存。
个人理解。。。 --------------------编程问答--------------------
引用 5 楼 lianghaijian 的回复:
我们老师是这样说的:
学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化


觉得这个有道理啊,学习了 --------------------编程问答--------------------
引用 5 楼 lianghaijian 的回复:
我们老师是这样说的:
学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化


Java中是允许不含抽象方法的抽象类的,我认为应该是出于安全的考虑,编译器强制规定不允许抽象类产生对象! --------------------编程问答-------------------- 个人认为,是从安全方面考虑的。
假设抽象类可以被实例化,

     public abstract class ParentClass{
             
            public void print(){
                System.out.println("un_abstract method");
            }
            
            public abstract void abstractmethod();
      }


如果ParentClass pc=new ParentClass()可行的话,那么pc.abstractmethod();呢? --------------------编程问答-------------------- 抽象类不能实例化是由Java语法规定的,抽象类是一种设计上的需要,为了描述各种不同的需求Java语言需要支持不同的数据结构。抽象类与接口都不能实例化,继承或实现后就可以实例化了。 --------------------编程问答-------------------- 面向对象思想是对现实社会的模拟(抽象),从哲学上讲进化不完全的物种是不能生存的! --------------------编程问答-------------------- 老师形容因为抽象类是抽象的。。。不是完整的一个类,所以不能被实例化。。。 --------------------编程问答-------------------- 一个抽象的东西 有怎么会有它存在的实际意义~  也就是说你new一个抽象东西 能干嘛~  
  而且这样规定的话 对代码的规范也有了很大的改进!  
    安全方面也确实是一个愿意!  --------------------编程问答-------------------- 待顶~ --------------------编程问答-------------------- 只是语法约定! --------------------编程问答-------------------- 如果你是一个老板,你问一个应聘的人员:你会什么?他给你一个“我不知道”的答案,你会怎么做!!
这个例子视乎能更现实的说明你的这个问题。面向对象语言是从现实中抽象出来的,它该符合正常的逻辑秩序。 --------------------编程问答-------------------- 顶 ~ --------------------编程问答--------------------
引用 16 楼 lingzhi_2006 的回复:
如果你是一个老板,你问一个应聘的人员:你会什么?他给你一个“我不知道”的答案,你会怎么做!!
这个例子视乎能更现实的说明你的这个问题。面向对象语言是从现实中抽象出来的,它该符合正常的逻辑秩序。
 恰当 --------------------编程问答-------------------- mark! --------------------编程问答-------------------- 抽象类里的一些抽象方法必须让子类去实现 或者说抽象类本身不是一个完整的类 这样解释会好些吧
5L大哥似乎从另一个方面解决这个问题呢..

另外 LZ要知道那个抽象方法的含义 介绍他的话实际上就是一个没有实现的方法 但实际运用中这个东西很有趣的 比如抽象类里已经实现了的方法调用了自己的抽象方法?
 抽象类不能实例化不知道从什么地方谈起 但是要是问原因的话那是非常多的 浓缩成俩字的话 那就是 安全 --------------------编程问答-------------------- 因为抽象出来的东西不是一个具体的实物。。。所以不能实例化。 --------------------编程问答-------------------- 都说了是抽象类怎么实例化啊, 我抽象一个人,你在现实中只能找到具有某一或全部抽象特征实例,

不能找到抽象本身~ ,抽象就是“道”,道可道,非常道,是虚无缥缈的!

--------------------编程问答-------------------- abstract  class方式中有自己的abstarct方法,也有非abstarct方法
而在interface方式的实现中,有静态的不能被修改的数据成员(也就是必须是static  final的,不过在接口中一般不定义数据成员),所有的成员方法都是abstract的
--------------------编程问答-------------------- 这是从设计思想层面的东西,为什么要纠结这个问题呢?
说白一点,这就是java的使用规范. --------------------编程问答-------------------- 个人觉得是在给使用者提供一个类的描述框架,为多例提供方便和思路 --------------------编程问答-------------------- 抽象类里有抽象的方法啊 抽象的方法里什么都有没只有一个方法明 实例化没有任何意义 --------------------编程问答-------------------- 一个不完整的对象为什么要被实例化?! --------------------编程问答-------------------- 因为不能实例化,所以才叫抽象类
就是这么设计的。 --------------------编程问答--------------------
引用 11 楼 wmyong863 的回复:
面向对象思想是对现实社会的模拟(抽象),从哲学上讲进化不完全的物种是不能生存的!
 。。 --------------------编程问答--------------------
引用 29 楼 zzqkillyou 的回复:
引用 11 楼 wmyong863 的回复:
面向对象思想是对现实社会的模拟(抽象),从哲学上讲进化不完全的物种是不能生存的!
 。。


。。这个解释很新颖啊。。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 5 楼 lianghaijian 的回复:
我们老师是这样说的:
学过汇编你会知道,程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化
学习了! --------------------编程问答-------------------- 来接分 --------------------编程问答-------------------- 抽象这个词已经很好的说明这一点了,我的理解是:对事物进行抽象通常是基于一定的经验,从众多的经验中总结出规律,浓缩的结果可以在以后多次获利,但是经验并不能真正帮你工作,你还是需要融入实践应用! --------------------编程问答-------------------- --------------------编程问答-------------------- 大家回答这个问题的时候,思考下抽象类的作用。为什么要用到抽象类。 --------------------编程问答-------------------- 语法规定,但是抽象类可以使用子类的构造方法实例化 --------------------编程问答-------------------- 假如可以实例化,调用了abstract方法该如何处理 --------------------编程问答--------------------
引用 2 楼 run_storm 的回复:
不仅JAVA,其他任何语言都一样~这是由语言的设计决定了的,就是纯粹为了继承而存在。

+++
--------------------编程问答-------------------- 做项目的时候用接口的时候多,抽象类了解一下。 --------------------编程问答-------------------- 因为,它是抽象的,虚拟的,不存在的,我们凭空想象出来的,假设的.... --------------------编程问答-------------------- 抽象类:完全是一种假设的东西,怎么可能生成对象呢? --------------------编程问答-------------------- 抽象类,就像是向别人声明:我能赚大钱
实例化就是具体的行动
因为抽象类只是个声明,而没有计划,也不知道怎么赚钱
所以我们是不会投资给钱(内存)他的,就算投资他他也不能做任何事
为了保存大家的利益,没有具休的赚钱计划不能让他执行 --------------------编程问答-------------------- 抽象类根本就没有发育成熟 你认为它可以生孩子吗?你认为3岁的小女孩可以生孩子吗? --------------------编程问答-------------------- 顶个!!!! --------------------编程问答-------------------- 抽象方法在抽象类中也没有方法体,没必要实例化,抽象类是要子类中体现多态性,让子类去做这事就好了 --------------------编程问答-------------------- 本末倒置了
抽不抽象是设计时该考虑的问题,不能问为什么抽象类不能实例化
因为在设计时,考虑到某些类所具备的信息不足以实例化一个对象,才设计成抽象的
所以问题反过来就是答案:
因为这个类不能够被实例化,所以才设计成抽象的,至于为什么这么做,问你的设计师吧,他也许会给出你答案
不过设计师的脾气都不太好,给你一棒子叫你照着做就行了也是有可能的 --------------------编程问答-------------------- 主要是两点,一个是抽象类是一个不完整的类,一个是内存分配问题。
实际上抽象类更多提供的是一个框架的功能,参数比接口更详细些。
你可以通过声明抽象类,实例化继承它的一个子类,这样程序的耦合性更高,方法调用上也更灵活 --------------------编程问答-------------------- 我觉得从两方面来考虑。
其一,哲学角度,抽象基类往往在逻辑上无法实体化,比如说让别人去买水果,不说买什么,就说买水果,显然是买不到一种叫“水果”的东西的。
其二,反面考虑,假如从语法上允许实例化一个抽象类。Java不熟悉,以C++来说吧,那么实现编译器的时候就要面临如何处理virtual void foo()=0;这样的函数符号,这种符号没有函数体,不能为之在代码段分配任何的空间,没有地址,仅仅是个符号,必须要修改编译器才能处理这种特殊的空符号。而且需要扫描所有的代码,禁止调用foo()这个函数,允许实例化一个对象,却不准调用这个对象的某个方法(总不能强制要求所有的纯虚函数必须是private的吧!),这就像一个语法中的黑洞,于情于理都说不过去。 --------------------编程问答-------------------- 抽象类只在分配了在栈中的引用,没有分配堆中的内存。程序都有一个代码段,再内存中需要占据一定的内存,而抽象类没有具体的实现方法,无法具体的给它分配内存空间,所以为了安全,不JAVA不允许抽象类,接口直接实例化 --------------------编程问答-------------------- 因为抽象方法并没有真正的被实现,所以若抽象类可以被实例化的话,说明该对象可以使用抽象类的所有方法,而此时调用抽象方法会发现抽象方法并没有任何作用,从而产生错误。
我认为抽象类不能被实例化是为了避免这种错误的发生
我也是新手 不对的地方可以讨论讨论 --------------------编程问答--------------------   本来过来想说,抽象的原则就是定义了一个模板,具体实现需要类继承类来实现。后来发现,大家都已经说明白了。 --------------------编程问答-------------------- 但为什么抽象类的构造函数能被调用呢~~ --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 因为抽象类有没有实现的方法

如果实例化之后,再来调用这个对象的抽象方法,计算机不知道该执行哪些操作。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,