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

2018-02-08  本文已影响0人  嗷老板

一、final和static关键字

1、final

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

2、static

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

(1)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" 接口中定义的是该体系的扩展功能。
  用一张图来表示类,抽象类,接口的关系


类,抽象类,接口的关系
上一篇下一篇

猜你喜欢

热点阅读