Java重修第五天—面向对象2

通过学习本篇文章可以掌握如下知识

  • static;
  • 设计单例;
  • 继承。

之前文章我们已经对面向对象进行了入门学习,这篇文章我们就开始深入了解面向对象设计。

static

我们定义了一个 Student类,增加姓名属性:name ;它的成员变量name是属于每个对象的,每个对象都会存一份该数据,如果我们创建一个成员变量xxx,该成员变量是所有对象共享的?应该怎么创建呢?

public class Student {
    String name;
}
​

static 就可以解决该问题。

static 修饰成员变量

成员变量按照有无static修饰,分为两种:

  1. 类变量:该成员变量属于类,类的全部对象或者实例都会共享
  2. 实例变量(对象变量)

类变量

定义student类,两个成员变量:age 和 static修饰name。下图很形象的说明了类变量和实例变量的区别。

用法

  • 类变量的访问通过类名.变量名。

  • 实例变量的访问对象.变量名

代码验证

public class FaceObject_05 {
    public static void main(String[] args) {
        // 推荐使用方式
        Student2.name = "张三";
​
        Student2 s1 = new Student2();
        // 不推荐用对象名访问类变量,这里只是为了说明类变量是共享的。
        System.out.println(s1.name);   // 张三
​
​
        Student2 s2 = new Student2();
        // 不推荐用对象名访问类变量,这里只是为了说明类变量是共享的。
        System.out.println(s2.name);   // 张三
​
​
        s2.name = "李四";
        System.out.println(s1.name);   // 李四
    }
}

static 执行原理

【第一步】执行类变量赋值操作,由于是类变量,因此需要将student类加载到方法区中。

【第二步】 将类变量加载到堆内存中,并且赋初值,然后代码调用为之赋值为"袁华"

【第三步】生成student 变量s1

【第四步】通过s1.name 修改类变量值,不推荐

总结:类变量属于类,与类一起加载,在内存中只保存一次。

注意,这里的一次是,该student类只能有一个static 修饰的name变量。

如果你定义了一个teacher类,它也可以有static修饰的name变量,这个是不冲突的。

static 修饰方法

类方法:有static修饰的成员方法,属于类

实例方法:没有static修饰的方法。

类方法

使用类名.方法调用(推荐)

使用对象名.方法调用(不推荐)

public class Student3 {
​
    public static void hello(){
        System.out.println("helloWorld");
    }
​
    public void hello2(){
        System.out.println("helloWorld222 java");
    }
}

类调用实例方法会报错

调用结果

成员方法的执行原理与,成员变量基本类似,这里就不再冗余陈述了。

总结

类方法可以直接访问类成员,不可以直接访问实例成员。

实例方法即可以直接访问类成员,也可以访问实例成员

实例方法可以出现this关键字,类方法不可以出现this关键字。

static应用—代码块

代码块是类的五大成分之一 (成员变量、构造器、方法、代码块、内部类)

代码块分为两种:

静态代码块

格式:static{}

特点:类加载时自动执行,类只会加载一次,因此静态代码块只会执行一次

作用:完成类的初始化,例如对类变量的初始化赋值。

验证

静态代码块只调用了一次。

number先于静态代码块执行

静态代码块先于number执行

因此他们的执行顺序是谁在前谁先执行。

实例代码块

格式:{}

特点:每次创建对象时候都会执行实例代码块,并且在构造器前执行

作用:用于完成对象属性的初始化。

注意与静态代码块的区别

单例模式

例如我们的任务管理器。就是单例模式的实现,我们只能打开一个任务管理器。确保一个类只有一个对象。

设计思路

  • 把类的构造器私有;

  • 定义一个类变量记住类的一个对象;

  • 定义一个类方法,返回对象;

根据上述设计思路设计单例模式

public class A {
    private static A a = new A();
​
​
    public A() {
    }
​
    public static A getA(){
        return a;
    }
}

验证,可以看出,生成了三个变量a1,a2,a3;但是它们的地址都是一样的。

这里没学会单例模式也是没事的,这里只是引入单例有一个印象就可以了,重点是深入学习static

继承

系统中定义了很多实体类,他们中有很多属性,行为存在重复代码,如何对代码进行优化降低冗余提高复用呢?

