kimilyh 发表于 2017-3-17 10:29

【笔记】关于JAVA中抽象类和接口

本帖最后由 kimilyh 于 2017-3-19 19:58 编辑

今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解。

1 抽象类
  用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为。也就是说,抽象类中的方法,需要在子类中进行重写。这样看来,抽象类和一般的父类没什么两样。  什么时候需要使用到抽象类呢?
  大家知道,子类继承父类的方法,因为子类自己有特殊性,需要对父类方法进行重写,举最简单的例子abstract class   Person { //定义一个名为人类的抽象类
   //以下定义抽象方法,抽象方法只有方法声明 没有方法体;
      abstract String Is();
    }

    class Student extends Tuxing {
      public String Is(){//重写父类的方法
            return " 我是学生!";   
      }   
    }

    class Teacher extends Tuxing {
      public String Is(){
            return " 我是老师!";   
      }
    }

子类(Student和Teacher)继承父类(Person),Person中有作为人的共同方法Is(),在子类中对Is方法进行重写,得出结果。用一般方法编写时,一旦编写子类代码中,忘记对Is方法进行重写,就会输出父类的空方法体,此时程序无报错,但结果已错误。代码不严谨。
  此时需要将父类中Is方法加上修饰符abstract,去除方法体,父类类名前加上abstract编译,报错,显示必须对子类中Is代码进行重写。如上代码所示。
  以上即可避免代码的错误,保证代码的准确性。   【理解理解】需要讲几点:
  1 抽象类,即那个父类,用abstract修饰,后不能加private(加了子类无法继承),抽象类的抽象方法,没有方法体,即括号后直接加分号;
  2 抽象类和抽象方法的关系:
    抽象类中不一定有抽象方法(编译能成功,但不用抽象方法,就没有使用抽象类的意义了)
    有抽象方法的类一定是抽象类(即有抽象方法,对应的那个类也一定要用abstract修饰)但是抽象方法也可以存在在接口当中,注意之间的关系~
  3 【重要】抽象类有构造方法(有子类证明有构造方法)但规定不能实例化,不能创建对象
  4 抽象类必有子类:抽象类的意义在于子类的重写,所以必有子类
    根据这个性质可知abstract和final不能共存2 接口  定义了类应该遵循的规范,但接口不关心内部数据和方法如何实现。
  一个类要实现这个接口(implement),就必须遵循接口中规定的规范(即重写接口中定义的方法)
  举个例子说,比如定义了一个名叫手机的接口,里面规定了手机应该具备的功能发短信,此时各手机商创建手机这个实例对象时,都应该遵循手机接口中定义的规范,即都要有发短信的功能,但不同的实际实现这个功能的方法可能不一样。可以看出接口和抽象类的功能基本是一致的。
  【重要】实际上,接口就是一种特殊的抽象类。(把接口当做类来理解!)
   
interface ICellPhone{ //定义了一个叫做手机的接口 规范了手机的行为 如有父接口,可以用extends继承父接口      String type = "安卓手机";//默认final类型,记得赋初值
         
      void sendMsg();//默认为抽象方法 可不用写abstract   
    }
   
    class Huawei implements ICellPhone{
    //定义手机 为了实例化出手机对象 用类 implements表示华为手机实现了手机这个规范
      public void sendMsg(){ /*此方法前只能加public 因为是重写接口里的sendMsg(),sendMsg()默认为public 子类不能比父类范围小*/
            System.out.println("华为发送短信");
      }
    }

    class Xiaomi implements ICellPhone{
      public void sendMsg(){
            System.out.println("小米发送短信");
      }
    }
    public class JiekouDemo {

      public static void main(String[] args) {
            String str = ICellPhone.type;//把接口看作类,type是静态变量,他也可以用过类名.变量名来访问
            ICellPhone hu = new Huawei();
            hu = new Xiaomi();
            hu.sendMsg();
    }

}

【重要 结合具体代码理解】  接口的语法 :
     interface 接口名
    可以看出,接口有继承性,是一种特殊的类,编译结果为.class(把接口看做类,好理解)
  接口的特点 :
    接口内方法都是抽象的,默认为abstract public(可不写)
    接口内变量都是全局变量,默认为public static final
    接口可以继承接口,但不继承类。
    子类只能继承一个父类(extends),但可以实现多个接口(implemnets)。
    注意措辞,类是继承,接口是实现。3 接口和抽象类的区别
  同:都位于继承的顶端,用于被其他实现或继承;
    都不能实例化;(不能new)
    都有抽象方法,子类中必须对父类方法进行重写
  异:抽象类中有一般方法(用于适配器模式,详解见下篇),接口中仅有抽象方法

4 选择
  既然抽象方法和接口有很多相似的地方,那如何选择呢?
    优先选用接口,尽量少用抽象类;(接口的抽象性比抽象类更彻底,因为抽象类中还可以有其他类)
    需要定义子类的行为,又要为子类提供共性功能时才选用抽象类(就是说 一个功能子类要做,父类也要做,即模板模式);
5 学习JAVA 多写代码多理解 一起加油加油~

olanping 发表于 2017-3-17 10:38

接口是特殊的抽象类

q59541511 发表于 2017-3-17 10:51

type不是基本类型么.
定义一个变量名能用int 或者type?
咋感觉你这代码写的好不规范-.-
ICellPhone hu = new Huawei();
hu.sendMsg();
            hu = new Xiaomi();
hu.sendMsg();
这个换一行不好看一点-.-我看半天没明白-.-

吾要开始学习ing 发表于 2017-3-17 10:57

java对于我来说可能有点困难       我还要继续学习啊啊

平淡哥 发表于 2017-3-17 17:00


确实不错的小工具,有时候我用系统自带的那个截图工具,可能你这个更方便!

wzhJava1 发表于 2017-3-17 17:07

页: [1]
查看完整版本: 【笔记】关于JAVA中抽象类和接口