• javase学习第九天(抽象类与接口)


    抽象类与接口

    抽象类

    用abstract修饰的类称为抽象类; abstract class 类名{};

    用abstract修饰的方法为抽象方法;

    抽象方法没有方法体,即没有{};

    抽象类可以没有抽象方法,有抽象方法的类一定是抽象类;

    抽象类不能实例化;具体是由子类实例化完成的,也体现了抽象类多态

    抽象类可以有构造方法,是用来被子类调用的,程序员自己不能调用。

    子类继承抽象类,使用extends;分两种情况:

    1、子类仍为抽象类:不完全实现其父类的抽象方法;

    2、完全的实现类:重写父类抽象类中的所有抽象方法,可以进行实例化对象。

    抽象类的抽象方法定义的非法组合:

    1、private+abstract:抽象方法依靠子类去实现,但私有方法在类外就不能访问,也就无法实现;

    2、final+abstract:final修饰的方法不能被重写,而抽象方法就是需要子类实现,彼此矛盾;

    3、static+abstract:抽象方法是没有实体的,使用类名调用的使用调用的是没有实体的方法,没有作用。

    抽象类成员的特点:

    成员变量:

    即可以是变量,也可以是常量(final);

    构造方法:有,用于子类访问抽象类数据的初始化;

    成员方法:即可以是抽象的,也可以是非抽象的;

    抽象类的成员方法特征: 1、抽象方法,强制要求子类去实现; 2、非抽象方法:子类继承的事情,提高代码的复用性。

    接口

    定义

    接口定义了一种规范,接口规定了某一批类所需要遵守的规范,接口不关心这些类的内部状态数据,也不关心这些类的方法的实现细节,它只规定这批类必须提供某些方法。

    接口里的所有方法都是抽象方法,成员变量全部是常量实现类首先用该实现这些最基本的方法,然后在此基础上进行扩展。

    特点

    格式:interface 接口名{}

    类实现接口用implements关键字。 格式:class 类名 implements 接口名{}

    接口没有构造方法,即接口不能实例化。由具体的子类实例化。

    接口的子类

    1、可以是抽象类,用implements关键字

    2、可以是一个接口,用extends关键字

    3、可以是一个实现类,实现接口中的所有抽象方法。

    总结:

    1.接口不能实例化对象

    2.子类如果是实现类的话,就必须实现接口中定义的所有抽象方法

    3.子类如果不完全实现接口中的抽象方法,那子类就是抽象类

    4.接口和接口之间可以继承--extends

    接口成员特点

    成员变量

    1、只能是常量,通过接口名访问静态常量;

    2、默认修饰符public static final,其中的任何一个都可以省略,也可以全都省略。

    构造方法

    没有,因为接口主要是扩展功能的,而没有具体存在,子类的构造方法中可以使用super()。

    成员方法

    1、只能是抽象方法

    2、默认修饰符public abstract,可以省略其中之一,或则都省略。

    类与类,类与接口,接口与接口的关系

    普通类与普通类--extends

    继承关系,只能单继承,但是可以多层继承

    普通类与抽象类--extends

    继承关系,只能单继承,但是可以多层继承

    普通类与接口,抽象类与接口--implements

    1、实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口

    2、此时应注意:extends 写在前,implements写在后

    接口与接口--extends

    继承关系,可以单继承,也可以多继承

    抽象类和接口区别

    成员区别

    抽象类 :

    变量,常量都可以有;

    抽象方法,非抽象方法都可以有;可以有构造方法

    接口 :

    只有常量;只有抽象方法;没有构造方法

    实例:

     1 interface ISmoke{
     2     public void smoking();
     3 }
     4 abstract class Person{
     5     private String name;
     6     private int age;
     7     public void setName(String name){
     8         this.name=name;
     9     }
    10     public void setAge(int age){
    11         this.age=age;
    12     }
    13     public String getName(){
    14         return name;
    15     }
    16     public int getAge(){
    17         return age;
    18     }
    19     public Person(){}
    20     public Person(String name,int age){
    21         this.name=name;
    22         this.age=age;
    23     }
    24     public abstract void eat();
    25     public void sleep(){
    26         System.out.println("all person should sleep");
    27     }
    28 }
    29 class Student extends Person{
    30     public Student(){}
    31     public Student(String name,int age){
    32         super(name,age);
    33         
    34     }
    35     public void eat(){
    36         System.out.println("students eat noodle");
    37     }
    38 }
    39 class Teacher extends Person{
    40     public Teacher (){}
    41     public Teacher(String name,int age){
    42         super(name,age);
    43     }
    44     public void eat(){
    45         System.out.println("teacher eat rice");
    46     }
    47 }
    48 class SmokStudent extends Student implements ISmoke{
    49     public SmokStudent(){};
    50     public SmokStudent(String name,int age){
    51         super(name,age);
    52     }
    53     public void smoking(){
    54         System.out.println("i'm student,but i can smoking");
    55     }
    56     
    57 }
    58 class PersonDemo{
    59     public static void main(String[] args){
    60         Person p=new Student("tom",23);
    61         p.eat();
    62         p.sleep();
    63         System.out.println("name: "+p.getName()+" age:"+p.getAge());
    64         System.out.println("------------");
    65         SmokStudent sm=new SmokStudent("tomtma",35);
    66         System.out.println("name: "+sm.getName()+" age:"+sm.getAge());
    67         sm.eat();
    68         sm.sleep();
    69         sm.smoking();
    70     }
    71 }

     

  • 相关阅读:
    什么是 DLL?
    如何用vc创建和读取xml文件??
    VC中调用 Excel 的总结
    Excel.cpp和Excel.h
    SQL中也可以用格式字符串定制日期转字符串
    REVERT权限切换
    透明数据加密
    批量恢复数据库
    FILESTREAM
    eclipse Tomcat热启动maven install Jrebel
  • 原文地址:https://www.cnblogs.com/yihaifutai/p/6624333.html
Copyright © 2020-2023  润新知