Java—抽象类和接口,金三银四Java面试的一些感受

本文详细介绍了Java中的抽象类和接口,包括抽象类的定义、抽象方法的使用、继承要求、接口的特点(如方法的抽象性、默认方法、常量等)、接口的实现以及多接口的使用。通过实例展示了如何在类中正确地运用这些概念,强调了多态和接口在面向对象编程中的重要性。

4.抽象类必须被继承

且继承后子类要重写父类中的抽象方法,否则子类也是抽象类,就要使用 abstract修饰

abstract class Shape2{

//如果一个方法没有具体实现,那么这个方法可以是一个抽象方法

public abstract void draw();

//一个方法是抽象方法,那么存放它的类一定要声明成 抽象类

}

class Cycle extends Shape2{

@Override

public void draw() {

   System.out.println("画一个⚪");

}

}

//如果一个类继承了抽象类,那么该类一定要实现抽象类里的方法

class Triangle extends Shape2{

@Override

public void draw() {

   System.out.println("画一个▲");

}

}

class Flower extends Shape2{

@Override

public void draw() {

   System.out.println("画一个❀");

}

}

作用


抽象类存在最大的意义:就是为了被继承

抽象类本身不能被实例化,要想使用,必须创建该抽象类的子类,然后让子类重写抽象类中的抽象方法

抽象类总结:


  1. 抽象类不可以被实例化,即 不能:Shape2 shape = new Shape();

  2. 类内的数据成员和普通类没有区别,即:抽象类内部可以包含普通方法和属性,甚至构造方法

唯一的就是其成员不能被实例化

  1. 抽象类生来就是被继承的

  2. 若一个类继承了抽象类,那么该类必须重写抽象类当中的抽象方法

  3. 抽象类 / 抽象方法一定不能被 final 修饰

  4. 一个方法是抽象方法,那么存放它的类一定要声明成 抽象类

抽象类中不一定包含抽象方法,但是有抽象方法的类一定是抽象类

  1. 当抽象类A 继承抽象类B,A可以不重写B的方法,但一旦A再被继承,那么一定还要重写抽象方法

  2. 抽象方法一定不能被 final 和 static 修饰

接口

=============================================================

概念


在现实生活中,接口的例子很多,比如电脑的USB接口,电源插座…

在这里插入图片描述

电脑的USB口上,可以插:U盘、鼠标、键盘…所有符合USB协议的设备

电源插座插孔上,可以插:电脑、电视机、电饭煲…所有符合规范的设备

通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型

接口是抽象类的更进一步,抽象类中还可以包含非抽象方法,和字段,而接口中包含的方法都是抽象方法,字段只能包含静态常量

接口特性


1.接口当中的方法,都是抽象方法

2.接口中可以有具体实现的方法,需要用default修饰,JDK1.8 加入的

.在这里插入图片描述

在这里插入图片描述

3.接口中定义的成员变量,默认是常量

.

在这里插入图片描述

在这里插入图片描述

4.接口是不可以用来实例化的

.

在这里插入图片描述

5.接口和类的关系:implements

一旦一个类实现了接口,那么一定要重写接口当中的方法

.在这里插入图片描述

6.可解决Java单继承问题

.

在这里插入图片描述

7.可发生向上转型

.

前提是:把一个对象赋值给接口类型之前,一定要保证这个类实现了这个接口

例如下边代码:Cycle实现了Shape,故可以发生向上转型

.

接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

.在这里插入图片描述

注意事项:


  • 使用 interface 定义一个接口

  • 接口中的方法一定是抽象方法,故 abstract 可以省略

接口中的方法一定格式 public,故 public 可以省略

  • 类使用 implements 继承接口,此处的含义是"实现"

  • 接口不能被实例化

  • 只要这个类实现了该接口,那么就可发生向上转型

  • 一旦一个类实现了接口,那么一定要重写接口当中的方法

接口中的方法是不能在接口中实现的,只能由实现接口的类来实现

实现多个接口


有时,我们需要一个类同时继承多个父类,在有些编程语言中可通过多继承方式来实现,但Java中,只支持"单继承",一个类只能 extends 一个父类,但可同时实现多个接口,也能达到类似多继承的效果

Java 面向对象编程中最常见的用法:一个类继承一个父类,同时实现多种接口

代码理解:

class Animal{

protected String name;

//提供构造方法

public Animal(String name){

this.name = name;

}

}

//定义接口

interface IFlying{

void fly();

}

interface IRunning{

void run();

}

interface ISwimming{

void swim();

}

//猫

// 先 extends 后 implements

class Cat extends Animal implements IRunning {

public Cat(String name) {

super(name);

}

@Override

public void run() {

System.out.println(this.name + “正在用四条腿跑”);

}

}

//鱼

