java面试基础 -- 普通类 抽象类 接口

news2024/12/23 18:08:02

目录

抽象类语法

抽象类特性 

普通类 & 抽象类

抽象类 & 接口

什么是接口

语法

接口方法

变量 

接口特性

抽象类&接口的区别 


抽象类语法

        在Java中,一个类如果被 abstract 修饰称为抽象类,抽象类中被 abstract 修饰的方法称为抽象方法,抽象方法不用 给出具体的实现体:\]

// 抽象类:被abstract修饰的类
public abstract class Shape {

    // 抽象方法:被abstract修饰的方法,没有方法体
    abstract public void draw();
    abstract void calcArea();

    // 抽象类也是类,也可以增加普通方法和属性
    public double getArea(){
        return area;
    }

    protected double area; // 面积
}

        抽象类也是类,内部可以包含普通方法和属性,甚至构造方法. 

抽象类特性 

①抽象类不能直接实例化对象

Shape shape = new Shape();

// 编译出错
Error:(30, 23) java: Shape是抽象的; 无法实例化

②抽象方法不能是 private 的

abstract class Shape {
    abstract private void draw();
}

// 编译出错
Error:(4, 27) java: 非法的修饰符组合: abstract和private

③抽象方法不能被final和static修饰,因为抽象方法要被子类重写

        我们知道被final修饰的方法不能被子类重写。通过在方法声明前加上final关键字,可以限制子类对该方法的修改和重写,保持方法的原始实现不受改变.

        被static修饰的方法一般被称为静态方法。静态方法可以通过类名和方法名直接引用,而不需要实例化一个对象。 静态方法属于类方法,可以在没有创建对象的情况下直接调用。静态方法在类加载时就已经存在,可以直接使用。与非静态方法不同,非静态方法需要实例化一个对象后才能调用.

        静态方法不具有多态性。子类可以继承父类中的静态方法,但是不能重写父类中的静态方法

public abstract class Shape {
    abstract final void methodA();
    abstract public static void methodB();
}

// 编译报错:
// Error:(20, 25) java: 非法的修饰符组合: abstract和final
// Error:(21, 33) java: 非法的修饰符组合: abstract和static

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

// 矩形类
public class Rect extends Shape {
    private double length;
    private double width;

    Rect(double length, double width){
        this.length = length;
        this.width = width;
    }

    public void draw(){
        System.out.println("矩形: length= "+length+" width= " + width);
    }

    public void calcArea(){
        area = length * width;
    }
}

// 圆类:
public class Circle extends Shape{
    private double r;
    final private static double PI = 3.14;

    public Circle(double r){
        this.r = r;
    }

    public void draw(){
        System.out.println("圆:r = "+r);
    }

    public void calcArea(){
        area = PI * r * r;
    }
}
// 三角形类:
public abstract class Triangle extends Shape {
    private double a;
    private double b;
    private double c;

    @Override
    public void draw() {
        System.out.println("三角形:a = "+a + " b = "+b+" c = "+c);
    }

    // 三角形:直角三角形、等腰三角形等,还可以继续细化
    //@Override
    //double calcArea(); // 编译失败:要么实现该抽象方法,要么将三角形设计为抽象类
}

普通类 & 抽象类

        在 Java 中,普通类和抽象类是两种不同的类类型。普通类是可以直接实例化的类,而抽象类则不能直接实例化。抽象类通常用于定义一些基本的行为和属性,而具体的实现则由其子类来完成。以下是普通类和抽象类的一些区别:

  1. 实例化:普通类可以直接实例化,而抽象类不能直接实例化。
  2. 方法:抽象类中既包含抽象方法又可以包含具体的方法,而普通类只能包含普通方法。
  3. 实现:普通类实现接口需要重写接口中的方法,而抽象类可以实现接口方法, 可以不需要重写接口中的方法。

下面是普通类的案例:

class Dog {
    public String name;
    public int age;
    public void action() {
        System.out.println("小狗汪汪汪!!");
    }
}

 下面是抽象类的案例:

