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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

懒猫丶over

初级黑马

  • 黑马币:27

  • 帖子:6

  • 精华:0

© 懒猫丶over 初级黑马   /  2017-12-4 16:42  /  1031 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

1. 概念理解       
           当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。
但是有的时候,某个父类只是知道子类应该包含怎么样的方法,但是无法准确知道子类如何实现这些方法。比如一个图形类应该有一个求周长的方法,但是不同的图形求周长的算法不一样。那该怎么办呢?
分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。
2. 比较区别
与具体类比较
(1) 抽象类不能直接实例化,并且对抽象类使用 new 运算符会导致编译时错误。虽然一些变量和值在编译时的类型可以是抽象的,但是这样的变量和值必须或者为 null,或者含有对非抽象类的实例的引用(此非抽象类是从抽象类派生的)。
(2) 允许(但不要求)抽象类包含抽象成员。
(3) 抽象类不能被密封。
与接口比较
抽象类表示该类中可能已经有一些方法的具体定义,但是接口就仅仅只能定义各个方法的界面(方法名,参数列表,返回类型),并不关心具体细节。
接口是引用类型的,和抽象类的相似之处有三点:
(1) 不能实例化;
(2) 包含未实现的方法声明;
(3) 派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员)。[2]
抽象类与接口紧密相关。然而接口又比抽象类更抽象,这主要体现在它们的差别上:
(1) 类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承,从抽象类派生的类仍可实现接口,从而得出接口是用来解决多重继承问题的。
(2) 抽象类当中可以存在非抽象的方法,可接口不能,且它里面的方法只是一个声明必须用public来修饰没有具体实现的方法。
(3) 抽象类中的成员变量可以被不同的修饰符来修饰,可接口中的成员变量默认的都是静态常量static final)。
(4) 抽象类是对象的抽象,然而接口是一种行为规范
3. 运用要求
(1) abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
(2) abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。
(3) abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
(4) 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
(5) 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
(6) 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
(7) 接口中的方法默认都是 public,abstract 类型的。
4. 运用实例
//测试类
/*
*        基础班老师,就业班老师
                        共性
                                属性        姓名,年龄,性别
                                行为        讲课
*
*/
public class AbstractTest {
        public static void main(String[] args) {
                //创建的基础班老湿对象
                BasicTeacher bt = new BasicTeacher();
                //为老湿对象的成员变量进行赋值
                bt.setName("风清扬");
                bt.setAge(50);
                bt.setGender("");
                bt.teach();
               
                //创建就业班老湿对象
                JobTeacher jt = new JobTeacher();
                //为老湿对象的成员变量进行赋值
                jt.setName("丁老师");
                jt.setAge(18);
                jt.setGender("");
                jt.teach();
        }
}
//老师类
public abstract class Teacher {
        private String name;//姓名
        private int age;//年龄
        private String gender;//性别
       
        public Teacher() {
                super();
                // TODO Auto-generated constructor stub
        }
        public Teacher(String name, int age, String gender) {
                super();
                this.name = name;
                this.age = age;
                this.gender = gender;
        }
        public String getName() {
                return name;
        }
        public void setName(String name) {
                this.name = name;
        }
        public int getAge() {
                return age;
        }
        public void setAge(int age) {
                this.age = age;
        }
        public String getGender() {
                return gender;
        }
        public void setGender(String gender) {
                this.gender = gender;
        }
       
        public abstract void teach();
}
//基础班老师类
public class BasicTeacher extends Teacher {
        @Override
        public void teach() {
                System.out.println(getName() + "讲基础班课程");
        }
}
//就业班老师类
public class JobTeacher extends Teacher{
        @Override
        public void teach() {
                System.out.println(getName() + "讲就业班课程");
        }
}
5. 图解


2 个回复

倒序浏览
回复 使用道具 举报
我来占层楼啊  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马