编程的蜗牛

颓废,始于首次的懒惰与原谅。

导航

Java基础(七)接口、继承、多态

本文抄于:https://www.cnblogs.com/adamjwh/p/8360602.html

  继承机制的使用可以复用一些定义好的类,减少重复代码的编写;多态机制的使用可以动态调整对象的调用,降低对象之间的依存关系。有了这些概念,再来看接口是做什么用的。

  了解接口之前,需要了解一下抽象类

  在Java中,一个没有方法体的方法应该被定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。

  抽象类和抽象方法必须有abstract关键字修饰。

  抽象类的特点:

  1、成员变量:可以是变量、常量。2、构造方法:有构造方法,但是不可实例化,必须通过继承方式,用于子类访问父类数据的初始化(多态形式进行实例化)。3、子类必须重写父类成员方法,或者子类必须是抽象类。4、抽象类中未必有抽象方法,但是有抽象方法的类,肯定是抽象类。

一、接口

  首先我们需要知道,Java语言只支持单重继承,不支持多继承。这句话的意思就是一个类只能有一个父类,但我们经常需要使用多继承来解决问题,所以Java语言提供了接口来实现类的多重继承功能。

  接口描述:接口就是一种公共的规范标准,更多体现在对行为的抽象。

  接口的特点:没有构造方法,只能通过实现该接口,以多态的形式进行创建对象。子类必须重写接口中的所有抽象方法,或者该子类就是抽象类。

  抽象类与接口的区别:

  成员区别:抽象类有常量、变量、构造方法、抽象方法,非抽象方法。接口只有常量,抽象方法。

  继承区别:抽象类只能单继承,可以多层继承。接口可以多实现。

  设计理念:抽象类主要是属性,接口主要是行为。

  1. 接口的定义

  Java中使用interface来定义一个接口,接口定义与类相似(类的定义用的是class),下面直接上例子。

public interface ICalculate {
    final float PI = 3.1415f;        // 定义常量PI,表示圆周率
    float getArea(float r);            // 定义用于计算面积的方法getArea()
    float getCircumference(float r);    // 定义用于计算周长的方法getCircumference()
}

  从上述代码可以看出,interface是定义了一个接口,接口名为ICalculate(接口一般可以用大写字母“I”开头),在接口中可以定义变量和方法,但需要注意的是这里的方法都不能写方法体,也即方法名后直接加“;”,而方法的实现是写到实现接口的类中的。还有一点需要注意的是,接口中的所有方法都必须在实现了该接口的类中实现(可以空实现)。

  接下来演示一下Eclipse中如何创建一个接口。

  (1)首先在包上右键new一个Interface

  

  (2)填写接口名并确定

  

  (3)编写代码

  

  2. 接口的实现

  上面定义了一个接口,但要实现接口需要在类中用implements关键字,下面直接看例子,对应的接口是上例中的ICalculate。

 1 public class Calculate implements ICalculate {
 2 
 3     @Override
 4     public float getArea(float r) {
 5         float area = PI*r*r;        // 计算圆面积并赋值给area
 6         return area;                // 返回area的值
 7     }
 8 
 9     @Override
10     public float getCircumference(float r) {
11         float circumference = 2*PI*r;    // 计算圆周长并赋值给circumference
12         return circumference;            // 返回circumference的值
13     }
14 
15 }

   Eclipse中创建步骤如下:

  (1)填写类名,点击Add添加接口

  

  (2)输入查找接口并确定

  

  (3)接口导入后点击确定,就可以看到如下界面,填写相应代码即可(创建的每个接口中的方法都必须实现,可以空实现,所以不能删除这里的任何一个方法)

  

  一个类可以实现多个接口,写法就是implements后的接口间以“,”隔开即可。如果变量冲突,则通过“接口名.变量”来明确指定变量的接口。

二、继承

  继承的概述:

  继承是面向对象的三大特征之一。可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法。

  1. 继承的实现

  在Java中,使用extends关键字实现继承,extends后跟的是父类名,也就是它从哪个类继承过来的,而用extends的这个类本身称为子类。

  下面举个简单的例子,在生物学中,鸽子属于鸟的一种,所以鸟是父类,鸽子是子类。

  父类:

public class Bird {
    String color = "灰色";    // 颜色
    String skin = "羽毛";    // 皮毛
}

  子类:

public class Pigeon extends Bird {
    public static void main(String[] args) {
        Pigeon pigeon = new Pigeon();
        System.out.println(pigeon.color);
    }
}

  2. 重写

  简单来说就是,如果子类方法名和父类方法名相同,那么子类就不能继承父类的方法,此时称子类的方法重写了父类的方法。重写也可称为覆盖。

  举个简单的例子,这是一个动物类,实现了一个voice方法:

public class Animal {
  public Animal() {}
  public void voice() {
        System.out.println("make some voice..");
    }
}

  创建一个Animal类的子类Dog,重写voice方法发出狗叫:

public class Dog extends Animal{
    public Dog() {}

    @Override
    public void voice(){
        System.out.println("woof...");
    }
}

  再创建一个Animal类的子类Cat,重写voice方法发出猫叫:

public class Cat extends Animal {
    public Cat() {}

    @Override
    public void voice(){
        System.out.println("nya...");
    }
}

  此时调用dog和cat中的方法都不会出现“make some voise..”字样,而是对应的狗叫和猫叫。

  但如果此时再创建一个Animal类的子类,但不重写方法,此时输出为父类Animal中voice方法的内容,创建一个子类Fish如下:

public class Fish extends Animal{
    public Fish() {}
}

  下面创建一个Zoo类,来调用上述几个方法测试一下:

public class Zoo {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.voice();

        Cat cat = new Cat();
        cat.voice();
        
        Fish fish = new Fish();
        fish.voice();
    }
}

  运行结果如下:

  

  从运行结果可以看出,由于Dog类和Cat类都重写了父类的方法voice(),所以执行其相应的方法,而Fish类中没有重写,所以执行的是父类中的方法。

  3. super关键字

  子类可以调用父类声明的构造方法,但是必须在子类的构造方法中使用super关键字来调用;如果想在子类中操作父类中被隐藏的成员变量和被重写的成员方法,也可以使用super关键字。这些在以后的项目中会出现,这里就不举例了,如果使用Java编译器的话,需要使用super关键字但未使用时编译器会有错误提示。

  继承中构造方法的特点:

  子类中所有构造方法,默认都会访问父类的无参构造方法。因为子类继承父类中的数据,可能还会访问父类中的数据,子类初始化前,一定先完成父类的初始化。

  每一个子类构造方法的第一条语句默认都是:supper();

  如果父类中没有无参构造方法,只有带参构造方法,那么通过关键字supper手动书写无参构造。

  继承的有点和弊端:

  优点:提高代码复用性。(多个类相同的成员,可以放到同一个类中)2、提高代码的可维护性。(方法中代码修改,只修改一处就可)

  弊端:继承让类与类之间产生来了关系,增强代码的耦合性。父类变化,子类也要跟着变化,削弱了子类的独立性。

三、多态

  多态概述:同一对象,在不同时刻表现出来的不同形态。

  多态的特征:1、有继承实现关系。2、有方法重写。3、父类引用指向子类对象。

  多态成员访问特点:

  成员变量:编译看父类,执行看父类。成员方法:编译看父类,执行看子类。(原因:继承方法有重写,成员变量没有重写)。

  多态的转型:向上转型,父类引用子类对象。向下转型:父类引用转为子类对象(强制转换)。

  

posted on 2021-10-10 15:07  粼溪  阅读(144)  评论(0)    收藏  举报