interface haha {
    void functionInterface();
}
abstract class Animal implements haha{
    public String name;
    public int age;

    // 可以包含具体方法
    public static void function() {
        System.out.println("haha");
    }

    // 可以包含抽象方法
    public abstract void  abstractFuntion();
}

对于抽象类:

        抽象类是一种特殊的类,它可以包含抽象方法和具体方法。抽象方法是没有具体实现的方法,而具体方法是有具体实现的方法。抽象类的主要目的是为了提供一种设计机制,让子类能够只实现抽象方法而不需要实现具体方法。这样可以实现代码的重用和灵活性。

具体方法在抽象类中的存在有以下几个意义:

  1. 提供默认实现:具体方法可以在抽象类中提供默认的实现,这样子类就可以直接使用这个实现,避免了重复编写相同的代码。
  2. 完善抽象类的功能:具体方法可以在抽象类中实现一些通用的功能,为子类提供更完善的功能支持。
  3. 简化子类的实现:具体方法的存在可以减少子类的实现工作量,子类只需要实现抽象方法即可。

因此,抽象类里面包含具体方法的意义在于提供了默认实现、完善抽象类的功能和简化子类的实现。这样可以提高代码的可维护性和可扩展性

抽象类 & 接口

什么是接口

        在现实生活中,接口的例子比比皆是,比如:笔记本上的USB口,电源插座等:

        电脑的USB口上,可以插:U盘、鼠标、键盘...所有符合USB协议的设备 电源插座插孔上,可以插:电脑、电视机、电饭煲...所有符合规范的设备 通过上述例子可以看出:接口就是公共的行为规范标准,大家在实现时,只要符合规范标准,就可以通用。 在Java中,接口可以看成是:多个类的公共规范,是一种引用数据类型.

语法

        接口的定义格式与定义类的格式基本相同,将class关键字换成 interface 关键字,就定义了一个接口。 

接口方法

        接口的方法是默认public abstract的, 可以不用写, 接口的方法如果被static修饰, 就必须添加方法体, 例如:

 

public interface 接口名称{
// 抽象方法
    public abstract void method1(); // public abstract 是固定搭配,可以不写
    public void method2();
    abstract void method3();
    void method4();
// 注意:在接口中上述写法都是抽象方法,跟推荐方式4,代码更简洁
}

interface接口里面的方法是默认public abstract的:
灰色字体表名未被使用过.

 接口里面静态方法的使用:

public class Test2 {
    public static void main(String[] args) {
        testInterface.function2();
    }
}

interface testInterface {
    public  abstract void function1();
    public static void function2() {
        System.out.println("hello");
    }
}

变量 

        接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量 :

public interface USB {
    double brand = 3.0; // 默认被:final public static修饰
    void openDevice();
    void closeDevice();
}
public class TestUSB {
    public static void main(String[] args) {
        System.out.println(USB.brand); // 可以直接通过接口名访问,说明是静态的
    // 编译报错:Error:(12, 12) java: 无法为最终变量brand分配值
        USB.brand = 2.0; // 说明brand具有final属性
    }
}

接口特性

①接口类型是一种引用类型,但是不能直接new接口的对象

public class TestUSB {
    public static void main(String[] args) {
        USB usb = new USB();
    }
}
// Error:(10, 19) java: day20210915.USB是抽象的; 无法实例化

②接口中每一个方法都是public的抽象方法, 即接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)

public interface USB {
    // Error:(4, 18) java: 此处不允许使用修饰符private
    private void openDevice();
    void closeDevice();
}

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

public interface USB {
    void openDevice();
    // 编译失败:因为接口中的方式默认为抽象方法
// Error:(5, 23) java: 接口抽象方法不能带有主体
    void closeDevice(){
        System.out.println("关闭USB设备");
    }
}

④重写接口中方法时,不能使用默认的访问权限

public interface USB {
    void openDevice(); // 默认是public的
    void closeDevice(); // 默认是public的
}
public class Mouse implements USB {
    @Override
    void openDevice() {
        System.out.println("打开鼠标");
    }
    // ...
}
// 编译报错,重写USB中openDevice方法时,不能使用默认修饰符
// 正在尝试分配更低的访问权限; 以前为public

