zoukankan      html  css  js  c++  java
  • Java——面向对象进阶(抽象类,接口)

    一、抽象类

    抽象类:说不清楚的类

    抽象方法:说不清楚的方法

    方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。

    1、定义抽象类:

    当定义了抽象函数的类也必须被abstract关键字修饰,被abstract关键字修饰的类是抽象类。

    /*
     *    抽象类,不能实例化对象, 不能new的
     *    不能创建对象的原因:  如果真的让你new了, 对象.调用抽象方法,抽象方法没有主体,根本就不能运行
     *    继承他的子类必须要重写定义的抽象方法
     */
    
    public abstract class Develop {     //抽象类
        public abstract void work();    //抽象方法
    }
    

    2、特点:

    1、抽象类和抽象方法都需要被abstract修饰。抽象方法一定要定义在抽象类中。

    2、抽象类不可以直接创建对象,原因:调用抽象方法没有意义。

    3、只有覆盖了抽象类中所有的抽象方法后,其子类才可以创建对象。否则该子类还是一个抽象类。

    之所以继承抽象类,更多的是在思想,是面对共性类型操作会更简单。

    3、疑问:

    1、抽象类一定是个父类?

      是的,因为不断抽取而来的。

    2、抽象类中是否可以没有抽象方法?如果可以,那么,该类还定义成抽象类有意义吗?为什么?

      可以没有抽象方法,有意义,不会让其他人直接创建该类对象

    3、抽象关键字abstract不可以和哪些关键字共存?

    • 1private:私有的方法子类是无法继承到的,也不存在覆盖,而abstractprivate一起使用修饰方法,abstract既要子类去实现这个方法,而private修饰子类根本无法得到父类这个方法。互相矛盾。
    • 2final:最终,固定住变量的的值。
    • 3static:静态方法,可以直接用类名.方法名调用。

    二、接口 

    接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的

    接口只描述所应该具备的方法,并没有具体实现,具体的实现由接口的实现类(相当于接口的子类)来完成。这样将功能的定义与实现分离,优化了程序设计

    1、定义接口

     与定义类的class不同,接口定义时需要使用interface关键字。

    定义接口所在的仍为.java文件,虽然声明时使用的为interface关键字的编译后仍然会产生.class文件。这点可以让我们将接口看做是一种只包含了功能声明的特殊类。

    public interface 接口名{

      抽象方法1;  //只能定义抽象方法和定义常量

      抽象方法2;

      抽象方法3;

    }

    定义抽象方法的格式:public abstract 返回值类型  方法名字(参数列表);

    • 修饰符必须是public(可以不写)

    定义常量:public static final 数据类型 变量名 = 值

    • 前三个字段为固定格式(可以不写)
    • public 权限
    • static 可以被类名直接.调用
    • final 最终,固定住变量的值

    2、实现接口

    接口的实现,相当于类的继承

    class 类名 implements 接口{

      重写接口中方法  // 必须重写

    3、接口的特点

    1、接口中可以定义变量,但是变量必须有固定的修饰符修饰,public static final 所以接口中的变量也称之为常量,其值不能改变。后面我们会讲解staticfinal关键字

    2、接口中可以定义方法,方法也有固定的修饰符,public abstract

    3、接口不可以创建对象。

    4、子类必须覆盖掉接口中所有的抽象方法后,子类才可以实例化。否则子类是一个抽象类。

    public static final interface Demo {     //定义一个名称为Demo的接口。
    	public static final int NUM = 3;    // NUM的值不能改变
    	public abstract void show1();
    	public abstract void show2();
    }
    
    //定义子类去覆盖接口中的方法。类与接口之间的关系是 实现。通过 关键字 implements
    class DemoImpl implements Demo {     //子类实现Demo接口。
    	//重写接口中的方法。
    	public void show1(){}
    	public void show2(){}
    }
    

    4、接口的多实现

    interface Fu1
    {
    	void show1();
    }
    interface Fu2
    {
    	void show2();
    }
    class Zi implements Fu1,Fu2  // 使用,同时实现多个接口。
    {
    	public void show1(){}
    	public void show2(){}
    }
    

    多继承的弊端:多继承时,当多个父类中有相同功能时,子类调用会产生不确定性。其实核心原因就是在于多继承父类中功能有主体,而导致调用运行时,不确定运行哪个主体内容。

    多实现没有这种弊端,因为接口中的功能都没有方法体,由子类来明确。

    5、继承类+实现接口

    //定义父类
    class Fu {
    	public void show(){}
    }
    
    //定义接口
    interface Inter {
    	pulbic abstract void show1();
    }
    
    //继承父类+实现接口
    class Zi extends Fu implements Inter {
    	public void show1() {
    	}
    }
    

     接口的出现避免了单继承的局限性。父类中定义的事物的基本功能。接口中定义的事物的扩展功能。

    6、接口的多继承

    不仅类可以继承,接口也可以,只不过接口支持多继承。

    interface Fu1{
    	void show();
    }
    interface Fu2{
    	void show1();
    }
    interface Fu3{
    	void show2();
    }
    interface Zi extends Fu1,Fu2,Fu3{
    	void show3();
    }
    

     在开发中如果多个接口中存在相同方法,这时若有个类实现了这些接口,那么就要实现接口中的方法,由于接口中的方法是抽象方法,子类实现后也不会发生调用的不确定性。

    总结:接口在开发中的它好处

    • 接口的出现扩展了功能。

    • 接口其实就是暴漏出来的规则。

    • 接口的出现降低了耦合性,即设备与设备之间实现了解耦。

    7、接口和抽象的相同点和区别

    相同点:

    • 都位于继承的顶端,用于被其他类实现或继承;

    • 都不能直接实例化对象;

    • 都包含抽象方法,其子类都必须覆写这些抽象方法;

    区别:

    • 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;接口只能包含抽象方法;

    • 一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)

    • 抽象类是这个事物中应该具备的你内容, 继承体系是一种 is..a关系

    • 接口是这个事物中的额外内容,继承体系是一种 like..a关系

    继承类+实现接口 ==> 他是一个人(类),但是他像一个小偷(接口)

    二者的选用:

    • 优先选用接口,尽量少用抽象类;

    • 需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

  • 相关阅读:
    关于lockkeyword
    关于多层for循环迭代的效率优化问题
    Android 面试精华题目总结
    Linux基础回想(1)——Linux系统概述
    linux源代码编译安装OpenCV
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem C. Sometimes Naive (状压dp)
    校赛热身 Problem B. Matrix Fast Power
    校赛热身 Problem B. Matrix Fast Power
    集合的划分(递推)
  • 原文地址:https://www.cnblogs.com/x54256/p/8412601.html
Copyright © 2011-2022 走看看