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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李桐 高级黑马   /  2012-12-6 14:11  /  1712 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李桐 于 2012-12-7 23:17 编辑

想问下大家有关java的抽象,,因为在实践过程中并没有用到java的抽象类或者抽象方法,所以也不太清楚这块,抽象在java中有什么样的作用呢?抽象类,抽象方法,与接口的区别?抽象在实际中怎么用?望大家详解,,,

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

6 个回复

倒序浏览
1.抽象类中要有抽象方法,也可以有普通的方法,属性可以是常量也可以是变量;而接口中只能有抽象方法,其属性都是常量,且不能包含构造器和初始化块定义;
2.抽象类不能被实例化,且其构造器不能用于创建实例,而是用于被子类调用;
3.抽象类和接口都要被其他的类来继承,不同的是:由于java是单继承,一个类只能继承一个抽象方法,但是一个类却可以实现多个接口;这样给人的感觉就好像java是多继承样的;
4.在实际中,抽象类用的还是相对比较少的,一般都是用接口,因为用接口可以更加的灵活。抽象类在实际中的用法和接口没什么很大的区别,可以说接口是抽象的抽象。

点评

接口是用来实现的 ,接口可以说是抽象类的特殊表现形式而已 。  发表于 2012-12-7 23:27

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
1.当一个类和另一个类有着共性,可以把共性抽象出来。比如猫和狗都是动物,都要吃东西。就可以定义一个abstract Animal 类,然后定义一个抽象方法abstract void eat(),当子类继承annimal抽象类时,就必须要实现这个void eat()方法。具体实现可以根据这个子类的特征,如猫吃鱼,狗啃骨头。
2、抽象类不能被实例化,如不能这样Animal a = new Animal();当一个类中有抽象方法,这个类一定是个抽象类。抽象方法没有方法主体,如abstract void eat();
3、接口中的常量默认都有public static final,方法默认都有public abstract。接口主要用于一个类的功能扩展。
4、接口的好处就是一个类可以继承多个接口实现多个功能扩展。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
第4句打错了,是一个类可以实现多个接口{:soso_e127:}
回复 使用道具 举报
1.关于抽象类:
举例来说,现在有一个Employ类和Student类都继承了Person类,雇员类和学生类都有姓名这个属性,我们可以把getName方法放置于位于继承关系较高层次的通用超类Person中,

现在,再增加一个getDescription方法,它可以返回对一个人的简单描述,例如:
一个雇员年薪10万元
一个学生的专业是计算机科学与技术
在Employee和Student类中实现这个方法非常容易,但是在Person类中应该提供什么内容呢?除了姓名之外,Person类一无所知,当然,可以让Persong.getDescription()返回一个空字符串,然而还有一个更好的方法,就是使用abstract关键字,这样就完全不需要实现这个方法了:
public abstract String getDescription();//不需要实现方法
这里,为了提高程序的清晰性,包含一个或者多个抽象方法的类本身必须被声明为抽象的。
abstract class Person
{
    public abstract String getDescription();

}

除了抽象方法之外,抽象类还可以包含具体数据和具体方法,例如,Person类还保存着姓名和一个返回姓名的具体方法:
abstract class Person
{
    private String name;

    public Person(Stirng n)

    {
        name=n;

    }

    public String getName()

    {
        return name;

    }

    public abstract String getDescription();

}

2.抽象类在实际中的运用:
实际中用到最多的是在抽象类中定义全部的抽象方法,这样一来,子类中就不是抽象的了。下面这段代码句式通过抽象类Person扩展一个具体的子类Student
class Studeng extends Person
{
    private Stirng major;

    public Studeng(Stirng n,String m)

    {
        super(n);

        major=m;

    }

    public String getDescription()

    {
        return "学生的专业是"+major;

    }

}
3.抽象类与接口的区别:
一个类可以只能继承一个抽象方法,但是一个类却可以实现多个接口,接口解决了Java单继承性的缺陷;
抽象类中可以有抽象的方法和普通的方法,属性可是是常量也可能是变量,而接口中只能有抽象方法,其属性都是常量;
抽象类和接口都不能被实例化;
在实际运用中,大多用的是接口,接口更加灵活,接口是抽象的抽象。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
1、抽象类可以不包括抽象方法,它反正不会去实例化,里面的方法是不是抽象的没有本质影响。
2、但是含有抽象方法的类绝不能被实例化,否则执行这个方法的时候,怎么办?
3、如果子类是非抽象的,那么它就必须实现父类中的抽象方法;否则,它继承来的抽象方法仍然没有方法体,也是个抽象方法,此时就与“含有抽象方法的类必须是抽象类”相矛盾了。


java中抽象类和接口的区别
一、从语法定义层面看
  在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。
二、从编程层面看
  abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
三、从设计理念层面看
  abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。 对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约(功能)而已。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1

查看全部评分

回复 使用道具 举报
李桐 高级黑马 2012-12-7 23:16:51
7#
大体了解了,已收藏~~{:soso_e179:}大家都很强
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马