什么是继承呢?下图形象的说明了继承。

下面我们用代码介绍一些继承的两大特点。

public class A {
​
    public A() {
        System.out.println("A对象被初始化了");
    }
​
    public int i;
    public void  print1(){
        System.out.println("====print1====");
    }
​
    // 私有成员
​
    private int j;
    private void print2(){
        System.out.println("===print2===");
    }
}
public class B extends A{
    public void print3(){
        System.out.println(i);
        print1();
    }
}
1、子类继承父类的非私有成员变量,私有的却不行。可以看到报错了。 

2、子类的对象由父类和子类一起完成。可以看到虽然没有创建A对象,但是在创建B对象时候却调用了A类的构造器。 
​

继承的执行原理

【第一步】创建对象b,首先需要将B类加入到方法区,然后B继承A也需要将A类载入方法区。

【第二步】完成b对象创建

权限修饰符

private,public,protected,default(缺省)

他们的各自作用和能够被访问的范围

 

这个很容易验证就不用代码验证了。

继承中的方法重写

【第一步】定义类A,类B和测试类,在类A中定义两个简单方法,类B 继承A。

然后再测试类中创建变量b,由于B继承A,因此b可以直接调用A中的方法,

【第二步】在B中创建和A相同的方法,然后再次执行程序,结果是调用B中的方法。这就是方法重写。为了更容易区分,应该在方法上加一个@override注解。

具体来讲

  • 当子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写

  • 注意:重写后,方法的访问,Java会遵循就近原则。

  • 重写后一般使用override注解进行声明

  • 子类重写父类方法时,访问权限必须大于等于原函数

  • 重写方法返回值类型,必须于重写方法的返回值类型一样,或者更小

  • 私有方法,静态方法不能重写。

总结

 

子类构造器的特点

子类的全部构造器,都会调用父类的构造器,然后再调用自己的。

声明父类F,子类Z

class F{
    public F(){
        System.out.println("===父类的F 无参构造器===");
    }
}
​
class Z extends F{
    public Z(){
        System.out.println("===子类的Z 无参构造器===");
    }
​
    public Z(String name) {
        System.out.println("===子类的Z 有参构造器==="+ name);
    }
}
​
public class Test {
    public static void main(String[] args) {
        Z z = new Z();
        Z z2 = new Z("zzz");
    }
}
​

测试结果

这是因为在子类构造器中都有一个隐藏代码

super();

 

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

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

相关文章

Spring Task 任务调度工具

大家好我是苏麟 , 今天聊聊Spring Task 任务调度工具 Spring Task Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。 定位:定时任务框架 作用:定时自动执行某段Java代码 什么是定时任务 ? 通过时…

009-Zynq基操之如何去玩转PL向PS的中断(对新手友好,走过路过千万不要错过)

文章目录 前言一、PL-PS的中断是啥?二、PL-PS端中断详细步骤1.ZYNQ核配置2.PS端中断函数配置3.需要拓展多个中断函数 总结 前言 本设计跟我的ZYNQ实战合集专栏中的脉冲触发电路有关系,也正好趁这个机会讲述一下PL-PS的中断系统,如何去触发中…

为什么不直接public,多此一举用get、set,一文给你说明白

文章目录 1. 封装性(Encapsulation)2. 验证与逻辑处理3. 计算属性(Computed Properties)4. **跟踪变化(Change Tracking)5. 懒加载与延迟初始化(Lazy Initialization)6. 兼容性与未来…

【Leetcode】2182. 构造限制重复的字符串

文章目录 题目思路代码 题目 2182. 构造限制重复的字符串 问题:给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全…

高效便捷的远程管理利器——Royal TSX for Mac软件介绍

Royal TSX for Mac是一款功能强大、操作便捷的远程管理软件。无论是远程桌面、SSH、VNC、Telnet还是FTP,用户都可以通过Royal TSX轻松地远程连接和管理各种服务器、计算机和网络设备。 Royal TSX for Mac提供了直观的界面和丰富的功能,让用户能够快速便…

新版云进销存ERP销售库存仓库员工管理系统源码

新版云进销存ERP销售库存仓库员工管理系统源码 系统介绍:2022版本,带合同报价单打印,修复子账号不显示新加客户的BUG,还有其他方面的优化。 简单方便。 功能强大,系统采用phpMYSQL开发,B/S架构,方便随地使用…

