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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 全海波 中级黑马   /  2012-7-9 22:07  /  1486 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 全海波 于 2012-8-4 09:48 编辑

abstract 与interface的区别是?

点评

这个问题不仅在视频中讲过,而且论坛上出现过很多次哦,楼主可以去看一下。  发表于 2012-7-10 14:22

6 个回复

倒序浏览
你找个共同点来看看?
回复 使用道具 举报
楼主要问的是 abstract class 与 interface 的区别吧?
两者的定义:
含有abstract修饰符的class即为抽象类,abstract 类不能创建的实例对象。含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。abstract class类中定义抽象方法必须在具体子类中实现,所以,不能有抽象构造方法或抽象静态方法。如果子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为abstract类型。
接口(interface)可以说成是抽象类的一种特例,接口中的所有方法都必须是抽象的。接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final。
下面比较一下两者的区别:
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽象的普通方法。
4. 抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static final类型,并且默认即为public static final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
楼主可以搜一下,前辈们讨论过N次了
回复 使用道具 举报
楼主意图刷分啊?这是很危险的行为哦
回复 使用道具 举报
abstract class 和interface
区别:
相同点:都包含抽象方法,只需声明无须实现
目的:为目标类提供一些列的标准和引用(自己理解)
不同点:
1、方法差异
抽象类中可以有非抽象方法,接口中的所有的方法均为抽象方法
2、变量差异
变量的访问修饰符:抽象类中的变量的访问修饰符可以私有化
                  接口中的变量的:静态全局变量,抽象方法均为public

      
回复 使用道具 举报
在区别方面,万宝东已经基本说到位了,那么我就从抽象类和接口在实际应用中的一些不同来回答楼主的问题,希望能让楼主有更深刻的认识:
抽象类的一个最主要的作用在于强迫子类做某些事情:
需求:要求写一个程序,计算一段代码运行的时间,但是代码的具体内容是不确定的,我们就可以通过抽象类来实现以上需求,例如:

abstract class GetTime
{
        public final void gettime()  //final可以防止gettime()被子类复写,增强了代码的安全性
        {
                long start = System.currentTimeMillis();

                runcode();     

                long end = System.currentTimeMillis();
                System.out.println("毫秒:"+(end-start));
        }

        public abstract void runcode(); /*此处通过将runcode()定义为abstract类型,可以强迫子类复写,从而完善runcode()的功能*/
}

class SubTime extends GetTime
{
        public void runcode()  //子类必须复写runcode()功能才可以创建对象
        {
                for (int x=0; x<4000; x++)
                {
                        System.out.print(x);
                }
        }
}

class TemplateDemo
{
        public static void main(String[] args)
        {
                SubTime st = new SubTime();
                st.gettime();
        }
}
/*以上这段代码的思想是,通过abstract关键字,把父类中无法确定功能主体的代码暴露出去,强迫子类来完善代码的功能主体。*/

interface(接口)的主要作用:
因为java支持类对接口的多实现,所以接口可以很好的支持java的功能扩展,降低代码之间的耦合性。
需求:张三和李四都是学生,张三抽烟喝酒学习java,李四既不抽烟也不喝酒学习C++。

interface smoke
{
        public abstract void smoking();
}

interface drink
{
        public abstract void drinking();
}

abstract class student
{
        private String name;
        private int age;
        public abstract void study();
}

class zhangsan extends student implements smoke,drink /*1.继承了父类的学习方法并完善为学习java(抽象类的作用,不明确的功能交给子类完善),2.实现了抽烟和喝酒的方法(接口的作用给张三这个学生扩展两个功能,抽烟和喝酒,由于并不是学生类应该具备的功能,所以既可以选择实现,也可以选择不实现,大大扩展了程序的功能)*/
{
        public void smoking()
        {
                System.out.println("zhangsan smoke");
        }
        public void drinking()
        {
                System.out.println("zhangsan drink");
        }
        public void study()
        {
                System.out.println("zhangsan study java");
        }
}

class lisi extends student  /*只继承学生的标准方法学习,并完善功能主体,不选择继承特有的方法抽烟和喝酒*/
{
        public void study()
        {
                System.out.println("lisi study C++");
        }       
}

class interfaceTest  
{
        public static void main(String[] args)
        {
                zhangsan p1 = new zhangsan();
                lisi p2 = new lisi();

                p1.smoking();
                p1.drinking();
                p1.study();

                p2.study();
        }
}

点评

好  发表于 2012-7-10 00:13

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 例子不错!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马