final关键字、抽象类、接口

final关键字

final修饰类:表示该类不能被继承
final修饰方法:表示该方法不能被重写
final修饰变量:表示该变量值不能被修改了

重写与重载区别
重写是子类的方法覆盖父类的方法,要求方法名和参数都相同(注意:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏
重载是在同一个类中的搜索两个或两个以上的方法,拥有相同的方法名,但是参数却不相同,方法体也不相同

接口中的属性的默认是public static final 、方法是public abstract

抽象类

抽象方法,只含有声明部分,没有函数体,称为抽象方法。抽象方法默认是包内访问权限

abstract void f();

一个类含有一个或多个抽象方法,这个类就必须使用abstract关键字(注意:抽象方法必须是public或者protected的,不能是private),但一个使用abstract关键字的类,可以没有抽象方法。
接口中的所有方法默认都是public abstract的,不需要显示声明
注意抽象类不能直接被实例化。

接口

接口可以看做是高度抽象的类
接口中的属性的默认是public static final 、方法是public abstract
在JDK8.0中增加了接口中可以定义默认方法静态方法
默认方法可以被实现接口的类继承,静态方法需要直接使用接口名调用

interface TestInterFace{
    // 接口中的静态方法jdk8出现
    static void test() {
         System.out.println("interface test");
    }
    // 接口中的默认方法,可以被实现接口的类的对象直接调用
    default void test1() {
        System.out.println("default test2");
    }
     void test2();
}
public class Main implements TestInterFace{
    @Override
    public void test2() {
        System.out.println("123");
    }
    public static void main(String[] args) {
        Main m = new Main();
        m.test2();
        m.test1();
        TestInterFace.test();
    }
}

接口的作用:

1).完全解耦;

当一个方法操作的是一个类时,我们就必须使用这个类或者是他的子类,有了接口,就可以使方法操作接口,这样就可以传入人一个实现了这个接口的类,放宽了限制。
策略模式:使用一个基类或者接口作为方法的操作对象,然后可以使用其他不同的实现子类或者接口作为参数传入,不同的的参数子类或接口会使方法产生不同的行为方法,这种模式被称为策略模式;策略就是变化部分也就是传入的子类和接口。

现实中会有好多类是已经存在的,当我们需要一个方法接受一个我们自己定义的接口类型时,已存在的类无法修改,不能满足接口,无法传入,这时就需要使用适配器设计模式
适配器设计模式:可以自己设计一个适配的类,实现我们自己定义的接口,然后这个类接受一个实现接口B的类,在实现A接口的方法中调用实现B接口类的对应方法,这种方式称为代理,利用这种方式实现了适配转换。

// 已存在类的通用接口
interface B{
    void name();
    void f();
}

// 自己定义的接口
interface A{
    void name();
}
// 适配器类,传入实现接口B的类,转为实现接口A的类
class Adapter implements A{
    B b;
    public Adapter(B b){
        this.b = b;
    }
    void name(){
        b.name();
    }
}
2)、多重继承

java接口可以实现多重继承

3)、工厂方法

实现简单的创建对象并调用方法,主要常见于设计框架

// 类实现的接口
interface A{
    void method1();
}
// 工厂接口
interface AFactory{
    A getA();
}
// 接口的具体实现类
class ImpA implements A{
    public void method1(){}
}
// 具体实现的工厂类
class ImpAFactory implements AFactory{
    public getA(){
        return new ImpA();
    }
}
public class Main{
    // 这里调用接口的method1方法时,不需要创建具体类,只需要传入一个该接口的工厂方法
    public static void service(AFactory fact){
        A a = fact.getA();
        a.method1();
    }
    public static void main(String[] args){
        // 这里相当于使用框架的的用户,只需要知道执行的方法和需要传入的具体某个接口的工厂方法
        service(new ImpAFactory());
    } 
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值