红队打靶练习:HOLYNIX: V1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto whatweb 目录探测 1、gobuster 2、dirsearch 3、dirb 4、feroxbuster WEB sqlmap 1、爆库 2、爆表 3、爆列 4、爆字段 后台登录 1、文件上传 2、文件包含 3、越权漏洞 反弹shell 提权 总结 信息…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security,使用其默认生效的 HTTP 基本认证保护 URL 资源,下面使用表单认证来保护 URL 资源。 一、默认表单认证: 代码改动:自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

最新AI绘画Midjourney绘画提示词Prompt大全

一、Midjourney绘画工具 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭…

国内开源环境漫谈

我国开源软件产业相较于欧美发达国家而言起步相对较晚,开源项目很少超过五年,开发者较年轻。国外很多开源项目都是10年以上的规划与投入。在开源社区发展初期、发展期、协作期、结晶期与流行期的五个阶段中,中国的开源社区平台大多处于前三个…

imgaug库指南(14):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

【服务器数据恢复】服务器硬盘磁头损坏的数据恢复案例

服务器硬盘故障: 一台服务器上raid阵列上有两块硬盘出现故障,用户方已经将故障硬盘送到其他机构检测过,其中一块硬盘已经开盘,检测结果是盘片损伤严重;另一块硬盘尚未开盘,初步判断也存在硬件故障&#xff…

代码随想录 Leetcode160. 相交链表

题目: 代码(首刷看解析 2024年1月13日): class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {ListNode *A headA, *B headB;while (A ! B) {A A ! nullptr ? A->next : headB;B B ! nullpt…

Legion R7000 2021(82JW)原装出厂Win10/WIN11系统预装OEM系统镜像

LENOVO联想拯救者R7000 2021款(82JW)笔记本电脑原厂Windows10/11系统 链接:https://pan.baidu.com/s/1m_Ql5qu6tnw62PbpvXB0hQ?pwd6ek4 提取码:6ek4 原装出厂系统自带所有驱动、出厂主题壁纸、系统属性专属联机支持标志、系统属性专属联想的LOGO标…

金蝶云星空和吉客云单据接口对接

金蝶云星空和吉客云单据接口对接 对接系统:吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求,重新定位、全新设计推出的换代产品,从业务数字化和组织数字化两个方向出发,以构建流程的闭环为依归…

阿里云服务部署docker容器

1.1 为什么要用docker 问题 开发、测试、生产环境不统一,造成项目测试、部署时产生问题 解决方案 使用容器化技术,将环境和项目一起发送给测试、部署人员,测试人数和运维人员直接使用发过 来的环境和项目进行操作,避免环境不统一…

详解Skywalking 服务Overview页面的参数含义(适合小白)

本文针对刚刚接触skywalking的同学,重点讲解服务Overview页面中各个参数的含义,为大家快速上手skywalking会起到帮助作用! 最重要的三个指标 Service Apdex(数字):当前服务的评分 Successful Rate(数字&a…

分布式系统架构设计之分布式消息队列的实际应用场景分析以及未来展望

一、分布式消息队列的实际应用场景 随着企业业务的不断发展和数据量的持续增长,分布式消息队列已经成为了许多系统中不可或缺的一部分。它提供了异步通信、流量削峰、数据缓冲等功能,为构建高并发、高可用、可扩展的系统提供了有力的支持。本部分会通过…

列表解析与快速排序

排序是在对文本、数值等数据进行操作时常用的功能,本文介绍两种常用的排序方式,借此学习列表解析,并巩固递归算法。 1 选择排序 说到排序,以数值为例,肯定涉及到值大小的对比,选择排序即通过依次在子集中…

win11下载Hbuliderx 安装闪退解决教程+安装包分享

在官网下载 目录 在官网下载 出现闪退 下载失败 2.2. 最终在百度网盘里下载了历史版本 2.3. 然后解压文件 2.4. 双击打开 2.5. 安装成功 出现闪退 下载失败 结果下载失败,一下子弹出的下载框就会闪退 2.2. 最终在百度网盘里下载了历史版本 下载的网盘链接: …