⑤接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量

⑥接口中不能有静态代码块和构造方法

⑦接口虽然不是类,但是接口编译完成后字节码文件的后缀格式也是.class

⑧如果类没有实现接口中的所有的抽象方法,则类必须设置为抽象类

⑨jdk8中:接口中还可以包含default方法。

抽象类&接口的区别 

在 Java 中,抽象类和接口是两种不同的类类型。它们都不能直接实例化,并且它们都是用来定义一些基本的属性和方法的,但它们有以下几点不同:

  1. 定义:定义的关键字不同,抽象类是 abstract,而接口是 interface。
  2. 方法:抽象类可以包含抽象方法和具体方法,而接口只能包含方法声明(抽象方法)。
  3. 方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。
  4. 实现:一个类只能继承一个抽象类,但可以实现多个接口。
  5. 变量:抽象类可以包含实例变量和静态变量,而接口只能包含常量。
  6. 构造函数:抽象类可以有构造函数,而接口不能有构造函数。

以下是一个抽象类和一个接口的示例代码:




 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/893889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python-03(入门基础篇3——字符串 的 基本常见语法 以及 format的用法)

python-03(入门基础篇3——字符串 的 基本常见语法 以及 format的用法) 1. 前言1.1 体验python入门1.2 官网参考 2. 字符串简单入门2.1 简单介绍2.2 拼接字符串()和 重复字符串(*)2.3 相邻字符串自动拼接2.…

凭空销毁千万,揭秘nd4.eth大佬背后的故事

文/章鱼哥 出品/陀螺财经 在加密社区,千万资产的销毁,就在弹指之间,好似一场行为艺术。 上周,nd4.eth域名的不明持有者在没有任何公开解释的前提下销毁了价值约800余万美元的加密货币和高价值蓝筹NFT,引起了看客们的关…

区块链中slot、epoch、以及在slot和epoch中的出块机制,分叉原理(自己备用)

以太坊2.0中有两个时间概念:时隙槽slot 和 时段(周期)epoch。其中一个slot为12秒,而每个 epoch 由 32 个 slots 组成,所以每个epoch共384秒,也就是 6.4 分钟。 对于每个epoch,使用RANDAO伪随机…

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测

时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 目录 时序预测 | MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SA-ELM模拟退火算法优化极限学习机时间序列预测 程序设计 完整…

windows上的docker自动化部署到服务器脚本

1、mvn install后,双击这个bat,实现docker build后上传到124服务器,并且重启124服务器 **echo offsetlocal:: 定义镜像名称和版本变量 set IMAGE_NAMEweb set IMAGE_VERSION1.3.1:: 清理本地文件 echo Cleaning up... del service-%IMAGE_N…

产品管理:理解、掌握要点

产品管理是什么? 产品管理是指通过使用各种方法和技术,有效地规划、组织、控制和监督整个产品生命周期的过程。它涉及到从产品的概念阶段开始一直到产品的上市和销售阶段的各个环节。在当今竞争激烈的市场中,一个成功的产品管理过程对企业的…

Vue学习笔记--004

Vue学习 一、scoped解决样式冲突 写在组件中的样式会 全局生效 → 因此很容易造成多个组件之间的样式冲突问题。 全局样式: 默认组件中的样式会作用到全局,任何一个组件中都会受到此样式的影响 局部样式: 可以给组件加上scoped 属性,可以 让样式只作用于当前组件 …

简单的洗牌算法

目录 前言 问题 代码展现及分析 poker类 game类 Text类 前言 洗牌算法为ArrayList具体使用的典例,可以很好的让我们快速熟系ArrayList的用法。如果你对ArrayList还不太了解除,推荐先看本博主的ArrayList的详解。 ArrayList的详解_WHabcwu的博客-CSD…

nn.embedding会被反向传播更新吗?

https://developer.aliyun.com/article/1191215 这样是不可更新,但被我注释掉了。

