A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨华东 中级黑马   /  2012-10-5 15:13  /  2152 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. interface Demo1
  2. {
  3. void function1();
  4. }

  5. abstract class Demo2
  6. {
  7. abstract void funtion2();
  8. }


  9. public class Test5 {
  10. /*
  11. * 想问大家一个问题,希望大家超越自己。
  12. * */
  13. public static void main(String[] args)
  14. {
  15. /*
  16. * 在主函数里无法直接创建接口和抽象类对象的原因,我有三个疑问:
  17. * 1,接口和抽象类没有构造函数?
  18. * 2,接口和抽象类的构造函数被私有化了?
  19. * 3,两者被JVM制动识别了,是一种底层规则吗?
  20. *
  21. * 求详解。。。。。。。
  22. */
  23. }
  24. }
复制代码

7 个回复

倒序浏览
接口和抽象类因为里面的方法都是抽象的所以是不能被实例化的,原因很简单,

抽象的方法没有具体的方法实体,所以实例化是没有意义的,但抽象方法和接口是有区别的:

抽象类和接口之间的区别:★★★★
共性:
它们都是不断抽取出来的抽象非概念
区别:
1、抽象类只能被单继承、接口可以被多实现,避免了单继承的局限性。
2、抽象类中可以定义抽象方法,和非抽象方法,它可以用于定义体系的基本共性的内容。接口
中只能定义抽象方法,它主要用于对象的功能的扩展。
3、抽象类是继承关系,是is a关系,接口是实现关系是like a关系。
4、抽象类中的成员修饰符都是自定义的,接口中的修饰符都是固定的。

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
1.抽象类中还有非抽象方法,所以抽象类有默认的构造函数,而且如果父类中是带参数的构造函数,子类就必须写一个构造函数来调用父类的构造函数
abstract class Person {   //定义一个抽象类,必须被继承
    Person(int i) {  }
}
  public class Student extends Person {
     Student() {
         super(int i)://必须显示的调用父类构造方法//super代表父类对象
     }
}
而接口仅仅是一种规范,不是用来实例化的,而且最主要是接口中的方法都是抽象的,如果有构造函数也是抽象的,而且构造函数不能被复写,那么这个构造函数存在有什么意义?
2.如第一题的解答,抽象类的构造函数并没有被私有。
3.只有接口才是一种规则,抽象类它仍然还是一种类。
回复 使用道具 举报
        抽象类和抽象方法都要用abstract进行修饰
        抽象类不能被实例化
        抽象类中不一定有抽象方法,但是,有抽象方法的类一定是抽象类。
        抽象类的使用。通过子类对象来使用方法。
        抽象类有构造方法。
        抽象类中的构造方法供子类实例化调用。


        接口是对外暴露的规则
        是程序的扩展功能

        接口和抽象类的区别
        抽象类只能被单继承
        接口可以多实现
        接口的出现避免了多继承的局限性。
        抽象类中的数据特点:
        成员变量:可以是变量,也可以是常量
        成员方法:可以是抽象方法,也可以是非抽象方法
        构造方法:有构造方法
        接口中的数据特点:
        成员变量:是常量。都有默认修饰 public static final
        成员方法:都是抽象方法。都有默认修饰 public abstract
        抽象类中定义的是体系中的共性功能。
        接口中定义的是体系中的扩展功能。

接口是没有构造方法的,接口的可以多实现,如果有构造方法给子类使用,很显然不合理

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 孙含庆 于 2012-10-5 16:45 编辑

/**          接口不可以有构造函数,因为他不能被继承。用于扩展功能用得,实现他的类必须实现他得全部方法,因为他的方法都是抽象的。

*          抽象类可以有构造函数,据说抽象类的子类就是调用抽象类的构造方法来创建自己的对象的。

* 他可以有抽象的和非抽象的方法,抽象的方法没有方法体,非抽象的方法有方法体。继承他的类,

* 必须实现他所有的抽象方法,不然这个类就也是抽象的。

* 接口和抽象的定义规则都是死的,必须这么写,JVM 才可以识别,不给你报一大堆错误,是底层规则。
*/
                     初期学习阶段,没有必要非去研究java 底层原理什么的,先按着规则来学习,不要去钻牛角尖,会学得很费劲。
                      等全部学完,会使用了,也就慢慢都懂了。


interface Demo1
{
        //Demo1(){};   接口不可以有构造方法,可以理解成是很特殊的抽象类。 他不能被继承,所以没有构造方法。
        public static final int PI = 3; //接口中的定义是死的,固定修饰符,变量必须是静态常量。
        public abstract void function1(); // 法必须是抽象,就是不写修饰符,java虚拟机也会给你补上}

abstract class Demo2
{
        Demo2(){}; //抽象类有自己的构造函数,但是不可以new 创建对象,因为调用抽象方法无意义。
        abstract void function2(); //类中有抽象的方法,类也必须是抽象的。

        public String print(){   //抽象类可以有非抽象的,有实现体的方法。               

           return "hello java";
        }
}

public class Test5 extends Demo2 implements Demo1 {

        public static void main(String[] args)
        {
               
        }        
        public void function1(){
                //接口被实现,子类必须实现接口的所有方法。        }
        public void function2(){
                //抽象类被继承,子类必须复写其中的所有抽象方法        }
}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
问题已解决
回复 使用道具 举报
孙含庆 发表于 2012-10-5 16:40
/**          接口不可以有构造函数,因为他不能被继承。用于扩展功能用得,实现他的类必须实现他得全部方 ...

一个小问题 。 你说 抽象方法有构造函数,但是不可以new对象。你的理由是:调用抽象的函数无意义。
但是我不一定非要调用抽象的函数,哥们可以调用非抽象的函数啊?????这时候还有意义吗??
有点牛角尖了 嘿嘿嘿  求解释。。。。。
回复 使用道具 举报
4、接口和抽象类的区别--------都是不断向上抽取出来的
        A:抽象类只能单继承,接口可以多实现。
        B:抽象类中可以由非抽象方法。抽象类中可以定义变量和常量。接口中的方法都是抽象的。接口中只能有静态常量。因为接口中的方法都有默认修饰符:public abstract;接口中的成员变量都有默认修饰符:public static final
        C:抽象类中定义的是一个体系的共性功能。接口中通常定义的对象中的扩展功能。
        D:接口的出现避免了单继承的局限性。
        E:抽象类被继承表示的是:is a 的关系。叫做:xx是yy的一种。 接口被实现表示的是:like a 的关系。叫做:xx像yy一种。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马