抽象类与接口

抽象类

​ 抽象类中是有构造方法的(抽象类不可以实例化,但是却存在构造方法)。抽象类的构造方法是用来被子类调用的,抽象类中的私有普通方法想要调用,只能通过在抽象类中的构造方法中调用,然后在子类中的构造方法调用父类的构造方法完成。

//最大的银行卡账户父类
public abstract class User {

    private String name;
    private double balance;
    private  String bankType;
    //这里有bankType,在父类中无法确定
    public User(String name,String bankType)
    {
        balance=0;
        this.name=name;
        this.bankType=bankType;
    }
    public User(String name) {
        this.name = name;
        this.balance = 0;
    }
}
//招商银行
public class UserMer extends User{

    private static final String BANK_TYPE="招商银行";
    //父类中没有子类的bankType信息,需要通过父类的super()方法传递
    //如果不这样的话,在多态的情形下,要用父类的变量去获取子类的信息,
    //即通过user.getBankType()是无法获取到的,会为空,除非在子类中对getBankType()重写。
    public UserMer(String name) {
        super(name,BANK_TYPE);
    }
}

​ 父类中没有子类的bankType信息,需要通过父类的super()方法传递,如果不这样的话,在多态的情形下,要用父类的变量去获取子类的信息,即通过user.getBankType()是无法获取到的,会为空,除非在子类中getBankType()重写。

常量声明

常量是程序运行过程中不可以发生改变的量,对于那些无论创建多少次对象,值都不能改变的数据定义为常量。

public static final 属性类型 常量名称(所有名字大写)

public static final double PI=3.1415;
public static final Object OBJECT_TEST=new Object();

static修饰:成为类级别,如果不加static,每次在实例化对象的时候都会重新开辟一个空间,但值却都相同,所以加个static随着类加载,只加载一次,避免多次开辟空间,浪费资源。

final修饰:是因为不希望在程序运行时,该量的值还能发生改变,final表示最终的。

接口

​ 接口是一种规范,以后在进行程序设计的时候,都是基于接口进行开发,因为在声明方法的时候,我们需要这个方法存在多变性,而且可以随着业务的改变,针对这个接口做具体的实现。

接口的定义:

​ 1、接口其实就是一个特殊的抽象类,接口中只能有抽象方法
​ 2、通过interface关键字来定义接口
​ 3、接口也是一种引用数据类型,在类加载的时候回生成字节码文件
​ 4、接口中的成员:抽象方法、常量。public final static 可以省略
​ 5、由于接口中所有方法都是抽象的,所以关键字public和abstract可以省略掉
​ 6、在接口中,是允许有多继承的
​ 7、接口不能实例化对象,它的作用是用来被子类实现的 implements
​ 8、接口中定义的抽象方法,在子类实现之后一定要进行重写
​ 9、接口和抽象类都可以作为一个方法的返回值和参数,比如当返回值为接口的时候,返回值必须是一个接口的实例,即它的实现类。

接口在开发中的作用:

​ 设计模式中提到在设计程序时,我们要面向接口开发,接口+多态 可以实现程序的可扩展性、灵活性

访问权限修饰符:

  • public 公共的 可以在工程的任意位置对元素进行访问
  • private 私有的 只能在本类访问
  • 默认的 在本包或者是子包才能访问到(子类不同包不能访问)
  • protected 受保护的 在本包或者是子包才能访问(子类不同包可以访问)![访问权限修饰符]

匿名内部类:

创建一个父类或者接口所对应的匿名对象,不仅只是在接口中可以实现匿名内部类

MyInterface myInterface1=new MyInterfaceImpl();//创建了一个子类实现的对象

//创建了一个匿名的对象 代码层面虽然new MyInterface() 但是接口仍然是不能实例化的 相当于创建了一个匿名对象
MyInterface myInterface=new MyInterface() {
    @Override
    public double getSum(double n1, double n2) {
        return n1+n2;
    }
};
System.out.println(myInterface.getSum(200,100));

类与类,类与接口以及接口与接口之间的关系

  • 类与类
    继承关系,只能单继承,但是可以多层继承

  • 类与接口
    实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口

  • 接口与接口

    继承关系,可以单继承,也可以多继承

接口与抽象类的区别:

​ 接口是一种特殊的抽象类
不同点:

  • 接口没有构造方法,抽象类有构造方法
  • 接口的成员变量只能是常量,抽象类的成员变量没有限制
  • 接口里的方法只能是抽象方法,抽象类里的方法可以是普通方法也可以是抽象方法
  • 接口中允许多继承,抽象类不能多继承

相同点:

  • 都不能实例化对象
  • 其抽象方法在继承或者实现后都必须重写
posted @ 2021-07-21 18:57  ins1mnia  阅读(51)  评论(0编辑  收藏  举报