final / 抽象类与抽象方法 / 接口

1. final 关键字 

final:最终的

1.final可以用来修饰的结构:类,方法,变量

2.final用来修饰一个类:此类不能被其它类继承; 

        如 String类,System类,StringBuffer类

3.final用来修饰方法:该方法不能被重写 * 如 Object 类中的 getClass()

4.final用来修饰变量,此时的变量称为常量。

        final修饰属性,可以赋值的位置:显式初始化,代码块中初始化,构造器中初始化

        final修饰局部变量:

5.static final 可以修饰:属性(全局常量,接口中常用),方法

        static 修饰:属性,方法,代码块,内部类

        final 修饰:属性,方法

public class FianlTest {
    public static void main(String[] args) {
        Te03 t = new Te03();
        t.Show(10);
    }
}
class Te03{
    public void Show( final int a){//形参是一个常量
        System.out.println(a);
//        a = 20;不能再赋值
//        局部变量
       final int age = 100;
//       age += 10;报错

    }
}
 2. 抽象类与抽象方法

abstract 修饰类:抽象类

         1.此类不能实例化

         2.抽象类一定有构造器,虽不能实例化,但便于子类实例化时调用

         3.开发中,都会提供抽象类的子类,让子类对象实例化

abstract 修饰方法:抽象方法

        1.只有方法的声明,没有方法体;

        2.包含抽象方法的类,一定是抽象类;反之,抽象类中不一定含有抽象方法

        3.子类重写了父类所有的抽象方法后,此子类方可实例化,

                若没有重写所有抽象方法,此子类也必须是一个抽象类

public class AbstractClass {
    public static void main(String[] args) {
//    AbstractTest a = new AbstractTest();抽象类不能实例化,但是构造器还是必须存在,以便
        AbTest a = new AbTest();

    }
}

abstract class AbstractTest{//抽象类
    String name;
    int age;
    public AbstractTest(){};
    public AbstractTest(String name,int age){
        this.name = name;
        this.age = age;
    }
    public abstract void eat();//大括号也算方法体,后面加分号即可
//    {
//        System.out.println("吃饭饭");
//    }
    public void sleep(){
        System.out.println("睡觉觉");
    }
}


class AbTest extends AbstractTest{
    String gender;

//子类重写了父类所有的抽象方法后,此子类方可实例化
    @Override
    public void eat() {
    }
}
 3. 接口

一方面:C++ 支持多重继承,而 Java 支持单继承,有了接口,可以弥补单继承的缺点;

另一方面:有时必须从几个类中抽取一些共同的行为特征,而它们之间没有继承的关系;


/**
 * 接口:一种规范,主要功能是被实现类实现
 * 1.接口使用 interface 来定义
 * 2.Java中,接口和类是并列的两个结构
 * 3.定义接口以及接口的成员
 *  3.1 JDK7及以前,只能定义全局常量和抽象方法
 *          全局常量:public static final 可以省略
 *          抽象方法:public abstract 可以省略
 *  3.2 JDK8,除全局常量,抽象方法外,还可以定义静态方法,默认方法;
 *
 * 4.接口中不能定义构造器,因此接口不可以实例化
 *
 * 那么如何调用接口中的抽象方法呢,其与类产生关系:
 * 5.java中,接口通过类去实现
 *      若实现类覆盖了接口中的所有抽象方法,该实现类可以实例化;
 *      若没有全部覆盖,该实现类须为抽象类;
 * 6.Java 可以实现多个接口,弥补了 Java 单继承的局限性
 *      若需要继承,先继承,再实现
 * 7.接口与接口是继承关系,且多继承
 *      类与类是继承关系:单继承
 *      类与接口是实现关系:同时实现多个接口
 *
 *
 * 8.接口的具体使用:体现多态性
 *   接口:实际上可以看做一种规范
 *   开发中,体会面向接口编程;
 */
public class InterfaceTest {
    public static void main(String[] args) {
//        实现类覆盖了接口中的所有抽象方法,该实现类可以实例化;
        Test09 T = new Test09();
        T.eat();
    }
}
//接口1
interface Int{
    //全局变量
    public static final int age = 19;
    String name = "刘备备";
    //抽象方法
    public abstract void eat();
    void sleep();
    //接口中不能定义构造器
//    public Int(){}
}
interface Int02{
    String gender = "man";
    void study();
}

abstract class People{
    String name;
    public void run(){
        System.out.println("跑步");
    }
    public abstract void walk();

}

//类实现接口,要么重写接口中的所有抽象方法,要么将类声明为静态的
class Test09 extends People implements Int,Int02{
    // java 可以实现多个接口,弥补了 Java 单继承的局限性
    // 若需要继承,先继承,再实现
    public void eat(){
        System.out.println("还吃");
    }

    public void sleep(){
        System.out.println("睡不着");
    }

    @Override
    public void study() {

    }

    @Override
    public void walk() {

    }
}

interface A{
    void A01();
}

interface B{
    void A02();
}
//接口与接口是继承关系,且多继承
interface C extends A,B{
//不需要重写全部抽象类,因为接口也是抽象的(含有抽象方法)
}

 接口的具体使用:体现多态性

