面向对象五——抽象类和接口

一、final和static关键字

1、final

  final是一个关键字,表示最终的意思,可以用来修饰类、变量、方法。
  修饰类:表明该类是最终类,不能被继承
  修饰变量:表明该类是常量,不能再次赋值
  修饰方法:表明该方法是最终方法,不能被重写

2、static

  static是一个关键字,表示静态的意思。可以用来修饰成员变量和成员方法。

(1)static修饰成员的特点

  • 被类的所有对象共享(这也是判断一个成员是否应该用static修饰的条件)
  • 可以通过类名直接访问
  • 优先于对象存在
  • 随着类的加载而加载

(2)静态与非静态成员方法的对比

非静态的成员方法:

  • 能访问静态的成员变量
  • 能访问非静态的成员变量
  • 能访问静态的成员方法
  • 能访问非静态的成员方法

静态的成员方法:

  • 能访问静态的成员变量
  • 能访问静态的成员方法

注意:
  静态成员方法中不能出现this,super这样的关键字
  原因:静态是随着类的加载而加载,this,super这样的关键字是随着对象的创建而存在的,先进内存的不能访问后进内存的。

二、抽象类

1、概述

  抽象类顾名思义就是用来描述一个抽象的事物的类,比如说我们在说动物的时候,并没有具体的说是那种动物,这就是一个抽象的事物,而如果我说猫,这相对而言就是一个具体的事物。同样的,每个动物都具有吃东西的行为,但是不同动物吃的东西是不同的,所以我们在定义动物这个类的时候不能给出具体的体现,只需要给一个声明既可。
  在Java中,一个没有方法体的方法应该定义为抽象方法,而一个类中如果有抽象方法,该类就必须定义为抽象类。

2、特点

(1)抽象类和抽象方法必须使用abstract关键字修饰;
格式:

public abstract class 类名 {}
public abstract 返回值类型 方法名() {}

(2)抽象类中不一定有抽象方法,但是有抽象方法的类一定是抽象类;
(3)抽象类不能直接实例化,如果想要实例化,需要参照多态的方式,通过子类对象实例化;
(4)抽象类的子类要么是抽象类,要么必须重写抽象类中的所以抽象方法。

案例1:

//定义一个抽象类
public abstract class Animal{
    public abstract void eat();
    
    //抽象类中可以有普通方法
    public void sleep(){
        System.out.println("睡觉");
    }
 }

//定义一个子类Cat继承Animal
public class Cat extends Animal{
    //重写抽象方法
    @Override
    public void eat(){
        System.out.println("猫吃鱼");
    }
}

//定义测试类
public class AnimalDemo{
    public static void main(String[] args){
        //创建对象
        Animal a = new Cat();
        a.eat();
        a.sleep();
    }
 }

3、成员的特点

(1)成员变量:可以是变量也可以是常量;
(2)构造方法:抽象类中也有构造方法,用于子类访问父类数据的初始化;
(3)成员方法:成员方法可以是抽象的,也可以是非抽象的。
  抽象方法限定子类必须完成某些动作,非抽象方法能够提高代码的复用性

案例2

//定义一个Person类
public abstract class Person {
    private int age = 20;   
    private String country = "中国";
    
    public Person() {}
    
    public Person(int age) {
        this.age = age;
    }
    
    public void show() {
        age = 30;
        System.out.println(age);
        System.out.println(country);
    }
    
    public abstract void eat();
}

//定义一个子类Student继承自Person
public class Student extends Person {

    @Override
    public void eat() {
        System.out.println("学生爱吃KFC");
    }       
}

//定义测试类
public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Student();
        //Person的对象p可以调用Person的方法,但是运行的时候运行的是Student内的方法
        //如果Student内没有这个方法,再调用Person内的方法
        p.show();
        p.eat();
    }
}

三、接口

1、概述

  我们在生活中,每个人都会有不同的技能,这些技能不是一个人与生俱来的,而是我们慢慢学来的,因此我们在定义人类时,不能将这些额外的技能定义进去,因为只有部分人才有这些技能。所以,为了体现事物功能的拓展性,Java中就提供了接口来定义这些额外的功能,并不给出具体实现,将来谁学会了特殊的技能,只需要这部分人实现这些额外的功能。

2、特点

(1)接口用关键字interface表示
格式:

public interface 接口名{}

(2)类实现接口用implements表示
格式:

public class 类名 implements 接口名 {}

(3)接口也不能直接实例化,补习按照多态的方式,有具体的实现类实例化。这也是多态的一种,称为接口多态。
(4)接口的实现类要么是一个抽象类,要么重写接口中的所有的抽象方法。
案例3:

//定义一个钢琴接口
public interface Piano {
    //抽象方法
    public abstract void playThePiano();
}

//定义学生类实现钢琴接口
public class Cat implements Piano {

    @Override
    public void playThePiano() {
        System.out.println("学生会弹钢琴");
    }

}

//定义测试类
public class InterfaceDemo {
    public static void main(String[] args) {
        //接口多态的形式实例化
        Piano p = new Student();
        p.playThePiano();
    }
}

3、接口的成员特点

(1)成员变量:只能是常量,默认修饰符为public static final
(2)构造方法:没有构造方法,因为接口是由于扩张功能的,没有具体存在
(3)成员方法:只能是抽象方法,默认修饰符public abstract

4、类与类、类与接口、接口与接口的关系

(1)类与类:继承关系,只能单继承,但是可以多层继承。
(2)类与接口:实现关系,可以单实现,也可以多实现。还可以在继承一个类的同时实现多个接口。
(3)接口与接口:继承关系,可以单继承也可以多继承。

四、抽象类和接口的区别

1、成员区别

抽象类:
  成员变量:可以是变量可以是常量
  构造方法:有
  成员方法:可以是城乡方法,也可以是非抽象方法
接口:
  成员变量:只能是常量
  没有构造方法
  成员方法:只能是抽象方法

2、关系区别

  类与类:继承关系,只能单继承,可以多层继承。
  类与接口:实现关系,可以单实现,也可以多实现。
  接口与接口:继承关系,可以单继承,也可以多继承。

3、设计理念的区别

  抽象类 被继承体现的是:"is a" 抽象类中定义的是继承体系的共性功能。
  接口 被实现体现的是:"like a" 接口中定义的是该体系的扩展功能。
  用一张图来表示类,抽象类,接口的关系


类,抽象类,接口的关系
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 面向对象笔记 一、 对象在内存中的存放方法以及被调用过程 class文件首先被加载到方法区中的class文件内容区...
    VictorBXv阅读 546评论 0 2
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,244评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,819评论 18 399
  • 2017年读的第一本书竟然是《霍比特人》。相信大多数的电影爱好者已经看过2012到2014年出品的电影《霍比特人》...
    黑蘑菇2333阅读 1,005评论 0 0
  • 今日惊闻又一产妇因为坐月子的陋习而热至身亡,实在令人震惊而痛心! 几年前的这个季节,我也是一名产妇,两个妈妈忙前忙...
    简儿的十年阅读 296评论 6 4

友情链接更多精彩内容