class Fish extends Animal implements ISwimming {

public Fish(String name) {

super(name);

}

@Override

public void swim() {

System.out.println(this.name + “正在用尾巴游泳”);

}

}

//青蛙

class Frog extends Animal implements IRunning, ISwimming {

public Frog(String name) {

super(name);

}

@Override

public void run() {

System.out.println(this.name + “正在往前跳”);

}

@Override

public void swim() {

System.out.println(this.name + “正在蹬腿游泳”);

}

}

//鸭子

class Duck extends Animal implements IRunning, ISwimming,IFlying{

public Duck(String name){

super(name);

}

@Override

public void fly() {

System.out.println(this.name + “正在飞飞飞”);

}

@Override

public void run() {

System.out.println(this.name + “正在跑啊跑”);

}

@Override

public void swim() {

System.out.println(this.name + “正在游啊泳”);

}

}

猫🐱:具有跑能力

鱼🐟:具有游泳能力

青蛙🐸:具有跑、游泳能力

鸭子🦆:具有飞、跑、游泳能力

.

可见,把 run,swim,fly 写在Animal里是不合适的,因为不是每一种动物都具备这些能力

接口主要是对方法的一个抽象,使人时刻牢记多态的好处,让程序猿忘记类型,有了接口之后, 类的使用者就不必关注具体类型,而只关注某个类是否具备某种能力

再看一个例子:

//机器人

class Robot implements IRunning{

@Override

public void run() {

System.out.println(“我是机器人,看谁跑得快!”);

}

}

public class InterfaceDemo2 {

public static void walk(IRunning running) {

System.out.println(“dudududdududu”);

running.run();

}

public static void main(String[] args) {

IRunning iRunning = new Robot();

//iRunning.run();

walk(iRunning);

}

}

输出结果:

在这里插入图片描述

在上述 walk 方法内部,我们并不关注到底是哪种动物,只要参数是会跑的就可以,甚至参数可以不是 “动物”,只要会跑即可

接口使用实例


给一个数组排序,直接使用Array.sort即可

public static void main(String[] args) {

int[] array = {8,6,2,3,4};

Arrays.sort(array);

System.out.println(Arrays.toString(array));

}

假设给定一个学生类 Student

class Student {

public String name;

public int age;

public int score;

public Student(String name,int age,int score){

this.name = name;

this.age = age;

this.score = score;

}

@Override

public String toString() {

return “Student{” +

“name='” + name + ‘’’ +

“, age=” + age +

“, score=” + score +‘}’;

}

}

再创建一个学生数组,对这个数组中的元素进行排序

public static void main(String[] args) {

Student student1 = new Student(“花”,18,100);

Student student2 = new Student(“A”,20,95);

Student student3 = new Student(“B”,23,88);

Student[] students = new Student[3];

students[0] = student1;

students[1] = student2;

students[2] = student3;

Arrays.sort(students);

System.out.println(Arrays.toString(students));

}

思考:如果使用 Array.sort 方法能否成功对 student 数组排序?

显然,是不可以的 ,类型转换异常

在这里插入图片描述

普通数组,是可以使用 sort 方法进行比较数组成员的,但上述比较的是两个学生对象,就不能直接进行比较了,需要我们实现 Comparable 接口,并实现其中的 compareTo 方法

鼠标放在 implements 后按 Alt + Enter

在这里插入图片描述

选择 Implement methods

在这里插入图片描述

选定之后,会出现如下代码,只需自己重新实现即可

在这里插入图片描述

以年龄比较为例:

class Student implements Comparable {

public String name;

public int age;

public int score;

public Student(String name,int age,int score){

this.name = name;

this.age = age;

this.score = score;

}

@Override

public int compareTo(Student o) {

if (this.age > o.age){

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**
[外链图片转存中…(img-jcDYyKAU-1711051497191)]
[外链图片转存中…(img-O5uUQTP1-1711051497192)]
[外链图片转存中…(img-CWUbv7Ok-1711051497193)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-IMAGp9nl-1711051497193)]

总结

至此,文章终于到了尾声。总结一下,我们谈论了简历制作过程中需要注意的以下三个部分,并分别给出了一些建议:

  1. 技术能力:先写岗位所需能力,再写加分能力,不要写无关能力;
  2. 项目经历:只写明星项目,描述遵循 STAR 法则;
  3. 简历印象:简历遵循三大原则:清晰,简短,必要,要有的放矢,不要海投;

以及最后为大家准备的福利时间:简历模板+Java面试题+热门技术系列教程视频

[外链图片转存中…(img-hF3HWSyJ-1711051497194)]

[外链图片转存中…(img-7V6Q8ENJ-1711051497194)]

[外链图片转存中…(img-BK8HNJCn-1711051497194)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值