Java学习_day08_finalnativeabstract接口

文章目录

  • final关键字
    • 注意
  • native关键字
  • abstract关键字
    • 抽象类
      • 定义
      • 继承
    • 接口
      • 定义
      • 实现

final关键字

final关键字表示常量,其值在程序运行期间不会改变。
final用来修饰变量,可以是静态变量,也可以是成员变量,也可以是局部变量,表示变量初始化之后不能被再赋值。
final用来修饰方法,表示该方法不允许子类重写。
final用来修饰类,表示该类不能被继承。

final class Father{
	final String TYPE = "父亲";
	final void info(){
		System.out.println(TYPE);
	}
}

注意

  • 常量用大写字母表示,多个单词时用_分隔
  • 常量在定义后需要手动初始化,初始化后不能对其再赋值。
  • 成员常量,可以在声明时,语句块,构造器等地方初始化。

native关键字

简单的理解native就是声明了一个非Java实现的方法,可以像其他方法一样被使用或重写。
native用来修饰方法,表示本地或原生的方法。
本地方法就是Java与外部环境交流的一种机制,它提供了一个非常简洁的接口,系统无须了解Java应用之外的繁琐细节,就能简单实现想要的功能。
本地方法的方法体由非Java语言实现,如C或C++。

public final native Class<?> getClass();
public native int hashCode();

abstract关键字

如果一个父类的某个方法,被每个子类都重写了,这样父类中就没有必要给出这个方法实质性的实现了。由此而衍生出abstract关键字,来修饰方法,表示声明了一个方法,类中没有方法体,需要子类重写该方法(方法的实现由子类设计).

[访问权限修饰符] abstract 返回值类型 方法名(参数列表) [throws 异常列表];
  • 由于abstract修饰的方法,需要在子类中重写,所以访问权限修饰符不能是static, final和private
  • 只能在抽象类和接口中声明抽象方法

抽象类

具有抽象方法的类被称为抽象类,抽象类不能直接创建实例对象抽象类的子类需要重写抽象方法
抽象类也具有构造器
抽象类不能用final修饰,否则无法被继承了。
当子类不是抽象类时,必须重写父类的抽象方法

定义

[权限修饰符] abstract class 类名{
}

继承

通过下面代码案例来理解抽象类的继承关系。

public class Test {
    public static void main(String[] args) {
        Graphic[] arr = new Graphic[2];
        arr[0] = new Rectangle(2,5);
        arr[1] = new Circle(4);
        for(int i = 0; i < arr.length; i++){
            System.out.println(arr[i].detail());
        }

    }
}

//  定义抽象类
abstract class Graphic{
    public abstract double area();
    public abstract String detail();
}
//  定义继承抽象类的非抽象子类
class Rectangle extends Graphic{
    private double length;
    private double width;
    public Rectangle(double length, double width){
        super();
        this.length = length;
        this.width = width;
    }
    public double getLength(){
        return length;
    }
    public double getWidth(){
        return width;
    }
    // 实现抽象方法
    public double area(){
        return length * width;
    }
    // 实现抽象方法
    public String detail(){
        return "长方形, 长: " + length + ", 宽: " + width;
    }
}

//  定义继承抽象类的非抽象子类
class Circle extends Graphic{
    private double radius;
    public Circle(double radius){
        super();
        this.radius = radius;
    }
    public double getRadius(){
        return radius;
    }
    // 实现抽象方法
    public double area(){
        return Math.PI * radius * radius;
    }
    // 实现抽象方法
    public String detail(){
        return "圆, 半径: " + radius;
    }
}

在这里插入图片描述

接口

接口可以认为是一种规范,用interface关键字声明。

  • 一个类可以实现多个接口
  • 类必须实现接口中所有的抽象方法
  • 接口可以包含静态常量,抽象方法,静态内部接口,静态方法(JDK8+),默认方法(JDK8+)
  • 不可直接实例化
  • 当父类和接口默认方法具有相同的方法签名时,类遵循父类优先原则
  • 当多个接口中具有相同方法签名的默认方法时,类必须重写这个默认方法
  • 接口也可以继承别的接口

定义

// 定义接口
[修饰符] interface 接口名{
	// 静态常量
	[public static final] 常量名 =;
	// 抽象方法
	[public abstract] 返回值类型 方法名(形参类型 形参);
	// 静态方法, 通过 接口.静态方法名调用
	[public] static 返回值类型 方法名(形参类型 形参){
		方法体;
	}
	// 默认方法, 通过 实现对象.默认方法名调用
	[public] default 返回值类型 方法名(形参类型 形参){
		方法体;
	}
}
// 实现接口
[修饰符] class 类名 [extends 父类] implements 接口1,接口2,...{
}

