3、黑马程序员——抽象类、接口

来源:互联网 发布:8月编程语言排行榜 编辑:程序博客网 时间:2024/06/13 12:03

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


3.1 抽象类概述

抽象定义:
抽象就是从多个事物中将共性的、本质的内容抽取出来。
例如:狼和狗共性都是犬科,犬科就是抽象出来的概念。

抽象类:
Java中可以定义没有方法体的方法,该方法的具体实现由子类完成,该方法称为抽象方法,包含抽象方法的 类就是抽象类。

抽象方法的由来:
多个对象都具备相同的功能,但是功能具体内容有所不同,那么在抽取过程中,只抽取了功能定义,并未抽 取功能主体,那么只有功能声明,没有功能主体的方法称为抽法。
例如:狼和狗都有吼叫的方法,可是吼叫内容是不一样的。所以抽象出来的犬科虽然有吼叫功能,但是并不 明确吼叫的细节。


3.2 抽象类的特点

抽象类和抽象方法必须用abstract关键字来修饰。
抽象方法只有方法声明,没有方法体,定义在抽象类中。
格式:修饰符abstract返回值类型函数名(参数列表);
抽象类不可以被实例化,也就是不可以用new创建对象。

原因如下:
1.抽象类是具体事物抽取出来的,本身是不具体的,没有对应的实例。例如:犬科是一个抽象的概念,真正 存在的是狼和狗。
2.而且抽象类即使创建了对象,调用抽象方法也没有意义。
3.抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也 是抽象类。

示例:
package day3;abstract class Demo{abstract void show();}class DemoA extends Demo{void show(){System.out.println("demoa show");}}class DemoB extends Demo{void show(){System.out.println("demob show");}}public class AbstractDemo {public static void main(String[] args) {DemoA demoA = new DemoA();demoA.show();DemoB demoB = new DemoB();demoB.show();}}

抽象类中是否有构造函数?
答:有,用于给子类对象进行初始化。


抽象关键字abstract不可以和哪些关键字共存?
答:private、static、final。

抽象类中可不可以没有抽象方法?
答:可以,但是很少见。目的就是不让该类创建对象,AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是却没有内容。

抽象类和一般类的区别?

答:
相同点:
抽象类和一般类都是用来描述事物的,都在内部定义了成员。
不同点:
1.一般类有足够的信息描述事物。
   抽象类描述事物的信息有可能不足。
2.一般类中不能定义抽象方法,只能定义非抽象方法。
  抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3.一般类可以被实例化。
  抽象类不可以被实例化。

抽象类一定是个父类吗?
答:是的,因为需要子类覆盖其方法后才可以对子类实例化。

3.3 抽象类举例代码讲解

需求:
公司中程序员有姓名,工号,薪水,工作内容。
项目经理除了有姓名,工号,薪水,还有奖金,工作内容。
分析:
在这个问题领域中,通过名词提炼法:
程序员:
            属性:姓名,工号,薪水。
            行为:工作。
经理:
           属性:姓名,工号,薪水,奖金。
           行为:工作。

程序员和经理不存在着直接继承关系。
但是,程序员和经理却具有共性内容,可以进行抽取,因为他们都是公司的雇员。
可以将程序员和经理进行抽取,建立体系。

代码:
package day3;/* * 需求: *    公司中程序员有姓名,工号,薪水,工作内容。 *    项目经理除了有姓名,工号,薪水,还有奖金,工作内容。 * 分析: *     在这个问题领域中,通过名词提炼法: *  程序员: *    属性:姓名,工号,薪水。 *    行为:工作。 *  经理: *    属性:姓名,工号,薪水,奖金。 *    行为:工作。 */ //描述雇员abstract class Employee{private String name;private String id;private double pay;Employee(String name,String id,double pay){this.name = name;this.id = id;this.pay = pay;}public abstract void work();} //描述程序员class Programmer extends Employee{Programmer(String name, String id, double pay){super(name,id,pay);}@Override//覆盖抽象类的抽象方法public void work() {System.out.println("code...");}}  //描述经理class Manager extends Employee{private int bonus;Manager(String name,String id,double pay,int bonus){super(name,id,pay);this.bonus = bonus;}@Override//覆盖抽象类的抽象方法public void work() {System.out.println("manager");}}


3.4 接口

当一个抽象类中的方法都是抽象的时候,这时可以将该抽象类用另一种形式定义和表示,就是接口。
格式:interface{}
接口中的成员修饰符是固定的:
成员常量:publicstaticfinal
成员函数:publicabstract
由此得出结论,接口中的成员都是公共的权限。


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

注:
1、虽然抽象类中的全局变量和抽象方法的修饰符都可以不用写,但是这样阅读性很差。所以,最好写上。
2、类与类之间是继承关系,类与接口直接是实现关系。
3、接口不可以实例化,能由实现了接口并覆盖了接口中所有的抽象方法的子类实例化。否则,这个子类就是 一个抽象类。

示例:

package day3;interface Demo1{public static final int NUM = 4;public abstract void show1();public abstract void show2();}class DemoImp1 implements Demo1{public void show1(){}public void show2(){}}public class InterfaceDemo {public static void main(String[] args) {DemoImp1 d = new DemoImp1();System.out.println(d.NUM);System.out.println(DemoImp1.NUM);System.out.println(Demo1.NUM);}}

接口的出现将“多继承”通过另一种形式体现出来,即“多实现”。
在java中不直接支持多继承,因为会出现调用的不确定性。
所以,java将多继承机制进行改良,在java中变成了多实现,一个类可以实现多个接口。
接口的出现避免了单继承的局限性。
一个类在继承另一个类的同时,还可以实现多个接口。


示例:

package day3;//java将多继承机制进行改良,在java中变成了多实现,一个类可以实现多个接口。interface A{public void show();}interface B{public void show();}//多实现class Test implements A,B{@Overridepublic void show() {System.out.println("Test");}}public class InterfaceDemo2 {public static void main(String[] args) {Test t = new Test();t.show();}}class Q{public void method(){}}//一个类在继承另一个类的同时,还可以实现多个接口。class Test2 extends Q implements A,B{@Overridepublic void show() {}}interface CC{void show();}interface MM{void method();}//接口与接口之间是继承关系,而且接口可以多继承interface QQ extends CC,MM{void function();}class WW implements QQ{//覆盖3个方法@Overridepublic void show() {}@Overridepublic void method() {}@Overridepublic void function() {}}

抽象类和接口的异同点?
相同点:
             都是不断向上抽取而来的。
不同点:
            1.抽象类需要被继承,而且只能单继承。
               接口需要被实现,而且可以多实现。
           2.抽象类中可以定义抽象方法和非抽象方法,子类继承后,可以直接使用非抽象方法。
              接口中只能定义抽象方法,必须由子类去实现。
           3.抽象类的继承,是is a关系,定义该体系的基本共性内容。
              接口的实现是like a关系。

接口应用综合案例

代码:
package day3;/* * 笔记本电脑功能扩展案例 * 为了扩展笔记本的功能,但日后出现什么功能设备不知道。 * 因此需要定义一个规则,只要日后出现的设备都符合这个规则就可以了。 * 规则在JAVA中就是接口 */interface USB{//暴露的规则public void open();public void close();}//实现规则//这些设备和电脑的耦合性降低了class UPan implements USB{public void open(){System.out.println("UPan open");}public void close(){System.out.println("UPan close");}}public class BookPC {public static void main(String[] args) {// 功能扩展了useUSB(new UPan());}//使用规则public static void useUSB(USB u){//接口类型的引用,用于接收接口的子类对象if(u != null){u.open();u.close();}}}



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

0 0