接口:实际上可以看做一种规范

        开发中,体会面向接口编程;

/**
 * 接口的多态性
 */
class UseTest{
    public static void main(String[] args) {
        Computer com = new Computer();
//        1.创建了接口的非匿名实现类的非匿名对象
        Flash flash = new Flash();//抽象方法随着类的加载而加载
        com.transform(flash);//体现了多态性:Usb是接口,没有构造器,不能实例化。Usb usb = new Flash;
//        2.创建了接口的非匿名实现类的匿名对象
        com.transform(new Printer());//new Printer() = new Printer
//        3.创建了接口的匿名实现类的非匿名对象

    }
}
class Computer{
    public void transform(Usb usb){
        usb.start();
        System.out.println("具体传输细节!");
        usb.stop();
    }
}
//接口:一种规范
interface Usb{
    void start();
    void stop();
}
//实现类:闪存
class Flash implements Usb{
    //重写接口的方法
    @Override
    public void start() {
        System.out.println("闪存读取内容");
    }

    @Override
    public void stop() {
        System.out.println("闪存读取结束");
    }
}
//实现类:打印机
class Printer implements Usb{
    //重写接口的方法
    @Override
    public void start() {
        System.out.println("打印机读取内容");
    }

    @Override
    public void stop() {
        System.out.println("打印机结束读取内容");
    }
}

JDK 8 :除定义全局常量,抽象方法外,

        还可以定义静态方法默认方法

        1.接口中定义的静态方法只能接口自己使用,无法继承给子类

        2.对象可以调用接口中的静态方法,若默认方法被子类重写,调用的是重写后的

        3.类优先原则: * 若子类(实现类)继承的父类/实现的接口中有同名同参的方法

                在子类不重写的情况下,默认调用的是父类中同名同参的方法

        4.倘若实现类只实现了多个接口,不存在继承,多个接口中有同名同参的默认方法

        那么在实现类没有重写此方法的情况下,会报错 * 这就需要在实现类中重写该默认方法

 总之,以上是极端情况。接口与父类的方法不要同名同参即可

/**
 * JDK8 :除定义全局常量,抽象方法外,
 *      还可以定义静态方法,默认方法
 *
 * 1.接口中定义的静态方法只能接口自己使用,无法继承给子类
 *
 * 2.对象可以调用接口中的静态方法,若默认方法被子类重写,调用的是重写后的
 *
 * 3.类优先原则:
 *      若子类(实现类)继承的父类/实现的接口中有同名同参的方法
 *      在子类不重写的情况下,默认调用的是父类中同名同参的方法
 *
 * 4.倘若实现类只实现了多个接口,不存在继承,多个接口中有同名同参的默认方法
 *      那么在实现类没有重写此方法的情况下,会报错
 *      这就需要在实现类中重写该默认方法
 */
public class NewCharacterInterface {
    public static void main(String[] args) {
        ShowImple s = new ShowImple();
//        接口中定义的静态方法只能接口自己使用,无法继承给子类
//        s.method1();报错
//        对象可以调用接口中的静态方法,若默认方法被子类重写,调用的是重写后的
        s.method2();//调用的是实现类重写的方法
        s.method3();//接口与父类的方法相同,调用父类的方法

    }
}


interface Show{
    //静态方法
    public static void method1(){
        System.out.println("这是静态方法");
    }
    //默认方法
    public default void method2(){
        System.out.println("这是默认方法");
    }
    public default void method3(){
        System.out.println("这是方法3");
    }
}

interface Show2{
    public default void method3(){
        System.out.println("这是Show2的默认方法method3");
    }
}

//实现类
class ShowImple extends Fu implements Show,Show2{
    public void method2(){
        System.out.println("被重写的方法method2");
    }

    @Override
    public void method3() {
        super.method3();//父类中的方法
        System.out.println("重写的方法3");//自己重写的方法
        Show.super.method3();//接口Show中同名同参的默认方法
        Show2.super.method3();//接口Show2中同名同参的默认方法
    }
}