实现

public class Test {
    public static void main(String[] args) {
//        使用接口的静态方法
        MyInterface.info();
//        当接口默认方法和父类方法签名一致时
        MyInterface dog = new Dog();
        dog.getNum();
//        多态的实现
        dog.say();

    }
}

interface MyInterface{
//  静态常量
    int NUM = 1;
//  静态方法
    static void info(){
        System.out.println("接口的静态方法");
    }
//  默认方法
    default void getNum(){
        System.out.println("接口的常量" + NUM);
    }
//  抽象方法
    void say();
    void eat();
}

class Animal{
    public void eat(){
        System.out.println("动物在吃东西");
    }
    public void getNum(){
        System.out.println("父类的方法");
    }
}

class Dog extends Animal implements MyInterface{
    public void say(){
        System.out.println("汪汪汪");
    }
}

在这里插入图片描述

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

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

相关文章

5G-DFS最新动态-产品不在需要走FCC官方测试

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 最近&#xff0c;FCC公布了最新版本的PAG&#xff08;Product Acceptance Group&#xff09;清单&#xff0c;即388624 D02 Pre-Approval Guidance List v18r04。这个清单的主要改变是将带有雷达侦测功能的…

51单片机的篮球计分器液晶LCD1602显示( proteus仿真+程序+原理图+PCB+设计报告+讲解视频)

51单片机的篮球计分器液晶LCD1602显示 &#x1f4d1;1.主要功能&#xff1a;&#x1f4d1;讲解视频&#xff1a;&#x1f4d1;2.仿真&#x1f4d1;3. 程序代码&#x1f4d1;4. 原理图&#x1f4d1;5. PCB图&#x1f4d1;6. 设计报告&#x1f4d1;7. 设计资料内容清单&&…

jenkins2

构建docker镜像 jenkins插件管理安装&#xff1a;docker-build jenkins安装了docker 配置docke builder 添加 unix:///var/run/docker.sock rootubuntu20:~# usermod -G docker jenkins 测试失败 修改docker中service文件添加 -H tcp://0.0.0.0:2376 jenkins中系统管理…

了解高防服务器的工作原理

在当今互联网时代&#xff0c;网络安全问题日益突出&#xff0c;各种网络攻击层出不穷。为了保护企业的网络安全&#xff0c;高防服务器应运而生。那么&#xff0c;你是否了解高防服务器的工作原理呢?下面就让我们一起来探索一下。 高防服务器是一种能够有效抵御各种网络攻击的…

尚硅谷Docker基础篇和Dockerfile超详细整合笔记

Docker基础篇DockerFile Docker&#xff1a;您要如何确保应用能够在不同环境中运行和通过质量检测&#xff1f;并且在部署过程中不出现令人头疼的版本、配置问题&#xff0c;也无需重新编写代码和进行故障修复&#xff1f;而这个就是使用容器。Docker解决了运行环境和配置问题…

【Unity】简单案例脚本实现 | 鼠标观察/键盘控制移动飞行/行走/碰撞检测

《Unity5实战-使用C#和Unity开发多平台游戏》第二章-构建一个让你置身3D空间的演示 鼠标观察/键盘控制移动飞行/行走/碰撞检测 Unity版本&#xff1a;2019.4.23f1c1 注意脚本名称和组件添加&#xff0c;不在文章中一一强调场景模型都是在资源商店选择的免费下载&#xff08;选…

vue-router路由守卫进阶

vue-router路由守卫进阶 路由守卫&#xff0c;可以想象为古代御前侍卫&#xff0c;路由守卫&#xff0c;则是对路由进行权限控制 分类&#xff1a;全局守卫、独享守卫、组件内守卫 全局前置-路由守卫 作用&#xff1a;主要用来鉴权 用户点击导航区&#xff0c;随后引起路径的…

Flink ON Yarn 模式 --- per job mode 与application mode的区别

1、per job mode&#xff1a; 对于yarn-per-job模式调度的过程&#xff1a; 1、资源调度&#xff1a; 1、因为是yarn模式&#xff0c;所以客户端会向ResourceManager申请资源&#xff0c;申请容器负责来启动ApplicationManager 2、此时ResourceManager接受到客户端的请求&#…

