抽象类、接口

抽象类、接口

方法重写和方法重载(常见面试笔试题)

方法重写

在继承结构下, 子类继承父类中的方法不满足业务需求, 子类需要重写该方法

重写满足的条件:

​ 1.子类方法名和父类方法名相同

​ 2.子类方法的参数与父类相同(个数, 顺序, 类型)

​ 3.子类方法返回值类型可以和父类相同, 也可以为父类方法返回值的子类

​ 4.子类访问权限修饰符可以和父类相同, 也可以比父类方法访问权限修饰符更大

方法重载

一个类中允许出现相同的方法名

满足重载的条件:

​ 1.方法参数不同, 个数不同, 类型不同, 顺序不同

​ 2.和访问权限修饰符, 返回值无关

​ 3.方法名相同

final修饰符/方法/变量

总结之前学过的修饰符:

权限修饰符

  • public
  • 默认
  • protect
  • private

static

final可以修饰局部变量,但是static相比而言只能修饰成员变量

被final修饰的变量称为——常量,

被final修饰的常量一般变量名全部大写

final 经常与 static 常用,习惯fianl 跟在static后面

  • final修饰的类无法被继承
  • final修饰的方法不允许被重写

在jdk中有很多类都是final修饰的比如: String、八大基本数据类型封装类等

修饰变量:被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值(与static修饰变量时类似)

final int MAX_SPEED = 120;

修饰方法:该方法不可以被子类重写。但是可以被继承

final void study(){}

修饰类:修饰的类不能被继承。比如:Math、String、System等。

final class A{}

特例:私有final方法

当父类中final修饰的方法的访问权限修饰符是private时,子类是不可以访问这个方法的,

所以也就不构成重写条件。

在该情况下子类中构建一个与父类相同的方法是允许的。

抽象 abstract

可以修饰 类 \ 方法,

抽象方法

public abstract String coding();

格式注意:

  1. abstract需要写在返回值类型前面,习惯写在权限修饰符后,当然写在其前面也可
  2. 由于抽象方法没有方法体,所以方法最后要用分号
  3. 抽象方法需要使用abstract关键字修饰,因为抽象方法表示需要被 子类重写的方法,所以不带方法体,因为即使是写了也没有意义。

抽象类

public abstract class Parent{
	public String name = "父类中属性";
    public String getName(){
        return "父类中的内容: " + name;
    }
    public abstract String coding();
}

抽象类本质为类,特殊的类,抽象类中可以有抽象方法

类中有的抽象类也有,抽象类中有的抽象方法,非抽象类没有

但是抽象类允许没有抽象方法

当子类继承了抽象类后必须重写其中的抽象方法,除非子类也是抽象类

注意:

  1. 有抽象方法的类只能定义为抽象类
  2. 抽象类不能被实例化,即不能用new来实例化抽象类,
  3. 抽象类可以有构造方法,创建子类对象的时候使用(子类构造方法第一行默认调用super() ,否则无法通过子类调用父类(抽象类)的属性及方法)
  4. 一个抽象类可以没有抽象方法
  5. 子类必须重写父类的抽象方法,或者子类也定义为抽象类
  6. 子类可以继承父类的已实现方法与属性
  7. 想要使用抽象类的非静态属性与方法需要将抽象类被实现,静态的属性与方法可以直接类名.属性调用

抽象类vs非抽象类

区别:

​ 抽象类不能被实例化。允许存在抽象方法。

​ 普通类能被实例化。不允许存在抽象方法

相同点:

​ 抽象类和普通类都允许存在普通方法。

​ 抽象类虽然不能被实例化,但是允许存在构造方法。

​ 抽象类和普通类可以有相同的属性

接口

  1. 接口可以看做一种极端的抽象类,它不允许有构造方法,不允许被实例化。

  2. 接口存在的意义就是制定规范。

  3. 由于java中继承是单继承的,接口为多继承,在某些方面可以弥补单继承的不足,

所以尽量多的使用接口

  1. 子类|实现类 实现 接口,子类要么实现接口中的抽象方法,要不子类为抽象类

  2. 接口与接口之间可以多继承,类也可以多实现接口

接口的语法

接口名的命名规范——与类名相同

接口的属性:

接口允许有公共、静态的常量属性&public与抽象的方法(可以有多个)

public static final 编译器会自动加上

接口的方法:

jdk8之前

公开 抽象的方法(jdk8之前接口中唯一可以有的方法——public abstract 编译器会自动添加

接口中无构造方法(名字带类的才有构造方法)

实现类要么实现接口中抽象方法,要么实现类为抽象类

jdk8之后

新添加了公开静态方法——接口名.静态方法名(static不可省略,public可以省略)

static 修饰的方法可以被继承但是不能被重写

新添加了 public default 方法,有方法体的实现但是不能直接调用,实现类接口后,方可凭借实现类调用(public可省略,default不能省略)

default 的增加是为了让接口中的某个方法不至于让所有的实现类都重写

jdk9之后

接口中可以定义private的非抽象方法,便于将多个方法中的冗余代码进行提取,并且不对外公开。减少代码冗余、也实现了代码隐藏

private void aa(){

}
private static void aaa(){

}
实现接口

现接口——implement

接口和抽象类

区别

接口:

  1. 实现类可以实现多个接口
  2. 接口中只能包含public static final属性公开静态常量
  3. 接口中只能有抽象方法,静态方法,default修饰的方法
  4. 接口不允许有构造方法
  5. 接口和接口之间可以实现多继承
  6. 不可以创建接口的对象

抽象类:

  1. 子类只能继承一个抽象类
  2. 抽象类可以包含任意类型属性
  3. 抽象类可以有普通方法,静态方法,抽象方法,但是不能有default修饰的方法
  4. 抽象类可以有构造方法
  5. 不可以创建对象
相同点
  1. 都可以有抽象方法
  2. 都不可以创建对象
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值