class Fu{
    public void method3(){
        System.out.println("父类的方法");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!

项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! ​ 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…

9.编写负载均衡模块|编写judge功能|postman进行调试(C++)

编写负载均衡模块 代码整体结构 oj_control.hpp // code: #include... // input: "" void Judge(const std::string &number, const std::string in_json, std::string *out_json) {// 0. 根据题目编号,直接拿到对应的题目细节// 1. in_json进行反…

安装react报错

安装react报错 背景 执行命令npx create-react-app my-app,然后出现报错unable to resolve dependency tree 解决: 出现这个报错是因为依赖包版本出现冲突,查看package.json可以看到react版本是19.0.0,但是testing-library/rea…

CAD实现一键 面域转线(闭合多段线)——CAD c#二次开发

CAD中存在面域(region),当用系统自带命令是,生成的是断开的直线Line。 此插件可实现面域转为闭合的多段线(Polyline)。效果如下: 一次转600个图形 部分代码如下: public class 面…

快速理解Raft分布式共识算法

目录 拜占庭将军问题 Raft算法是干什么的? 一、领导选举(选老板) 二、日志复制(发通知) 三、安全性(防篡改) 🌰 举个真实例子 ✔️ Raft的优势 基础 状态机 节点类型 任期…

Python学习第十七天之PyTorch保姆级安装

PyTorch安装与部署 一、准备工作二、pytorch介绍三、CPU版本pytorch安装1. 创建虚拟环境2. 删除虚拟环境1. 通过环境名称删除2. 通过环境路径删除 3. 配置镜像源4. 安装pytorch1. 首先激活环境变量2. 进入pytorch官网,找到安装指令 5. 验证pytorch是否安装成功 四、…

Para-Lane: 首个真实世界多车道数据集,目的评估自动驾驶系统中的新型视角合成能力。

2025-02-22,阿里巴巴集团菜鸟自动驾驶实验室和百度研究院共同创建了一个名为 Para-Lane 的真实世界多车道数据集。该数据集目的评估自动驾驶系统中的新型视角合成(NVS)能力,通过提供大量真实世界的数据,弥补了现有合成…

Linux | Ubuntu 与 Windows 双系统安装 / 高频故障 / UEFI 安全引导禁用

注:本文为 “buntu 与 Windows 双系统及高频故障解决” 相关文章合辑。 英文引文,机翻未校。 How to install Ubuntu 20.04 and dual boot alongside Windows 10 如何将 Ubuntu 20.04 和双启动与 Windows 10 一起安装 Dave’s RoboShack Published in…

flutter 专题 八十二 Flutter路由框架Fluro简介

在Flutter应用开发过程中,除了使用Flutter官方提供的路由外,还可以使用一些第三方路由框架来实现页面管理和导航,如Fluro、Frouter等。 Fluro作为一款优秀的Flutter企业级路由框架,Fluro的使用比官方提供的路由框架要复杂一些&…

(十)趣学设计模式 之 外观模式!

目录 一、 啥是外观模式?二、 为什么要用外观模式?三、 外观模式的实现方式四、 外观模式的优缺点五、 外观模式的应用场景六、 总结 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支…

为AI聊天工具添加一个知识系统 之124 详细设计之65 人类文化和习俗,即文化上的差异-根本差异 之2

本文要点 要点 “取” 本身 是一个具有 主谓宾 三格的 多“格”词。 三“格”(主/谓/宾)分别是: 主取,取法(能取:两组分别 是 析取取“异”(三个“不同”)和合取取“同”&#xf…

AXI协议详解及FPGA仿真

AXI协议详解及FPGA仿真 1 摘要 AMBA AXI 协议是以高性能,高频系统设计为目标,提供了很多适合高速亚微型系统互连的特征。为相邻存储器连续进行数据传输提供的一种高频率,高带宽,低延迟的总线协议,是一种突发传输协议…

互联网怎样利用人性-思维导图-markdown

互联网怎样利用人性 傲慢 留言、点评饥饿营销、吵架营销 懒惰 一键下单、扫二维码默认登录、多平台同步单点登录SSO美女论坛、美女头像事业线开箱防御力破女性装饰 贪婪 团购、秒杀、抽奖免费试吃、下载存储空间、在家赚钱晒单返现 窥视 订阅、悄悄关注名人博客微博、惊人标题…

javascript-es6 (五)

内置构造函数 在 JavaScript 中 最主要 的数据类型有 6 种: 基本数据类型: 字符串、数值、布尔、undefined、null 引用类型: 对象 但是,我们会发现有些特殊情况: //普通字符串 const str peiqi console.log(str.length) //…

Hive从入门到运用

hive简介 hive的设计思想(本质是一个翻译器) 上传安装包 解压,查看 运行hive(一定要启动hadoop,是有依赖关系的。) 测试启动方法,和建表 文件创建很上传到hdfs,直接上传到hive表的目…

RK3588部署YOLOv8(1):YOLOv8和YOLOv8-pose转ONNX及Python后处理代码实现

前言 由于种种原因,原始的YOLOv8系列的模型,在RK3588上难以部署,在 .pt 转 .onnx 的时候需要去掉后处理层(主要是DFL层)。因此,模型的后处理需要自己来实现。 本文基于Rockship 官方给的源码(导…

Lua的table(表)

Lua表的基本概念 Lua中的表(table)是一种多功能数据结构,可以用作数组、字典、集合等。表是Lua中唯一的数据结构机制,其他数据结构如数组、列表、队列等都可以通过表来实现。 表的实现 Lua的表由两部分组成: 数组部分…

权限(1)

权限1 一、shell命令及运行原理二、linux中的用户1、身份切换 2、sudo :指令的短暂提权(输入用户自己的密码)3、权限理解4、拥有者,所属组,other5,文件属性6、修改权限(角色 / 属性)…

【实战】使用PCA可视化神经网络提取后的特征空间【附源码】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Lumoz Chain正式上线:AI 时代的新算力破局者

新的叙事和技术突破永远是推动行业前行的核心动力。当下,AI Agent无疑是最炙手可热的赛道之一。 当加密世界将目光投向AI领域时,大多数项目仍停留在以AI为工具或应用场景的层面,试图通过集成AI模型或优化链上功能来吸引用户。然而&#xff0c…