文件上传 [GXYCTF2019]BabyUpload1

打开题目 传个是jpg文件后缀的一句话木马上去 代码如下 <script languagephp>eval($_POST[v]);</script> 发现上传成功 因此我们需要先上传 .htaccess 文件&#xff0c;然后再上传 2.jpg文件 .htaccess作用&#xff1a;文件将别的后缀名文件内容解析为php程序…

CSS特效001:鼠标放div上,实现旋转、放大、移动等效果

GPT能够很好的应用到我们的代码开发中&#xff0c;能够提高开发速度。你可以利用其代码&#xff0c;做出一定的更改&#xff0c;然后实现效能。 css实战中&#xff0c;经常会看到这样的场景&#xff0c;鼠标放到一个图片或者一个div块状时候&#xff0c;会出现旋转、放大、移动…

Linux 本地Yearning SQL审核平台远程访问

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

如何设值固定ip地址

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 如何设值固定ip地址 一、找到网络和Internet选项二、选择更改适配器选项2.双击&#xff0c;选择属性3.选择ipv4&#xff0c;点击属性4.选择使用下面的IP地 总结 一、找到网络…

阿里云99元服务器40G ESSD Entry云盘、2核2G3M带宽配置

阿里云99元服务器新老用户均可以买&#xff0c;你没看错&#xff0c;老用户可以买&#xff0c;活动页面 aliyunfuwuqi.com/go/aliyun 配置为云服务器ECS经济型e实例、2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;并且续费不涨价&#xff0c;原价99元即可续费&#xff0c…

基于轻量级卷积神经网络CNN开发构建打架斗殴识别分析系统

在很多公共场合中&#xff0c;因为一些不可控因素导致最终爆发打架斗殴或者大规则冲突事件的案例层出不穷&#xff0c;基于视频监控等技术手段智能自动化地识别出已有或者潜在的危险行为对于维护公共场合的安全稳定有着重要的意义。本文的核心目的就是想要基于CNN模型来尝试开发…

05-MySQL-进阶-存储引擎索引SQL优化

一、存储引擎 涉及资料 链接&#xff1a;https://pan.baidu.com/s/1M1oXN_pH3RGADx90ZFbfLQ?pwdCoke 提取码&#xff1a;Coke ①&#xff1a;MySQL体系结构 1.连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 T…

Linux - 实现一个简单的 shell

前言 之前我们对进程的替换&#xff0c;进程地址空间等等的概念进行了说明&#xff0c;本篇博客会基于这些知识点来 实现一个简单的 shell &#xff0c;如有疑问&#xff0c;可以参考下述博客&#xff1a;Linux - 进程程序替换 - C/C 如何实现与各个语言之间的相互调用 - 替换…

STM32两轮平衡小车原理详解(开源)

一、引言 关于STM32两轮平衡车的设计&#xff0c;我想在读者阅读本文之前应该已经有所了解&#xff0c;所以本文的重点是代码的分享和分析。至于具体的原理&#xff0c;我觉得读者不必阅读长篇大论的文章&#xff0c;只需按照本文分享的代码自己亲手制作一辆平衡车&#xff0c…

【STM32】STM32的Cube和HAL生态

1.单片机软件开发的时代变化 1.单片机的演进过程 (1)第1代&#xff1a;4004、8008、Zilog那个年代&#xff08;大约1980年代之前&#xff09; (2)第2代&#xff1a;51、PIC8/16、AVR那个年代&#xff08;大约2005年前&#xff09; (3)第3代&#xff1a;51、PIC32、Cortex-M0、…

QT事件循环和事件队列的理解

Qt的事件循环机制_qt事件循环流程-CSDN博客 QT-事件循环机制_qt线程事件循环-CSDN博客 一、事件处理流程如图所示&#xff1a; 1.QCoreApplication::postEvent(QObject *receiver,QEvent *event)&#xff1a; QCoreApplication::postEvent()函数用于将事件异步地发送到目标对…

机器学习 vs. 数值天气预报,AI 如何改变现有的天气预报模式

数值天气预报是天气预报的主流方法。它通过数值积分&#xff0c;对地球系统的状态进行逐网格的求解&#xff0c;是一个演绎推理的过程。 然而&#xff0c;随着天气预报分辨率不断升高&#xff0c;预报时间逐渐延长&#xff0c;NWP 模式所需要的算力迅速增加&#xff0c;限制了…