java基础第9天


抽象类概述


抽象类的由来
  思考:一个公司中可能存在经理、程序员、销售员等等,但有没有员工呢?我说的不是员工的子类,而只是员工!我想你找不到吧!我也找不到这样的东西!员工太抽象了,我们不需要它的实例,而只是需要它子类的实例。
  思考:虽然不需要员工的实例,但是否需要员工的引用呢?我们需要使用员工类的引用来指向它子类的实例。例如我们需要把所有员工子类的实例对象放到一个数组中,然后去调用每个员工子类对象的get月薪方法()。
  我们需要在员工类中定义get月薪方法(),但不知道怎么去实现它。因为不同的员工有不同的计算月薪的方式。所以这个方法只有具体的子类知道怎么去实现。但员工必须要有这个方法的定义,因为没有这个方法的定义,就不能使用员工类的引用来调用子类的这个方法了(多态)。
  总结:
需要员工类的引用,但不需要员工类的实例对象;
员工类需要有get月薪方法(),但只需要定义不需要实现内容;
员工类用来作为派生子类而用,子类需要重写员工类的get月薪方法()


为了让使用者小心使用,我们需要在员工类中添加注释如下:
不要创建本类的实例对象,本类是用来派生子类的模板;
可以创建本类的引用,但需要指向本类子类的实例对象;
本类的get月薪()方法只给出定义,但没有给出实现内容;
子类需要去重写get月薪()方法;
在员工类中定义get月薪方法的目的是为了使用员工类的引用时可以调用这个方法完成多态调用。


但使用者不听话怎么办!!!


2抽象类(abstract)
定义:具有一个或多个抽象方法的类必须声明为抽象类。
(1)只抽取了很多类的方法的声明,为了保证不出问题,方法声明用abstract修饰。
(2)抽象类的特点
A:一个类如果有了抽象方法,那么这个类必须是抽象类。抽象类里边可以没有抽象方法。
   B:抽象类是不能够被实例化的。不能够创建对象的。但可以创建抽象类的引用。可以使用抽象类的引用来指向其子类的实例对象。抽象类就是用来派生子类的。


C:如果一个类继承抽象类,那么,它要么实现抽象类中的所有抽象方法,
  要么本身也是抽象类。
(3)抽象类的成员特点:
A:成员变量:子类可以直接继承抽象类中的成员变量。(抽象类中的成员变量可以和以前是一样的)
            B:成员方法:抽象类中分为两种方法,一种是抽象方法,


           抽象方法只给定方法的声明部分,但没有方法体。
   抽象方法需要使用abstract关键字来修饰。public abstract void fun();
        抽象方法没有方法体,以一个分号来代替方法体内容。
            抽象方法只给出了“做什么”,而没给出“怎么做”。
                      抽象方法是没有完成的方法,需要在子类中完成“怎么做”。


            一种是普通的方法。可以被子类直接继承使用。
C:构造方法:抽象类不能被实例化,那么它有构造方法吗?抽象类是class,那么它就有构造方法。
    它的构造方法有用吗?有,为了让子类实例化的时候使用。
(4)举例:教师举例,学生举例,员工举例
(5)抽象类的相关问题:
A:抽象类中是否有构造函数?参照(3)里面的C。
B:抽象关键字abstract不可以和哪些关键字共存?
**private
***私有的,外部直接无法访问。
**static
***那么这个时候抽象方法就可以可以通过类名调用,但是这样是没有意义的。
**final
***final修饰的方法不能被重写。所以它和abstract冲突。
C:抽象类中可不可以没有抽象方法?
**可以。防止其他类创建该类对象。
3抽象类与非抽象类的比较


  抽象类可以有构造器、属性、非抽象方法、静态方法,就是正常的类可以有什么它就可以有什么,而且抽象类还可以有抽象方法。
抽象类唯一不能有的就是一样东西:实例对象


接口(interface)


(1)接口的由来:当一个类中的方法都是抽象的时候,你没必要定义为抽象类,
              定义为接口就可以了。
(2)解决了java中只能单继承的问题。(对多继承进行了优化)
A:类与类:只能是单继承。
B:接口与接口:可以是单继承,也可以是多继承。
C:类与接口:可以是单实现,也可以是多实现。
(3)成员特点:
A:只有成员变量和成员方法。
B:成员变量 默认修饰符 public static final
**int x = 20;
**其实是这样的 public static final int x = 20;
C:成员方法 默认修饰符 public abstract
**void show();
**其实是这样的 public abstract void show();
建议:自己手动加上修饰符。
(4)接口特点:
A:接口是对外暴露的规则
B:接口是功能的扩展
C:接口降低了程序的耦合性。
**内聚(自己实现功能的能力) 
**高内聚,低耦合。
举例:主板和CPU,USB接口,电源插座。
D:扩展说了下接口的理解
**狭义的理解就是java中的接口。
**广义的理解就是:任何定义的规范都是接口。
(5)接口和抽象类的区别:
A:抽象类只能被单继承;接口可以被多实现。
B:抽象类中的成员:成员变量:可以是常量,也可以是变量。
  成员方法:可以是抽象的,也可以是非抽象的。
  构造方法:虽然不可以创建对象,但是可以给子类实例化用。
  接口中的成员:成员变量:只能是常量。默认修饰符 public static final
成员方法:只能是抽象的。默认修饰符 public abstract
C:抽象类中定义的是体系结构中的共性的内容。
  接口中定义的是对象的扩展功能。
D:抽象类被继承表示的是:"is a"的关系。xx是yy中的一种。
  接口被实现表示的是: "like a"的关系。xx像yy中的一种。
(6)接口的练习1 学生(Student)、老师(Teacher)和烟民(Smoker)2 PCI设置、  网卡、声卡3 形状(shape)、矩形(Rectangle)、圆(Circle)
学生:Student


A:属性:学号,姓名,年龄 
B:方法:学习(study),吃饭(抽象eat),抽烟或者不抽烟?(合适吗)


发现:在学生中定义抽烟的方法不合适。所以呢,我们另外用一个类来定义抽烟的方法。
     但是发现,如果用一个类描述抽烟的功能后,SmokeStudent是不能继承多个类的。
     这个时候,我们又得重写思考了。发现,抽烟的学生像一个抽烟的机器,所以,
     我们定义一个接口来放抽烟这个功能。
        interface Smoking
{
public abstract void smoking();
}

  描述的是抽烟的学生:SmokeStudent extends Student implements Smoking


SmokeStudent ss = new SmokeStudent();
ss.eat();
ss.study();
ss.smoking();

 老师:Teacher
A:属性 教师编号,姓名,年龄
B:方法 教书(teach),吃饭(吃饭eat),抽烟或者不抽烟?(合适吗)


发现:在老师中定义抽烟的方法不合适。所以呢,我们另外用一个类来定义抽烟的方法。
     但是发现,如果用一个类描述抽烟的功能后,SmokeTeacher是不能继承多个类的。
     这个时候,我们又得重写思考了。发现,抽烟的老师像一个抽烟的机器,所以,
     我们定义一个接口来放抽烟这个功能。
        interface Smoking
{
public abstract void smoking();
}

 描述的是抽烟的老师:SmokeTeacher extends Teacher implements Smoking
SmokeTeacher st = new SmokeTeacher();
st.eat();
st.teach();
st.smoking();


 最后,我们发现,这个代码还是存在着重复,比如说学生类和教师类中的属性姓名,年龄及方法吃饭。
 所以,我们进一步向上抽取。来了一个Person类
 Person:属性:姓名,年龄
         行为:吃饭(抽象eat)



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值