JAVA-static关键字 多态

2023-11-02

static

        Java中的static关键字主要用于内存管理。我们可以应用static关键字在变量、方法、块和嵌套类中。 static关键字属于类,而不是类的实例。

        被static修饰的数据在内存中只会存在一份数据。所以这个数据适合用来共享数据

什么意思呢?

共享数据是因为static修饰的变量在赋值后这个变量将会一直是你所赋的值,当你在需要创建多的对象的时候但又需要给属性赋一样的值,就需要用到static修饰变量

例如:

public class Test8 {
    public static void main(String[] args) {
        A a = new A();
        a.name="小黑";
        a.age=18;
        a.sex="男";
        a.show();

        A a1 = new A();
        a1.name="小白";
        a1.age=15;
        a.age=18;
        a1.show();
    }
}
class A{
    String name;
    int age;
    static String sex;
    public void show(){
        System.out.println(name+age+sex);
    }
}

在这段代码里,因为两个学生都是男性,所有属性值赋值是一样的,就不用重复赋值,给sex属性用static修饰,让它为静态变量。

static修饰变量

        被static修饰的变量称作静态变量或类变量;没有被static修饰的变量,称为实例变量。静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在类加载的过程中完成静态变量的内存分配(存储在“方法区”),可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,每创建一个类的实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。

        静态变量并不是所在类的某个具体对象所有,而是该类的所有对象所共有的,静态变量既能被对象调用,也能直接拿类来调用。所以一般在需要实现以下两个功能时使用静态变量:在多个对象之间共享时、方便访问变量时。

static修饰方法

        被static修饰的方法称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。静态方法一般用于工具类中,可以直接拿类名调用工具方法进行使用。

例如:

public class Test8 {
    public static void main(String[] args) {
        A.show();
    }
}
class A{
    static String name;
    static int age;
    static String sex;
    public static void show(){
        name="小黑";
        age=18;
        sex="男";
        System.out.println(name+age+sex);
    }
}

 注意:

  • 它们仅能调用其他的static 方法。
  • 它们只能访问static数据。
  • 它们不能以任何方式引用this或super。

多态

        所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

多态存在的三个条件:

  • 继承:必须有子类继承父类
  • 重写:子类需要对父类中的一些方法进行重写,然后调用方法时就会调用子类重写的方法而不是原本父类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。

举个例子:

public class Test {
    public static void main(String[] args) {
        Teacher j1 = new JavaTeacher();
        j1.giveLesson();
        j1.introduction();

        Teacher n1 = new NETTeacher();
        n1.giveLesson();
        n1.introduction();
    }
}
class Teacher {//教师类
    String name;//教员
    String area;//中心属性
    public void giveLesson(){

    }
    public void introduction(){
    }
}
class NETTeacher extends Teacher{
    public void giveLesson(){
        System.out.println("授课的步骤依次是:打开Visual Studio 2005、实施理论课授课");
    }
    public void introduction(){
        name="小白";
        area="武汉";
        System.out.println("姓名:"+name+"中心:"+area+"我是一名java讲师!");
    }
}
class JavaTeacher extends Teacher {
    public void giveLesson(){
        System.out.println("授课的步骤依次是:打开Eclipse、实施理论课授课");
    }
    public void introduction(){
        name="小黑";
        area="长沙";
        System.out.println("姓名:"+name+"中心:"+area+"我是一名.net讲师!");
    }
}

他们的引用变量不同,所调用的方法不同,输出结果不同,这就是多态。

那么多态有什么优点呢?

  • 1. 消除类型之间的耦合关系
  • 2. 可替换性
  • 3. 可扩充性
  • 4. 接口性
  • 5. 灵活性
  • 6. 简化性
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA-static关键字 多态 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • 在内存中使用 byte[] 创建 zip 文件。 Zip 文件总是损坏

    我创建的 zip 文件有问题 我正在使用 Java 7 我尝试从字节数组创建一个 zip 文件 其中包含两个或多个 Excel 文件 应用程序始终完成 没有任何异常 所以 我以为一切都好 当我尝试打开 zip 文件后 Windows 7 出
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 从最终实体获取根证书和中间证书

    作为密码学的菜鸟 我每天都会偶然发现一些简单的事情 今天只是那些日子之一 我想用 bouncy castle 库验证 java 中的 smime 消息 我想我几乎已经弄清楚了 但此时的问题是 PKIXparameters 对象的构建 假设我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 我如何在java中读取二进制数据文件

    因此 我正在为学校做一个项目 我需要读取二进制数据文件并使用它来生成角色的统计数据 例如力量和智慧 它的设置是让前 8 位组成一个统计数据 我想知道执行此操作的实际语法是什么 是不是就像读文本文件一样 这样 File file new Fi
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp
  • Spring Boot 无法更新 azure cosmos db(MongoDb) 上的分片集合

    我的数据库中存在一个集合 documentDev 其分片键为 dNumber 样本文件 id 12831221wadaee23 dNumber 115 processed false 如果我尝试使用以下命令通过任何查询工具更新此文档 db

