Java进阶03(接口、多态、接口案例)

Part01:接口

1、类的概念:
类是一堆具有共同的成员变量(属性)和成员方法(功能)的对象的集合;

2、接口:
接口是功能的集合,就是方法的集合;
也就是说接口中只能定义方法,不能定义普通的成员变量,定义的成员变量必须由固定修饰符public static final 修饰;//例如:public static final int x=10;(常量,不能修改);
而且接口中的成员方法,必须有固定修饰符public abstract,即必须都是抽象的;
(接口中成员变量和成员方法的固定修饰符可以不写(不能写错),但是不写不代表没有,编译器会自动添加)
不能创建对象,作为父接口;

3、接口的定义:
关键字:interface
格式:

 public interface 接口名{
         //成员变量:不能定义普通的成员变量;
         //成员方法:必须都是抽象的;
         public abstract 返回值类型  方法名( );
  }

4、类与类之间:不支持多继承,只支持多层继承;
接口与接口之间:可以多继承,一个子接口可以有多个父接口,也支持多层继承;
类与接口之间:不叫继承,叫实现(implements);只有类实现接口,可以多实现;

5、实现(Implements):
实现是把接口中的抽象方法都拿过来;实现类必须覆盖掉接口中所有的抽象方法后,实现类才可以实例化,否则实现类是一个抽象类;

6、在开发中常用的模式:
一个类 继承 一个抽象类,同时实现多个接口
public class A extends AbstractClassB implements 接口A,接口B{
注意:
A中必须重写抽象类中的抽象方法,以及所有接口中的抽象方法;
}

7、接口的特点:
接口可以继承接口:
如同继承类后便拥有了父类的成员,可以使用父类的非私有成员,A接口继承B接口后,A接口便拥有了A、B两个接口中所有的抽象方法;
Java支持一个类同时实现多个接口,或一个接口同时继承多个接口;
类可以在继承一个类的同时,实现多个接口;
接口与父类的功能可以重复,均代表要具备某种功能,并不冲突;

8、接口和抽象类的异同:
相同点:

  • 都不能直接创建对象;
  • 都是作为父类/父接口,用于被其他类继承或实现;
  • 都可以包含抽象方法,其 子类/实现类 都必须重写该抽象方法,然后才能创建对象;

不同点:

  • 抽象类可以定义任意成员变量,接口的成员变量必须public static final修饰;
  • 抽象类用关键字abstract修饰,接口用关键字interface修饰;
  • 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性;
  • 接口只能包含抽象方法,抽象类可以包含也可以不包含;
  • 类和抽象类之间关系是单继承,类和接口之间的关系是多实现(弥补了Java的单继承);
  • 思想上的区别:抽象类为整个继承体系的共性内容;
    接口中定义的是整个继承体系外扩展的功能;

二者选用:
优先用接口,尽量少用抽象类;
需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;

Part02:多态

1、面向对象三大特点:
封装(安全性)、继承(扩展性)、多态(灵活性)
2、多态:
是指对象的多态,一个对象的多种状态;
前提:必须有父子关系(必须有继承);
必须有方法的重写;
3、多态在Java中的表现形式:
父类类型 变量名=new 子类类型( );//父类类型的变量指向了子类的对象;
接口类型 变量名=new 实现类( );//
4、注意事项:
使用多态调用成员变量:编译看父类中是否存在,不存在编译失败;运行父类中的变量;
使用多态调用成员方法:编译看父类中是否存在,不存在编译失败;运行子类重写的方法;
5、多态的利弊端:
弊端:只能调用子父类共有的方法,不能调用子类特有的;
好处:配合继承与方法重写提高了代码的复用性和扩展性,如果没有方法重写,则多态同样没有意义;(因为父类的变量可以接受任何一个子类对象)
//多态好处的例子

public class DuoTaiDemo {
    public static void main(String[] args){
        Animal animal=new Dog();
        feedAnimal(animal);
    Animal animal1=new Pig();
    feedAnimal(animal1);

    }
    public static void feedAnimal(Animal animal){
        System.out.println("吃饭啦");
        animal.eat();
    }
}
//父类动物类
abstract class Animal  {
    public abstract void eat();
}
//子类狗狗类
class Dog extends Animal {
    @Override
    public void eat() {
        System.out.println("狗狗在吃饭。。。");
    }
}
//子类小猪类
class Pig extends Animal{
    public void eat(){
        System.out.println("小猪在吃饭。。。");
    }
}

7、多态弊端的解决方法:
向下转型:强制类型转换;//Dog dog=(Dog) animal; dog.子类特有方法();
向上转型(多态):自动类型转换;//Animal animal=new Dog( );
向下转型弊端:把父类的变量转换成子类类型的时候,编译器直接编译通过,不检查;
解决方案:一个关键字 instanceof (运算符)
作用:判断某一个变量是不是该类的类型//boolean b=animal instanceof Dog;

Part03:接口案例

定义USB接口(具有开启功能、关闭功能),笔记本要使用USB设备,即笔记本在生产时需要预留可以插入USB设备的USB接口,即就是笔记本具备使用USB设备的功能,但具体是什么USB设备,笔记本并不关心,只要符合USB规格的设备都可以。鼠标和键盘要想能在电脑上使用,那么鼠标和键盘也必须遵守USB规范,不然鼠标和键盘生产出来无法使用;
进行描述笔记本类,实现笔记本使用USB鼠标、USB键盘;

  • USB接口,包含开启功能、关闭功能;

  • 笔记本类,包含运行功能、关机功能、使用USB设备功能;

  • 鼠标类,要符合USB接口;

  • 键盘类,要符合USB接口;

    //主类

    public class Test {
          public static void main(String[] args){
              NotebookPC notebookPC=new NotebookPC();
              USB usb=new Mouse();
              USB usb1=new Keyboard();
              notebookPC.open();
              notebookPC.useUSB(usb);
              notebookPC.useUSB(usb1);
              notebookPC.close();
          }
      }
    

//笔记本电脑类

class NotebookPC  {

public void open() {
    System.out.println("笔记本电脑开机了");
}
public void useUSB(USB usb){
    usb.open();
    usb.use();
    usb.close();
}
public void close() {
    System.out.println("笔记本电脑关机了");
 }
}

//接口USB

interface USB {
    public abstract void open();
    public abstract void use();
    public abstract void close();
}

//USB键盘

class Keyboard implements USB {
    @Override
    public void open() {
        System.out.println("键盘打开了");
    }

    @Override
    public void use() {
        System.out.println("键盘使用了");
    }

    @Override
    public void close() {
        System.out.println("键盘关闭了");
    }
}

//USB鼠标

 class Mouse implements USB {
    @Override
    public void open() {
        System.out.println("鼠标打开了");
    }

    @Override
    public void use() {
        System.out.println("鼠标使用了");
    }

    @Override
    public void close() {
        System.out.println("鼠标关闭了");
    }
}

你可能感兴趣的:(Java进阶,Java)