【C++ 学习 ⑭】- 详解 stack、queue 和 priority_queue 容器适配器

目录 一、详解 C STL 容器适配器 1.1 - 什么是容器适配器? 1.2 - 容器适配器的种类 二、详解 C STL deque 容器 2.1 - deque 的原理介绍 2.2 - deque 的优缺点 三、详解 stack 容器适配器 3.1 - stack 的基本介绍 3.2 - stack 的成员函数 3.3 - stack 的模…

live555在Windows WSL2中编译、运行,搭建RTSP流服务器

文章目录 1. 背景2. 实施步骤2.1 下载live555安装包2.2 解压压缩包2.3 编译源码2.3 安装ffmpeg2.4 安装opencv-python2.5 视频文件格式转换2.6 启动推流2.6 安装VLC,验证 3. 用opencv-python接口接收视频流参考 1. 背景 想要通过RTSP往opencv的接口中推流&#xff…

富文本中的参数如何设置大小?

富文本里如果直接显示的数据可以随意调节大小,颜色等格式. 但是如果数据是动态的参数 就无法随意设置参数的格式了.当字数过多时就会出现显示不全,有没有大佬知道如何解决? wangEditor set HTML

Flink 数据集成服务在小红书的降本增效实践

摘要:本文整理自实时引擎研发工程师袁奎,在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分: 小红书实时服务降本增效背景Flink 与在离线混部实践实践过程中遇到的问题及解决方案未来展望 点击查看原文视频 & 演…

【学习笔记之vue】These dependencies were not found:

These dependencies were not found:方案一 全部安装一遍 我们先浅试一个axios >> npm install axios 安装完报错就没有axios了,验证咱们的想法没有问题,实行! ok

chapter 3 Free electrons in solid - 3.2 量子自由电子理论对一些现象的解释

3.2 自由电子气的热容 Heat capacity of free electron gas 3.2.1 计算自由电子的热容 Calculation of Heat Capacity of free Electrons T>0K, total energy of free electrons: E ∫ E d N 3 5 N e E F 0 [ 1 5 12 π 2 ( k B T E F 0 ) 2 ] E \int EdN \frac{3}{5}…

Unable to find resource t64.exe in package pip._vendor.distlib报错问题解决

Unable to find resource t64.exe in package pip._vendor.distlib报错问题解决 问题报错具体内容具体解决方案解决方法一解决方法二 问题报错具体内容 想要对python的版本进行一个升级,使用如下语句 python -m pip install --upgrade pip出现如下报错 Unable to find reso…

四维轻云场景更新之后,如何快速搭建场景?

「四维轻云」是一款轻量化的地理空间数据管理云平台,支持地理空间数据的在线管理、编辑以及分享。平台提供了项目管理、数据上传、场景搭建、发布分享、素材库等功能模块,支持团队多用户在线协作管理。 四维轻云平台是以项目的形式进行数据管理&#xf…

vue2中常用的组件封装技巧

文章目录 vue组件封装技巧1.props参数2.$attrs3.$emit4.$listeners5.插槽 vue组件封装技巧 1.props参数 最简单父传子的技巧&#xff0c;在父组件传入值&#xff0c;子组件声明props接收就可以了 如下&#xff1a; 父组件&#xff1a; <template><div id"ap…

两图看懂什么叫回调函数,使用回调函数实现多态

#include <stdio.h> //任务函数可以增加&#xff0c;任务使用框架函数保持不变&#xff0c;根据传入函数指针的不同调用不同的任务函数&#xff0c;从而实现了多态 //编写任务函数&#xff0c;任务函数可以增加 int Myadd1(int a, int b) { return ab; } int Mymux2(i…

Git 设置代理

Git 传输分两种协议&#xff0c;SSH和 http(s)&#xff0c;设置代理也需要分两种。 http(s) 代理 Command Line 使用 命令行 模式&#xff0c;可以在Powershell中使用以下命令设置代理&#xff1a; $env:http_proxy"http://127.0.0.1:7890" $env:https_proxy&quo…