随机推荐

  • Java基础笔记(初学者适用)

    目录 一 Java主函数解析 二 Java学习注意事项 三 JDK和JRE的区别 1 jdk 开发环境 核心 2 jre 运行环境 3 JVM 转换环境 四 常见转义字符 五 变量 1 变量介绍 2 变量细节 3 作用域 4 数据类型 1
  • 粤嵌实训(笔记)

    目录 1 LCD换自己喜欢的颜色 2 LCD换个图案 3 LCD换张图片 4 网线登录 ifconfig eth0 192 168 5 9 5 触屏电子相册 6 网络编程 TCP通信 7 网络编程 UDP通信 8 开发板串口通信MCU 32
  • 二叉树与二叉搜索树的理解

    树 tree 是一种抽象数据类型 ADT 用来模拟具有树状结构性质 它是由n n 0 个有限节点通过连接它们的边组成具有层次关系的集合 把它叫做树是因为它看起来像一棵倒挂的树 也就是说它是根朝上 而叶朝下的 树由多种 一个节点有两个以上子节
  • 快速训练ai作画模型的python代码

    感谢你的问题 如果你想快速训练一个 AI 作画模型 你可以使用开源的深度学习框架 例如 TensorFlow PyTorch 或 Keras 这里是一个基于 TensorFlow 的示例代码 它使用了一种叫做 CycleGAN 的生成对抗网
  • 使用 ESP-Prog / Jlink 进行 JTAG 调试时的常见错误及解决办法

    此篇博客用来记录使用 ESP PROG Jlink 来对 ESP32 Lyrat 进行 JTAG 调试时遇到的一些问题以及解决办法 如果对进行 JTAG 相关操作有疑惑 请参考以下资料 使用 ESP Prog 进行 JTAG 调试 使用 J
  • openmediavault配置文件共享

    OpenMediaVault是一个基于Debian的专用Linux发行版 用于构建网络连接存储 NAS 系统 它提供了一个易于使用的基于Web的界面 多语言支持 卷管理 监控和插件系统 以通过LDAP Bittorrent和iSCSI功能进
  • 多维时序

    多维时序 MATLAB实现RBF径向基神经网络多变量时间序列未来多步预测 目录 多维时序 MATLAB实现RBF径向基神经网络多变量时间序列未来多步预测 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基本介绍 MATLAB实现
  • 你会使用GROUP BY吗?

    职业开始前两年 发现面试特别喜欢问SQL的问题 觉得不够高大上 觉得没有框架什么的高大上 但是当你处理实际的业务问题 发现SQL是避免不了的 SQL可以帮你解决一些你在代码上处理逻辑很麻烦的地方 即时现在有mybatis插件 可以不用写SQ
  • Stable Diffusion下载完身体有点吃不消(内附秋叶集合安装包)

    大家好 今天我来介绍一款令人惊叹的开源软件 Stable Diffusion 这是一款基于AI技术的图片生成软件 可以让用户轻松随心所欲地创建出各种令人惊叹的图片 在这里插入图片描述 Stable Diffusion拥有强大的AI算法 不管
  • 一文看懂随机森林 - Random Forest(附 4 个构造步骤+10 个优缺点)

    本文首发自 产品经理的人工智能知识库 原文地址 一文看懂随机森林 Random Forest 附 4 个构造步骤 10 个优缺点 随机森林是一种由决策树构成的集成算法 他在很多情况下都能有不错的表现 本文将介绍随机森林的基本概念 4 个构造
  • 外包公司“混”了2年,我只认真做了5件事,如今顺利拿到阿里 Offer。

    前言 是的 我一家外包公司工作了整整两年时间 在入职这家公司前 也就是两年前 我就开始规划了我自己的人生 所以在两年时间里 我并未懈怠 现如今 我已经跳槽到了阿里 顺利拿下 offer 自己的情况很普通 本科文凭 没有背景 分享这次我的经历
  • gd32f103 adc通道说明

    file main c brief ADC Temperature Vrefint demo Copyright 2017 GigaDevice 2017 06 23 V1 0 0 demo for GD32F30x include gd3
  • 深入理解Netty底层基础、中断、NIO、epoll~~~~

    深入理解Netty底层基础 LInux 操作系统中断 什么是系统中断 这个没啥可说的 大家都知道 CPU 在执行任务途中接收到中断请求 需要保存现场后去处理中断请求 保存现场称为中断处理程序 处理中断请求也就是唤醒对应的任务进程来持有CPU
  • 嵌入式软件—视频笔试记录

    文章目录 一 前言 二 笔试题目 1 C语言中的三种循环以及区别 2 以下代码循环几次 3 形参与实参定义以及函数形参为指针和指针引用方式的区别 4 链表的概念 链表与数组的区别 5 3 5 1 2的结果 6 以下程序运行结果是什么 7 i
  • 详解BP神经网络

    BackPropagation Neuron NetWok BP神经网络学习算法可以说是目前最成功的神经网络学习算法 显示任务中使用神经网络时 大多数是使用BP算法进行训练 在我看来BP神经网络就是一个 万能的模型 误差修正函数 每次根据训
  • Pre-Trained Models: Past, Present and Future综述总结(1)

    总体介绍 非神经模型 手工制作的特征和统计方法hand crafted features and statistical methods 神经模型 从数据中自动学习低维连续向量 也称为分布式表示 作为任务特定的特征 关键挑战之一是数据匮乏
  • golang该如何循环 多层结构体

    一 首先贴代码 你们大概看看就行 在看看后面的前端页面展示数据 你们就能理解 结构体嵌套的案例 package model import fmt time type Find struct Article Article SelectArt
  • 线程进程协程的实现代码

    单线程 import time def run print hello world time sleep 1 if name main for i in range 5 run 多线程 import threading import tim
  • 规范:前端代码开发规范

    一 前端静态代码检查工具 1 1 ESLint ESLint 是一个插件化的 JavaScript 代码检查工具 可以使用规则插件或者自定义规则对代码进行静态检查 1 2 JSLint JSLint 是由 Douglas Crockford
  • JAVA-static关键字 多态

    static Java中的static关键字主要用于内存管理 我们可以应用static关键字在变量 方法 块和嵌套类中 static关键字属于类 而不是类的实例 被static修饰的数据在内存中只会存在一份数据 所以这个数据适合用来共享数据