网络知识 娱乐 JAVA14-接口与抽象类

JAVA14-接口与抽象类

接口

概述

  1. 当需要从几个类中派生出一个类,继承他们所有的属性和方法,JAVA没有多重继承需要用接口实现
  2. 从几个类中抽取出一些共同的行为特征,而他们之间又没有is-a的关系,也需要借助接口实现
  3. 接口本质是契约,规范

使用

  1. 接口中使用interface来定义
  2. 接口和类是两个不同的结构
  3. 接口中不能定义构造器(也就不能实例化)
  4. 接口通过类来实现implements
  5. JAVA类可以实现多个接口格式:class AA extends BB interface CC,DD
  6. 接口与接口之间可以继承,并且可以多继承
  7. 接口体现了多态性
public class UsbTest {
    public static void main(String[] args) {
        Computer com =new Computer();
        Flash flash=new Flash();
        com.transferData(flash); // USB usb =new Flash()
        com.transferData(new Printer());
        /*
		* U盘开始工作
		* 传输数据
		* U盘结束工作
		* 打印机开始工作
		* 传输数据
		* 打印机结束工作
		* 
		* */
    }
}
class Computer{
    public void transferData(USB usb){
        usb.start();
        System.out.println("传输数据");
        usb.stop();
    }

}
interface USB{
    void start();
    void stop();
}
class Flash implements USB{

    @Override
    public void start() {
        System.out.println("U盘开始工作");
    }

    @Override
    public void stop() {
        System.out.println("U盘结束工作");

    }
}
class Printer implements USB{

    @Override
    public void start() {
        System.out.println("打印机开始工作");

    }

    @Override
    public void stop() {
        System.out.println("打印机结束工作");

    }
}

  1. JDK8的写法
  • 接口中定义的静态方法,只能通过接口调用
  • 通过实现类的对象,可以实现接口中的默认方法
  • 如果子类(或者实现类)继承的父类和实现的接口中声明了同名同参数方法,如果子类没有重写该方法,调用的是父类中同名同参数方法
public class JDK8Test {
    public static void main(String[] args) {
        SubClass sub =new SubClass();
        CompareA.methods1();
        sub.methods2();
        /*
        * Compare 北京
		* Compare 上海
        */
    }
}
class SubClass implements CompareA{

}
interface CompareA{
    public static void methods1() {
        System.out.println("Compare 北京");
    }
    public default void methods2() {
        System.out.println("Compare 上海");
    }
}

代理模式

  1. 代理模式就是为其他对象提供一种代理以控制对这个对象的访问
  2. 实例
public class NetWorkTest {
    public static void main(String[] args) {
        Server server=new Server();
        ProxyServer proxyServer=new ProxyServer(server); // 放的是被代理对象进去
        proxyServer.browse(); // 调用的是代理对象,但结果是真实对象的方法被调用
        /*
        * 检查工作
		* 真实服务器访问网络
        */
    }
}
interface NetWork{
    void browse();
}
// 被代理类
class Server implements NetWork{

    @Override
    public void browse() {
        System.out.println("真实服务器访问网络");
    }
}
// 代理类
class ProxyServer implements NetWork{
    private NetWork work;
    public ProxyServer(NetWork work){
        this.work=work;
    }
    public void check(){
        System.out.println("检查工作");
    }

    @Override
    public void browse() {
        check();
        work.browse();
    }
}

内部类

  1. JAVA允许将一个类A声明在另一个类B中,则类A是内部类,类B是外部类
  2. 内部类分类
  • 成员内部类
    • 静态 static
    • 非静态
  • 局部内部类
    • 方法内
    • 代码块内
    • 构造器内
  1. 实例化内部类对象
public class InnerClassTest {
    public static void main(String[] args) {
        // 实例化Dog,静态类
        Pseson.Dog dog=new Pseson.Dog();
        dog.eat();
        // 吃骨头
        // 实例化Cat,非静态类
        Pseson p1 =new Pseson();
        Pseson.Cat cat=p1.new Cat();
        cat.eat();
        // 猫吃鱼
    }
}
class Pseson{
    String name;
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
    static class Dog{
        String name;
        int age;
        public void eat(){
            System.out.println("吃骨头");
        }
    }
    class Cat{
        public void eat(){
            System.out.println("猫吃鱼");
        }
    }
}
  1. 调用外部类结构
public class InnerClassTest {
    public static void main(String[] args) {
        // 实例化Cat,非静态类
        Pseson p1 =new Pseson();
        Pseson.Cat cat=p1.new Cat();
        cat.eat();
        cat.display("小花");
        /*
        * 小花
        * 波斯猫
        * 人
        */ 
    }
}
class Pseson{
    String name="人";
    int age;
    public void eat(){
        System.out.println("吃饭");
    }
    static class Dog{
        String name;
        int age;
        public void eat(){
            System.out.println("吃骨头");
        }
    }
    class Cat{
        String name="波斯猫";
        public void eat(){
            System.out.println("猫吃鱼");
        }
        public void display(String name){
            System.out.println(name); // 方法中name
            System.out.println(this.name); // 内部类中name
            System.out.println(Pseson.this.name); // 外部类中name

        }
    }
}
  1. 接口与抽象类
  • 相同点:不能实例化;都包含抽象方法;能被继承
  • 不同点:抽象类有构造器,接口没有构造器;抽象类只有单继承,而接口可以多继承;抽象类extands继承,接口implements实现